特性
基础特性
- 互斥性:最基本的功能。在任何时刻都只能有一个客户端持有锁。
- 无死锁:即使某个持有锁的客户端崩溃、意外掉线或处理逻辑异常,锁也必须能够最终被释放。
实现方式:通常通过给锁设置过期时间TTL来实现。 - 容错性:只要大多数 Redis 节点正常运行,客户端就能获取和释放锁。
其他特性
- 独占性:客户端只能释放自己持有的锁,不能释放其他客户端的锁。
实现方式:加锁时存入唯一的的UUID或RequestID,解锁前先比对。 - 非阻塞:如果获取不到锁,不能无限期等待。
- 高性能:加锁和释放锁的操作必须极快,不应成为业务流程的瓶颈。
- 高可用:锁服务不能存在单点故障。
实现
基于Reids
单Redis实例
获取锁:
SET mykey myvalue NX EX myttl
返回”OK”表示获取锁成功,返回空表示获取锁失败
解锁:
先对锁的value进行判断,确认这是自己的锁,再进行删除,防止误删。使用lua脚本确保原子性。
if (redis.call("get", KEYS[1]) == ARGV[1]) then
return redis.call("del", KEYS[1])
end
return 0Redis集群
RedLock算法
Redisson