Redisson分布式锁实现
2024-01-21 20:13:06 10 举报
Redisson分布式锁实现源码流程图
作者其他创作
大纲/内容
锁续命逻辑renewExpiration()
true
ttl == null?
加锁成功return;
scheduleExpirationRenewal(threadId)
信号量,唤醒等待线程value.getLatch().release();
return 1
LUA脚本逻辑
业务逻辑
return nil返回null
重设\"lock_key\
解锁lock.unlock();
renewExpirationAsync(threadId)
return null
嵌套调用实现定时任务
LUA脚本实现,保证redis命令原子性
unlockAsync(Thread.currentThread().getId())
当前现在加的\"lock_key\
唤醒
true不存在
获取线程idlong threadId = Thread.currentThread().getId();
new TimerTask().run()
设置\"lock_key\
finally
返回\"lock_key\
true表示不存在
if (counter > 0)
延时任务new TimerTask(),\"lock_key\"span style=\"font-size: inherit;\
RFuture<Boolean> future = unlockInnerAsync(threadId);
false
阻塞线程ttl个时间,如果阻塞过程中锁被释放,可被redischannel消息span style=\"font-size: inherit;\
redis发布订阅实现,当锁被释放时,唤醒等待线程RFuture<RedissonLockEntry> future = subscribe(threadId);
\"lock_key\"font color=\"#323232\
未加锁线程等待,并每隔一段时间进行尝试加锁while (true)
tryAcquireAsync
尝试进行加锁,返回\"lock_key\
redisson
redis中是否存在\"lock_key\
RLock lock = redisson.getLock(\"lock_key\")
redis中是否不存在\"lock_key\
锁续命实现ttlRemainingFuture.onComplete
加锁是否成功 if (ttl == null)
加锁lock.lock();
删除\"lock_key\
return nil返回null
循环尝试加锁
锁续命炒作,重新设置\"lock_key\
加锁成功跳出循环 break;
try
return 0
res 返回为1 时,是true,嵌套调用延时逻辑if (res) { renewExpiration();}
\"lock_key\
0 条评论
下一页