⑤. Redisson源码解析
- ①. 测试代码展示
public class WatchDogDemo { public static final String LOCKKEY = "DEBUG_YUANMA"; private static Config config; private static Redisson redisson; static { config = new Config(); config.useSingleServer().setAddress("redis://"+"192.168.68.143"+":6379").setDatabase(0); redisson = (Redisson)Redisson.create(config); } public static void main(String[] args) { RLock redissonLock = redisson.getLock(LOCKKEY); redissonLock.lock(); try { System.out.println("1111-------biz"); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(25); } catch (InterruptedException e) { e.printStackTrace(); } }catch (Exception e){ e.printStackTrace(); }finally { if(redissonLock.isLocked() && redissonLock.isHeldByCurrentThread()) { redissonLock.unlock(); } } System.out.println(Thread.currentThread().getName() + " main ------ ends."); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } redisson.shutdown(); } }
②. Redis分布式锁过期了,但是业务逻辑还没处理完怎么办?引入缓存续命
额外起一个线程,定期检查线程是否还持有锁,如果有则延长过期时间。
Redisson里面就实现了这个方案,使用“看门狗”定期检查(每1/3的锁时间检查1次),如果线程还持有锁,则刷新过期时间
在获取锁成功后,给锁加一个watchdog,watchdog 会起一个定时任务,在锁没有被释放且快要过期的时候会续期
③. 详解缓存续命源码解析一:通过redisson新建出来的锁key,默认是30秒
④. 详解缓存续命源码解析二
- ⑤. 详解缓存续命源码解析三
- 这里面初始化了一个定时器,dely 的时间是 internalLockLeaseTime/3
- 在Redisson中,internalLockLeaseTime是30s,也就是每隔10s续期一次,每次30s