redisson 分段锁 redisson分布式锁续期_数据库

Redisson锁的加锁机制如图所示 线程去获取锁 获取成功则执行lua脚本 保存数据到redis数据库

如果获取失败: 一直通过while循环尝试获取锁(可自定义等待时间 超时后返回失败)

Redisson提供的分布式锁是支持锁的自动续期的, 也就是说 如果线程仍然没有执行完毕 那么redisson会自动给redis中的目标key延长超时时间 这在redisson中称之为watch dog机制 默认续30秒

watch dog自动延期机制

如果拿到分布式锁的节点宕机 且这个锁正好处于锁住的状态时, 会出现锁死的情况 为了避免这种情况发生 锁都会设置一个过期时间 这样也存在一个问题 当业务时间过长时 达到了超时时间的还没有结束的话 会释放锁 就会导致问题 Redisson中添加了watch dog机制来解决这个问题 自动延期机制

它的作用是在Redisson的实例被关闭前,不断地延长锁的有效期 也就是说 如果一个拿到锁的线程一直没有完成逻辑 那么看门口会帮助线程不断地延长超时时间

另外Redisson还提供了可以指定leaseTime参数的加锁方法来指定加锁的时间 超过这个时间后锁便自动解开了 不会延长锁的有效期

关键结论

  • watch dog 在当前节点存活时 每10s给分布式锁的key续期30s
  • watch dog机制启动 且代码中没有释放锁的操作时 watch dog会不断给锁续期
  • 如果程序释放锁操作因为异常没有执行 那么锁无法被释放 所以释放锁操作一定要放到finally{}

但是如果释放锁的操作本身异常了 watch dog 还会不停的续期吗?

不会 因为无论释放锁操作是否成功 EXPIRATION_RENEWAL_MAP中的目标ExpirationEntry对象已经被移除了 watch dog通过判断后就不会继续给锁续期了