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就可以获取和释放锁。