一般在使用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));
    }
}

由于进行此操作时已经把记录的锁信息删掉了,因此延长的机会只有这一次。

标签: none

添加新评论