Redis为什么适合做分布式锁?
性能高
Redis是内存数据库,所有的操作均在内存中完成,所以读写速度非常快。在需要频繁加锁和解锁的高并发场景下,Redis性能优势明显。
实现简单
Redis 提供了像 SETNX、EXPIRE 这样的原子性命令,这些命令可以很方便地组合起来实现分布式锁。
edis 实现分布式锁的核心思想是:利用 Redis 的原子操作,将一个键值对作为“锁”。当一个客户端成功设置了这个键,它就获得了锁;当它释放锁时,就删除这个键。
- 获取锁:' SET key(lock:order:123) value(UUID) NX PX/EX milliseconds ',key是锁的名称,value用来标识上锁的线程(锁的占有者)
- 释放锁:通过 “检查-删除”的逻辑在 Lua 脚本中作为一个原子操作,确保只能由持有锁的客户端来释放
易于维护
作为一款成熟的中间件,Redis 提供了丰富的监控工具和运维方案。你可以很方便地查看锁的状态、监控 Redis 的性能,这使得分布式锁的维护工作变得相对简单。
常见问题以及解决方案
-
锁过期与业务未完成(锁续期问题):客户端业务处理时间超过锁过期时间,导致锁提前释放
解决方案:看门狗机制:启动后台线程定期(如每隔10秒)续期锁的过期时间。 -
主从切换导致锁丢失:Redis主节点宕机后,从节点可能未同步锁信息,新主节点上锁丢失。
解决方案:RedLock算法:向多个独立Redis实例申请锁,当多数节点(如5个中的3个)加锁成功时,认为锁获取成功。