分布式锁:Redisson源码解析——RLock(二)

本文详细解析Redisson分布式锁RLock的实现,包括初始化、加锁、锁竞争、可重入、释放锁、锁超时和自动释放等核心功能。通过Redis实现互斥锁,利用信号量优化并发,并讨论了宕机情况下的锁管理问题。
摘要由CSDN通过智能技术生成

一、复习

场景模拟

初始化

在获取锁的时候,会初始化一些参数,例如commandExecutor leaseTime uuid
● commandExecutor 命令执行器
● leaseTime 持有锁的最大时间,租期
● uuid 客户端的唯一标识

第一次加锁

  1. 设置获取到锁的主体,使用线程id作为标识
  2. 当未设置leaseTime的时候,也就是代表的锁可以无限持有时间
  3. 判断redis中是否已经存在了这个锁
  4. 第一次加锁肯定不存在,递增一个lockName为key的hash数据结构里面的一个key为uuid:threadId的元素
{
   
  "lockName": {
   
    "uuid:threadId": 1
  }
}
  1. 给设置这个redis key设置一个过期时间 leaseTime,返回一个null
  2. 此时,就表明了客户端已经加锁成功了
  3. 收到监听加锁结果后,判断条件是ttl == null就表示这个客户端加锁成功
  4. 如果锁是有最大持有时长的,就会直接结束整个流程
  5. 如果是没有最大持有时长,会启动一个leaseTime/3 后执行的任务,任务会将锁的过期时间重新给设置为leaseTime,这个机制也被称之为watchdog
  6. 同时,本地还会维护一个watchdog需要监听的map,也就是每一个加锁成功且需要watchdog去设置过期时间的锁都会被记录在map中
{
   
  "uuid:lockName": {
   
    "timeout": timeout object,
    "threadIds": 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值