redisson框架很好的解决了redis存在的一些问题,譬如锁续期;但是封装的一般,开发人员容易误用;
基于项目报错信息排查的情况如下:
解锁的时候发现已不持有该锁,发现项目代码如下:
需改为
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
但仔细想了下,为什么redisson有看门狗机制,竟然没有锁续期?
查看代码
刚好没有触发看门狗机制;
如何启动Redisson的看门狗机制?
如果你想让Redisson启动看门狗机制,你就不能自己在获取锁的时候,定义超时释放锁的时间,无论,你是通过lock() (void lock(long leaseTime, TimeUnit unit);)还是通过tryLock
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
获取锁,只要在参数中,不传入releastime,就会开启看门狗机制,
就是这两个方法不要用: boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException
和void lock(long leaseTime, TimeUnit unit);因为它俩都传leaseTime
改为
boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);
redisson固然好用,但是还是要熟悉其用法;最好在业务层面能基于redisson进行封装,这样项目中使用起来更方便