【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分布式锁不要用于较长时间的任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值