Redis分布式锁
Redis分布式锁
原子操作
原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始,就会一直运行到结束,中间不会有任何的线程切换。
原理
分布式锁本质上要实现的目标就是在Redis里面占一个坑,当别的线程也要来进行占坑的时候,发现已经被别人占用了,只好放弃或者稍后重试。 占坑使用setnx(set if not exists)指令。使用完成使用del指令释放。
第一步
127.0.0.1:6379> setnx mylock true (integer) 1
第二步
执行某些逻辑操作
第三步
127.0.0.1:6379> del mylock (integer) 1
问题1
在第二步执行逻辑的时候,如果发生异常,那么释放锁的操作就不会被执行,就会造成死锁。
解决方式
在拿到锁之后,给锁设置一个过期时间,保证出现异常的时候,锁在一定时间之后自动释放。
第一步
127.0.0.1:6379> setnx mylock true (integer) 1
第二步
127.0.0.1:6379> expire mylock 10 (integer) 1
第三步
执行逻辑操作
第四步
127.0.0.1:6379> del mylock (integer) 1
问题2
如果在setnx和expire之间服务器进程突然挂掉了,就会导致expire命令得不到执行,也会造成死锁。根本原因在于setnx和expire是两条指令而不是一个原子指令。
解决方式
在Redis2.8版本中,作者加入了Redis指令的扩展参数,使得setnx和expire指令可以一起执行,彻底解决了分布式锁的乱象。
127.0.0.1:6379> set mylock true ex 5 nx OK
上面的指令就是setnx指令和expire指令组合在一起的原子指令。
注意问题
Redis分布式锁不要用于较长时间的任务。

相关推荐
  smartbaby    2020-11-11  
   夙梦流尘    2020-09-23  
   峰哥    2020-09-23  
   zhangll00    2020-07-29  
   大胡子抽雪茄    2020-07-19  
   middleware0    2020-07-19  
   Cheetahcubs    2020-07-18  
   manongxiaomei    2020-07-05  
   wqbala    2020-07-04  
   loviezhang    2020-06-17  
   hweiyi    2020-06-14  
   manongxiaomei    2020-06-12  
   亦碎流年    2020-06-11  
   亦碎流年    2020-06-05  
   loviezhang    2020-06-04  
   亦碎流年    2020-06-03  
   ZHANGYONGHAO0    2020-05-31  
   zhangll00    2020-05-28  
   joynet00    2020-05-27  
   manongxiaomei    2020-05-26  
   wqbala    2020-05-20  
   粗茶淡饭    2020-05-19  
   wqbala    2020-05-14  
   憧憬    2020-02-14  
   hweiyi    2020-02-14  
   joynet00    2020-05-08  
   middleware0    2020-05-07  
   枫叶上的雨露    2020-05-04  
   joynet00    2020-05-04  
 