2023.05.08 Redisson源码解析
2023-05-16 09:37:13 3 举报
Redisson
作者其他创作
大纲/内容
Cluster
Redisson
RedissonClient
声明和创建RedissonClient
leaseTime > 0
泛化 实现 组合 聚合 关联 依赖
leaseTime=lockWatchdogTimeout = 30 * 1000unit=TimeUnit.MILLISECONDS
Sentinel
Singleinstance
Redis模式
redisson解锁前判断lock.isLocked() && lock.isHeldByCurrentThread()后,仍然解锁失败
ConnectionManager connectionManager;
否(leaseTime = -1)
MasterSlave
tryAcquire
scheduleExpirationRenewal
RedissonClient clusterRedissonClient() { Config config = new Config(); config.useClusterServers() .setPassword(\"\") .setNodeAddresses(Collections.emptyList()); return Redisson.create(config);}
Java代码:public void getLock() { String key = \"dl\
解锁:unLock()
Redis架构模式
是
tryAcquireAsync
Redisson 源码解析版本 v3.20.1日期:2023.05.06
来源:https://juejin.cn/post/6961380552519712798
RedissonLock#tryLock
Configint threads = 16int nettyThreads = 32TransportMode transportMode = TransportMode.NIOCodec codec = new Kryo5Codec()
leaseTime>0
否
Replicated
Tries to acquire the lock with defined leaseTime. Waits up to defined waitTime if necessary until the lock became available. Lock will be released automatically after defined leaseTime interval.Params:waitTime – the maximum time to acquire the lock(获取锁的最长等待时间)leaseTime – lease time(锁的有效期)unit – time unit
参考链接:https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247545794&idx=2&sn=88a3b1c73372006b49a43a6c133a10c3&chksm=fbb1ba3cccc6332ae1f5e609ab5e37c32fe972b7ba3a18b1a92735c5f3e7c9300e2318ca2280&scene=27https://blog.csdn.net/JavaShark/article/details/125019127
来自ChatGPT的回答:如果Redisson在解锁前经过了isLocked()和isHeldByCurrentThread()的校验,但仍然无法解锁,则可能存在下列情况:Redisson客户端与Redis服务器之间的网络连接存在问题,导致无法正常操作Redisson。解决方案:可以尝试重启Redisson客户端或Redis服务器,或者检查网络连接是否正常。Redis服务器的key过期机制可能会导致锁自动失效,但是客户端无法意识到这个变化。解决方案:可以尝试使用Redisson的watchDog()方法定期续期锁。可能有其他线程或进程正在持有这个锁。解决方案:需要确认是否有其他线程或进程持有这个锁,如果存在则需要等待它们释放锁之后再进行解锁。Redisson客户端与Redis服务器之间的clock skew(时间漂移)导致锁超时时间不准确。解决方案:可以尝试调整Redisson客户端和Redis服务器之间的时钟偏差,或者增加锁的超时时间。
利用lua的原子性获取锁
Proxy
watchDog看门狗使用HashedWheelTimer定时续期
tryLockInnerAsync
0 条评论
回复 删除
下一页