公司动态

Redis 实现分布式锁时可能遇到的问题有哪些?

📅 2026/8/30 3:08:34
Redis 实现分布式锁时可能遇到的问题有哪些?
Redis分布式锁遇到的问题面试Markdown结构化1. 加锁不原子出现死锁问题分开执行set和expireset成功后Redis宕机没设置过期时间锁永久存在其他线程永远拿不到锁。解决使用set key value NX EX一条命令原子加锁。2. 锁被其他客户端误删除问题业务执行时间超过锁过期时间锁自动释放别的线程抢到锁原线程执行del直接删掉别人持有的锁。解决加锁存入客户端唯一标识释放锁用Lua脚本校验value属于自己才删除禁止直接del。3. 业务没执行完锁提前过期释放问题业务逻辑耗时 锁TTL锁过期释放多个线程同时执行业务并发冲突。解决看门狗续期Redisson业务没结束就不断延长锁过期时间不要设置过小锁超时。4. 主从架构下锁丢失单机最大坑问题master加锁成功锁还没异步同步到slavemaster宕机slave晋升为主节点锁消失多个客户端获取锁。解决方案1RedLock红锁有缺陷很少线上使用方案2强一致性场景改用Zookeeper/Etcd5. RedLock自身带来的问题时钟漂移、NTP时间跳变导致锁提前失效客户端GC停顿、网络延迟锁过期依然会锁失效需要维护多套独立Redis节点性能差、运维成本高6. 锁不可重入问题同一个线程递归/嵌套再次获取同一个锁直接加锁失败造成自己把自己阻塞。解决Redisson内部实现可重入锁记录线程持有计数自己手写很难实现。7. 锁等待、死锁线程A拿锁线程B无限阻塞问题获取锁失败后如果无限循环自旋会大量消耗CPU压垮Redis。解决设置最大等待时间加退避重试不要死循环抢锁。8. 网络抖动问题问题Redis已经拿到锁网络超时客户端没收到返回客户端认为加锁失败实际锁已经存在资源死锁。解决设置合理的网络超时失败主动释放所有节点残留锁。总结手写Redis分布式锁很难做到完备会踩原子性、误删、锁过期、主从丢锁、不可重入、自旋风暴这些坑开发中优先直接使用Redisson不要自己实现。如果业务对互斥要求极高不建议用Redis分布式锁。