特性


基础特性

  • 互斥性:最基本的功能。在任何时刻都只能有一个客户端持有锁。
  • 无死锁:即使某个持有锁的客户端崩溃、意外掉线或处理逻辑异常,锁也必须能够最终被释放。
    实现方式:通常通过给锁设置过期时间 TTL 来实现。
  • 容错性:只要大多数 Redis 节点正常运行,客户端就能获取和释放锁。

其他特性

  • 独占性:客户端只能释放自己持有的锁,不能释放其他客户端的锁。
    实现方式:加锁时存入唯一的的 UUIDRequestID,解锁前先比对。
  • 非阻塞:如果获取不到锁,不能无限期等待。
  • 高性能:加锁和释放锁的操作必须极快,不应成为业务流程的瓶颈。
  • 高可用:锁服务不能存在单点故障。

实现


基于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 0

Redis集群

RedLock算法
Redisson