Redisson锁续期失败怎么通知主线程?
Redisson的看门狗实现中,对于续期失败的异常处理就是释放锁:
见红框
也就是说主线程不会知道当前锁是否还有效,可能锁因为续期失败已经过期了,但主线程还在处理业务。
这种情况应该怎么处理呢?
回答:
主线程好像不会感知到。且如果续期失败,过了30秒,redis中的lock自动过期了,然后主线程在释放锁执行unlcok的时候会抛出异常。
关于这个点在这边文档中有提到
https://cloud.tencent.com/developer/article/2012840
在这个测试案例中就是 模拟了通过重启 redisserver 来实现 续期失败的效果。finally中断言unlock收到了异常。
另外我猜测 没法通知,要想实现通知大概有两个思路吧, 一个是 续期失败的时候对持有锁的线程发起中断,但是中断要求业务线程自身要检查中断或者阻塞在可被中断的方法处,显然这对业务有了要求; 另外就是提供注册监听,续期失败的时候通知监听处理,redisson中好像没有这种监听机制。
回答:
你说的是 Redis 服务高可用性问题,Redisson 提供 MultiLock 来降低这方面的风险,下面是官方给的例子:
RLock lock1 = redisson1.getLock("lock1");RLock lock2 = redisson2.getLock("lock2");
RLock lock3 = redisson3.getLock("lock3");
RLock multiLock = anyRedisson.getMultiLock(lock1, lock2, lock3);
// traditional lock method
multiLock.lock();
// or acquire lock and automatically unlock it after 10 seconds
multiLock.lock(10, TimeUnit.SECONDS);
// or wait for lock aquisition up to 100 seconds
// and automatically unlock it after 10 seconds
boolean res = multiLock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
try {
...
} finally {
multiLock.unlock();
}
}
以上是 Redisson锁续期失败怎么通知主线程? 的全部内容, 来源链接: utcz.com/p/945398.html