栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis锁:Redisson

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/237729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号