985研一学习日记 - 2024.11.02

时间:2024-11-06 17:18:24
Redlock落地实现:Redisson
  1. 官网
    1. Redisson是Redis提供的基于Redlock算法实现的更安全的DLM
  2. SpringBoot引入Redisson实现分布式锁
    1. 单机版
      1. 使用redisson分布式锁也会出现错误,因为有时候删除的不是自己的锁,故先判断是不是自己的锁再删除,使用redisson先判断是不是自己的锁再删除,会自动封装为原子操作
  3. Redisson源码解析
    1. 必须实现Lock规范,有加锁、解锁、可重入、续期功能
    2. 和自己实现的可重入分布式锁的源码类似,均实现了Lock接口规范,并重写相应的函数,加锁时先判断是否存在锁,不存在则直接加锁,如果存在则判断是不是自己的锁,如果是则计数+1实现可重入,使用lua脚本来实现原子性,加锁成功后开启一个看门狗来自动续期,默认超时时间是30s,当解锁时仍要先判断是不是自己的锁,如果不是则报错,只有是自己的锁时才会解锁,且在使用redisson分布式锁时,解锁之前也要使用redisson判断是不是存在锁并去是自己的锁,然后再解锁,当是自己的锁时,计数-1,然后判断计数是否为0,如果为0则要删除锁不为0则重置过期时间后直接结束
    3. 看门狗是定时检查redis分布式锁是否还存在,并不断延长锁的过期时间
    4. 在redisson中当获得锁后会自动设置一个监控线程看门狗,会定期对锁进行监控,如果还未释放且快过期了则对锁续期,看门狗默认30s监控一次
    5. 守护进程来续命:定期检查锁是否存在,存在则重新设置过期时间,以防止过期了还未执行完业务,使用看门狗,当获得锁后会给锁加一个看门狗,会另起一个定时任务,不断查询锁是否存在并进行续期
    6. 加锁源码使用lua脚本实现原子性和自动续期看门狗![[Pasted image 20241102123637.png]]![[Pasted image 20241102123926.png]]![[Pasted image 20241102124112.png]]
    7. 解锁源码,先判断是不是自己的锁,如果不是则返回nil,是自己的锁时先解一次锁,计数-1,然后判断计数是否为0,如果为0说明没有重入了,故要删除整个锁,如果不为0,则重置过期时间后返回
    8. 但对于redisson可能高并发出现错误,故在使用时,解锁之前使用redisson先判断一下是不是存在锁且是自己的锁,然后再使用redisson解锁
  4. 小总结
    1. redisson基于Redlock算法,防止出现单个redis故障造成的整个服务停止运行以及主从复制异步性造成互斥失效的问题 ![[Pasted image 20241102125357.png]]