图文

Redisson 分布式锁源码 04:可重入锁释放

Redisson 分布式锁源码 04:可重入锁释放:原封面
文章目录3 节

本文发表已超过一年,部分内容可能已过时。

前言

前面已经了解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。

当锁加锁成功之后,锁是如何释放的?

主动释放

源码入口:RedissonLock#unlock

RedissonLock unlock 入口

在解锁时会获取当前线程的id。

一路往里跟,直接来到 RedissonLock#unlockInnerAsync:

unlockInnerAsync 解锁方法

分析一下 lua 脚本的内容:

解锁 Lua 脚本与重入计数处理

  1. 如果锁不存在,直接返回 null;
  2. 如果锁存在,则对锁的重入次数 -1;
    1. 剩余重入次数大于 0,重新设置过期时间,返回 0;
    2. 剩余重入次数不大于 0,删除 redis key 并发布消息,返回 1;

主动释放锁这块考虑的不仅仅是对 key 进行处理,因为可能存在重入锁,所以会先对 redis key 对应的 hash value 进行递减,相当于减去重入次数。

自动释放

相比较主动释放,自动释放就比较容易理解了。

  1. 当服务宕机时,看门狗不再看门,那么最多 30s 之后锁被自动释放;
  2. 当设置锁的时间时,锁到了时间,自动释放。

总结

Redisson 锁释放流程总结

Redisson 锁的释放分为两种:

  1. 主动释放:自己调用 API unlock 即可;
  2. 宕机/到期自动释放:Redis key 指定时间自动过期。

相关推荐

打开原图

订阅更新,继续阅读新的实践记录

最近发布

评论

隐私提示

昵称、网址和评论内容会公开显示,邮箱不公开。请勿在评论中填写敏感信息。