Redis 分布式锁
分布式锁就是在分布式环境下获取锁,实现进程以独占资源的方式访问共享资源。
Redis 分布式锁的特性
- 独享。同一时刻,只能有一个客户端获取到锁。
- 无死锁。即使持有锁的客户端奔溃或网络断开,锁仍然可以被获取。
- 容错。只要大部分Redis节点都活着,客户端就可以获取和释放锁。
单 Redis 实例实现分布式锁实现
SET 命令
1 | SET key value [EX seconds] [PX milliseconds] [NX|XX] |
获取锁
1 | /** |
释放锁
1 | /** |
单 Redis 实例实现分布式锁存在的问题
在单 Redis 实例的分布式锁实现中存在的最严重的问题就是单节点失败的问题,不能保证 Redis 永远不会挂掉。
在主从结构的 Redis 集群中,这种构架也是有问题的,不能实现资源的独享,因为 Redis 的主从同步通常是异步的:
- 客户端 A 从 Master 获取到锁
- 在 Master 同步到 Slave 之前,Master 节点挂掉了
- Slave 节点成为了 Master 节点
- 客户端B取得了同一个资源被客户端A已经获取到的另外一个锁。安全失效!
Redis 宕机毕竟是小概率实现,所以在可以忽略宕机的事件时,这个构架还是很实用的。
Redlock
Redlock 是 Antirez 提出的,使用多个完全独立的 Redis 实例,来实现分布式锁的算法。
参考:The Redlock algorithm
参考:Redis集群下的RedLock算法(真分布式锁) 实践
Redisson 分布式锁
参考:分布式锁和同步器