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

Redis分布式锁遇到的问题(面试Markdown结构化)

1. 加锁不原子,出现死锁

  • 问题:分开执行set和expire,set成功后Redis宕机,没设置过期时间,锁永久存在,其他线程永远拿不到锁。
  • 解决:使用set key value NX EX一条命令原子加锁。

2. 锁被其他客户端误删除

  • 问题:业务执行时间超过锁过期时间,锁自动释放;别的线程抢到锁,原线程执行del,直接删掉别人持有的锁。
  • 解决:加锁存入客户端唯一标识;释放锁用Lua脚本,校验value属于自己才删除,禁止直接del。

3. 业务没执行完,锁提前过期释放

  • 问题:业务逻辑耗时 > 锁TTL,锁过期释放,多个线程同时执行业务,并发冲突。
  • 解决:看门狗续期(Redisson),业务没结束就不断延长锁过期时间;不要设置过小锁超时。

4. 主从架构下锁丢失(单机最大坑)

  • 问题:master加锁成功,锁还没异步同步到slave,master宕机,slave晋升为主节点,锁消失,多个客户端获取锁。
  • 解决:
    • 方案1:RedLock红锁(有缺陷,很少线上使用)
    • 方案2:强一致性场景改用Zookeeper/Etcd

5. RedLock自身带来的问题

  1. 时钟漂移、NTP时间跳变,导致锁提前失效
  2. 客户端GC停顿、网络延迟,锁过期,依然会锁失效
  3. 需要维护多套独立Redis节点,性能差、运维成本高

6. 锁不可重入

  • 问题:同一个线程,递归/嵌套再次获取同一个锁,直接加锁失败,造成自己把自己阻塞。
  • 解决:Redisson内部实现可重入锁,记录线程持有计数;自己手写很难实现。

7. 锁等待、死锁(线程A拿锁,线程B无限阻塞)

  • 问题:获取锁失败后,如果无限循环自旋,会大量消耗CPU,压垮Redis。
  • 解决:设置最大等待时间,加退避重试,不要死循环抢锁。

8. 网络抖动问题

  • 问题:Redis已经拿到锁,网络超时,客户端没收到返回;客户端认为加锁失败,实际锁已经存在,资源死锁。
  • 解决:设置合理的网络超时,失败主动释放所有节点残留锁。

总结

手写Redis分布式锁很难做到完备,会踩原子性、误删、锁过期、主从丢锁、不可重入、自旋风暴这些坑;开发中优先直接使用Redisson,不要自己实现。

如果业务对互斥要求极高,不建议用Redis分布式锁。

相关推荐
凯凯姜9 小时前
分布式锁场景问题
分布式
2501_937767169 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
silvamux_10 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
夕除11 小时前
redis--模型
redis
每天一道题11 小时前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
I Am a robert girl12 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒12 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB12 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB13 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB13 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析