Redlock算法和底层源码分析
一、当前代码为8.0版接上一步
自研分布式锁的重点:
- 按照juc里面Lock接口规范进行编写
- lock加锁关键逻辑 
  - 加锁:在redis中,加锁实际上是给key设置一个值,为避免死锁,并给key一个过期时间
- 自旋
- 续期
 
- unlock解锁关键逻辑 
  - 将redis中的key删除。但是不能乱删,加锁与解锁必须是同一把锁。
 
二、Redis分布式锁-Redlock红锁 Distributed locks with Redis
-  官网说明 https://redis.io/docs/manual/patterns/distributed-locks/ 
-  为什么学这个?怎么产生的?  
-  RedLock算法设计理念? Redis也提供了RedLock算法,用来实现基于多个实例的分布式锁。 锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。 Redlock算法是实现高可靠分布式锁的一种有效解决方案,可以在实际开发中使用。  设计理念  该方案为了解决数据不一致的问题,直接舍弃了异步复制只使用master节点,同时由于舍弃了slave,为了保证可用性,引入N个节点,官方建议是5. 客户端只有在满足下面这两个条件时,才能认为是加锁成功: - 客户端从超过半数(大于等于N/2+1)的Redis实例上成功获取到锁。
- 客户端获取锁的总耗时没有超过锁的有效时间。
 解决方案:  
-  RedLock落地实现? Redisson是Java的redis客户端之一,提供了一些api方便操作 Redisson官网:https://redisson.org redisson github :https://github.com/redisson/redisson redisson分布式锁:https://github.com/redisson/redisson/wiki/8.-%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E5%92%8C%E5%90%8C%E6%AD%A5%E5%99%A8#84-%E7%BA%A2%E9%94%81redlock redisson可能存在的bug  在解锁的时候,需要判断当前是锁定状态,并且锁是当前线程持有的。 
三、使用Redisson进行编码改造V9.0
四、Redisson源码解析
最低保证分布式锁有效性和安全性的要求:
- 互斥:任何时刻只能有一个client获取锁
- 释放死锁:即使锁定资源的服务崩溃或者分区,仍然能释放锁
- 容错性:只要多数redis节点(一半以上)在使用,client就可以获取和释放锁。





![8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.](https://img-blog.csdnimg.cn/bebb5d7af9974baea2389cdf26ce6131.jpeg#pic_center)













