Redisson的看门狗实现中,对于续期失败的异常处理就是释放锁:
见红框
也就是说主线程不会知道当前锁是否还有效,可能锁因为续期失败已经过期了,但主线程还在处理业务。
这种情况应该怎么处理呢?
Redisson的看门狗实现中,对于续期失败的异常处理就是释放锁:
见红框
也就是说主线程不会知道当前锁是否还有效,可能锁因为续期失败已经过期了,但主线程还在处理业务。
这种情况应该怎么处理呢?
这个问题可以通过Redisson的Watchdog续期机制来解决。在Redisson中,Watchdog续期机制可以自动检测并处理续期失败的问题。
具体来说,如果在续期期间内没有收到任何回应,Watchdog会认为该锁已经过期,然后自动释放该锁。这样,主线程就不需要关心锁是否续期成功,只需要正常处理业务即可。
如果需要更加严格的控制锁的续期时间,可以考虑使用Redisson的RScheduledExecutorService来定时检测锁的续期状态。例如,可以在获取锁的时候启动一个定时任务,该任务定期检查锁的续期状态,如果发现锁已经过期,就重新获取该锁。
下面是一个示例代码:
RScheduledExecutorService executorService = redissonClient.getExecutorService("myExecutorService");
executorService.schedule(() -> {
RLock lock = redissonClient.getLock("myLock");
try {
if (lock.getRemainingTime() <= 0) {
lock.renew(); // 如果锁已经过期,重新获取锁
}
} catch (Exception e) {
// 处理异常情况
} finally {
lock.release(); // 释放锁
}
}, 10, TimeUnit.SECONDS); // 每10秒检测一次锁的续期状态
你说的是 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();
}
}
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.6k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答1.7k 阅读✓ 已解决
主线程好像不会感知到。且如果续期失败,过了30秒,redis中的lock自动过期了,然后主线程在释放锁执行unlcok的时候会抛出异常。
关于这个点在这边文档中有提到
https://cloud.tencent.com/developer/article/2012840
在这个测试案例中就是 模拟了通过重启 redisserver 来实现 续期失败的效果。finally中断言unlock收到了异常。
另外我猜测 没法通知,要想实现通知大概有两个思路吧, 一个是 续期失败的时候对持有锁的线程发起中断,但是中断要求业务线程自身要检查中断或者阻塞在可被中断的方法处,显然这对业务有了要求; 另外就是提供注册监听,续期失败的时候通知监听处理,redisson中好像没有这种监听机制。