分布式锁

Redis分布式锁

核心思想:SET key value NX EX seconds

  • NX: 只有当key不存在时才设置
  • EX: 过期时间,防死锁

获取锁:尝试设置key,成功则获得锁
释放锁:删除key

原子性保证:获取锁使用SET NX EX命令天然原子性,释放锁使用Lua脚本确保"检查+删除"的原子性
唯一标识:锁的value使用UUID或线程ID作为唯一标识,释放时验证持有者避免误删其他客户端的锁

关键问题
①锁超时问题
业务执行时间超过锁过期时间,锁自动释放,可能导致多客户端同时获得锁
解决方案:合理设置过期时间;使用看门狗机制自动续期;推荐使用Redisson框架自动续期
②Redis主从切换
主节点宕机从节点升级成主节点可能出现锁丢失
解决方案:使用RedLock算法在多个独立Redis实例获取锁;设置合理故障转移时间;业务层面设计幂等性操作
③锁重入问题
同一线程多次获取同一把锁可能出现死锁
解决方案:在value中记录线程ID和重入次数;使用hash结构存储复杂锁信息;直接使用Redisson可重入锁

生产环境最佳实践
①使用UUID或线程ID作为唯一标识
②合理设置过期时间
③保证获取和释放锁的原子性
④在finally块中释放锁
⑤监控锁的获取失败率和持有时间

posted @ 2025-09-15 15:10  Frαnk  阅读(21)  评论(0)    收藏  举报