1.Redis 分布式锁实现
采用 机器ID+线程ID 做为 value
抢到锁后只有value 匹配上 才能做操作【删除,续命(看门狗)】
java
# 客户端A(机器1)加锁
SET lock_key 123 NX EX 30
# 客户端A业务超时,锁过期自动释放
# 客户端B(机器2)抢到锁
SET lock_key 456 NX EX 30
# 客户端A业务执行完,执行DEL lock_key → 误删了客户端B的锁!
2.看门狗是在客户端执行的
Redis 服务器本身是无状态的键值存储服务,它只负责执行你发过去的指令(比如 SET、EXPIRE、Lua 脚本),不会主动创建线程去监控 / 续期某个 key------ 所有 "主动行为"(比如定时检查、自动续期)都由客户端自己实现。
客户端线程发起请求,Redis 只负责执行脚本并返回结果,不会跑任何 "看门狗" 相关逻辑。
如果 Redis 服务器来管续期,会出现致命问题:
Redis 要为每个锁 key 维护一个监控线程,高并发下(比如 10 万个锁),Redis 会被线程调度压垮,性能暴跌;
Redis 是集群部署时,主从切换 / 分片迁移会导致监控线程丢失,续期逻辑失效;
违背 Redis"极简核心 + 客户端扩展" 的设计原则(Redis 只做最核心的存储,复杂逻辑交给客户端)。