使用 Redis 实现一个高可用的分布式锁,不能仅仅依靠简单的 命令。在生产环境中,需要考虑进程崩溃、网络延迟、Redis 节点宕机、主从切换导致的数据丢失等多种复杂情况。 一个完整且高可用的 Redis 分布式锁演进过程可以分为以下几个阶段。在 Java 生态中,通常直接使用 Redisson 框架来实现,但理解其底层原理至关重要。 --- 第一阶段:单节点的基础实现(标准命令 + Lua) 在单节点 Redis 下,实现分布式锁必须保证加锁和解锁的原子性,同时防止死锁。 1. 加锁:使用 命令的扩展参数 必须将“判断是否存在”和“设置过期时间”合并为一条命令,防止客户端刚拿到锁就崩溃导致死锁。 2. 解锁:使用 Lua 脚本保证原子性 解锁时,必须判断这把锁是不是自己加的(通过对比 ),如果是才能删除。获取和删除必须是原子操作,因此需要用 Lua 脚本: --- 第二阶段:解决业务执行时间 > 锁过期时间(看门狗机制) 痛点:如果业务逻辑执行需要 40 秒,而锁的过期时间是 30 秒。第 30 秒时锁自动释放,其他线程就会拿到锁,导致并发安全问题。 解决方案:Watchdog...