您的位置:首页 > 数据库 > Redis

Redis修改数据多线程并发—Redis并发锁

2016-07-27 22:16 369 查看
转载爬虫请注明地址,博客园蜗牛 /article/11924278.html

先配上一个简易的RedisHelper,一个set值,一个get值,一个设置并发锁,以便在我后面的操作中,你能清楚我究竟做了什么。

static void Main(string[] args)
{
RedisHelper rds = new RedisHelper();
rds.Set<int>("mykey1", 0);
Thread myThread1 = new Thread(AddVal);
Thread myThread2 = new Thread(AddVal);
myThread1.Start();
myThread2.Start();
Console.WriteLine("等待两个线程结束");
Console.ReadKey();
}

public static void AddVal()
{
RedisHelper rds = new RedisHelper();
for (int i = 0; i < 50000; i++)
{
using (rds.Setnx("lock"))
{
int result = rds.Get<int>("mykey1");
rds.Set<int>("mykey1", result + 1);
}
}
Console.WriteLine("线程结束,输出" + rds.Get<int>("mykey1"));
}


View Code
可以看到我使用了using,调用我的Setnx方法获取锁。



输出结果最后是100000,正是我们要的正确结果。前面的8W+是因为两个线程之一先执行结束了。

还有,在正式使用的过程中,建议给我们的锁,使用后删除掉,并加上一个过期时间,使用expire。

以免程序执行期间意外退出,导致锁一直存在,今后可能无法更新或者获取此被锁住的数据。

你也可以尝试一下不设置expire,在程序刚开始执行时,关闭console,重新运行程序,并且在redis-cli的操作控制台,get你锁住的值,将会永远获取不到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: