Redis修改数据多线程并发—Redis并发锁
2016-07-27 22:16
369 查看
转载爬虫请注明地址,博客园蜗牛 /article/11924278.html
先配上一个简易的RedisHelper,一个set值,一个get值,一个设置并发锁,以便在我后面的操作中,你能清楚我究竟做了什么。
View Code
可以看到我使用了using,调用我的Setnx方法获取锁。
输出结果最后是100000,正是我们要的正确结果。前面的8W+是因为两个线程之一先执行结束了。
还有,在正式使用的过程中,建议给我们的锁,使用后删除掉,并加上一个过期时间,使用expire。
以免程序执行期间意外退出,导致锁一直存在,今后可能无法更新或者获取此被锁住的数据。
你也可以尝试一下不设置expire,在程序刚开始执行时,关闭console,重新运行程序,并且在redis-cli的操作控制台,get你锁住的值,将会永远获取不到。
先配上一个简易的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你锁住的值,将会永远获取不到。
相关文章推荐
- .NET基于Redis缓存实现单点登录SSO的解决方案
- redis持久化那些事(kēng)儿
- redis开启远程访问
- Redis 配置redis.conf 解读
- Redis Twemproxy集群
- Redis 安装
- Redis 安装
- Redis 使用场景-电商
- Redis实现简单的消息队列
- 十三、redis特性操作
- 十二、redis操作类型(下)
- 十一、redis操作类型(上)
- 十、NOSQL与缓存系统-Redis安装
- Redis持久化的两种方式
- centos6 安装phpredis扩展
- Redis 复制原理
- Redis学习笔记(十三)redis配置文件redis.conf中文版(基于2.4)
- redis的持久化:RDB的配置和原理
- 简单安装redis服务器
- Redis 安装日记