Redisson分布式锁原理
-
加锁流程
调用lock(),底层执行的是一段lua脚本,相当于setnx但是使用hash结构存储数据和线程信息。
如果 key 不存在(无锁),则加锁成功。否则失败。
如果是同一线程重复加锁,Redisson 使用hash结构记录每个线程(uuid+线程线程id)加锁次数,实现可重入锁。 -
看门狗机制(Watchdog)
默认锁过期时间是 30 秒(如未指定),如果业务还未完成,Redisson 内部有个后台线程定期(锁过期 / 3)刷新 TTL,只有加锁线程还持有锁,续期才会生效。 -
解锁流程
调用 unlock() 方法时,Redisson 会执行 也会Lua 脚本
多线程加锁场景中,Redisson 用 Hash 保存线程与重入次数。解锁时,只有持有锁的线程才能真正删除
锁被持有期间有其他线程来获取锁
lua返回锁的ttl,想获取锁的线程会先尝试一次(非公平锁),然后在while循环中阻塞ttl秒的时间,继续获取锁。如果持有锁的线程提前完成了会通过发布订阅去唤醒其他等待锁的线程。