为了账号安全,请及时绑定邮箱和手机立即绑定

Redis锁:Redisson

Redisson 中实现了 Redis 分布式锁,且支持单点模式和集群模式。

单机原理:

利用redis的setnx命令不存在才能设置成功。于是多个进程并发去设置同一个 key,只有一个进程能设置成功。

SET key value NX PX 30000

  • Key 是业务id,value是全局唯一的随机数。这个随机数在释放锁时保证释放锁操作的安全性。如果没有全局唯一的随机数的保证,client_1释放锁的请求没有及时到达 Redis,锁定时间超时租约到期,释放了这个锁;client_2申请到了这个锁;client_1释放锁的请求到达,将client_2解锁;Client_3也获得了锁,冲突。释放锁的时候需要对比value值,防止释放了不同时间点的锁

  • SET NX 命令只会在 key 不存在的时候给 key 赋值,PX 命令表示锁过期时间,防止线程挂了引发的死锁问题

  • 当资源被锁定超过这个时间时,锁将自动释放。其他客户端获得锁,引起争用问题。解决方案是新建一个检查线程去检查客户端是否正常,如果正常则更新锁的超时时间

集群原理:

Redlock 算法:

1. 获取当前Unix时间T1,以毫秒为单位。
  1. 使用相同的key和value从各个redis节点获取锁,客户端应该设置一个锁超时时间请求超时时间,请求超时时间应该小于锁超时时间。比如锁超时时间为10秒,则请求超时时间应该在5-50毫秒之间。

  2. 获取当前Unix时间T2,以毫秒为单位。T2-T1就是获取锁花费的时间T。

  3. 如果超过半数的Redis节点都取到锁并且T小于锁超时时间,则锁获取成功,锁真正生效的时间为 锁超时时间 -T

  4. 如果获取锁失败,客户端应该在所有的Redis实例上进行解锁


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消