9 hours ago
- 分布式锁需要互斥性、无死锁和容错性。
- 具有复制的单个Redis实例由于异步复制存在安全违规,导致故障转移期间可能出现锁冲突。
- 对于单个实例,安全的锁定方法使用带有NX、PX和唯一随机值的SET命令,通过Lua脚本释放以避免误删他人锁。
- 分布式算法使用N个独立的Redis主节点(例如5个),客户端在有效时间内获取大多数(N/2+1)节点的锁,并立即释放未使用的锁。
- 安全性依赖于确保大多数键同时存在;活性依赖于键的自动释放、客户端协作以及带随机延迟的重试。
- 可以通过避免fsync来维持性能,接受崩溃恢复期间的安全违规小风险,或者启用fsync=always以获得完全安全但性能较低。
- 如果没有持久化,崩溃恢复仍然可以是安全的,只要重启后的服务器保持不可用,直到所有之前的锁过期。
- 如果操作耗时过长,客户端可以通过脚本延长锁,防止提前释放。