Redis锁在操作完成之前超时自动解锁
一般在使用Redis锁的时候通常会是如下流程:
if (lockService.lock(LOCK_TOHIS, 6000)) {
try {
innerProcess();
lockService.unlock(LOCK_TOHIS);
} catch (Throwable t) {
lockService.unlock(LOCK_TOHIS);
}
}
加锁时设置key和超时时间,在超时时间到来之前可以主动解锁。
有一种情况是如果某次操作耗时比平时长,这时候假设锁的超时时间到了,这时该如何处理。
一种解决方法
在加锁时记录每个锁的key和到期时间,主动解锁时删除此纪录。之后可以设置一个定时任务,定期检查记录下来的锁和超时时间。每当发现里面有锁的时间已经过期了,就移除这个记录,并把锁的时间延长。
public void refreshLock() {
Iterator<Map.Entry<String, LocalDateTime>> iterator = locks.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, LocalDateTime> entry = iterator.next();
// 超过最大锁定时间
if (entry.getValue().isBefore(LocalDateTime.now())) {
iterator.remove();
}
redisLock.refreshLockExpire(entry.getKey(), Duration.ofSeconds(LOCK_TIMEOUT));
}
}
由于进行此操作时已经把记录的锁信息删掉了,因此延长的机会只有这一次。