继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Redis锁:Redisson

Aurae
关注TA
已关注
手记 1
粉丝 0
获赞 1

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实例上进行解锁


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP