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,以毫秒为单位。
使用相同的key和value从各个redis节点获取锁,客户端应该设置一个锁超时时间和请求超时时间,请求超时时间应该小于锁超时时间。比如锁超时时间为10秒,则请求超时时间应该在5-50毫秒之间。
获取当前Unix时间T2,以毫秒为单位。T2-T1就是获取锁花费的时间T。
如果超过半数的Redis节点都取到锁并且T小于锁超时时间,则锁获取成功,锁真正生效的时间为 锁超时时间 -T
如果获取锁失败,客户端应该在所有的Redis实例上进行解锁
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦