Redis 分布式锁
→ 返回 Redis
基础:SET NX EX + Lua 释放
SET lock:order:1001 <uuid> NX EX 30
EVAL "
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end
" 1 lock:order:1001 <uuid>常见问题
| 问题 | 说明 |
|---|---|
| 锁过期业务未完成 | GC、慢 SQL → 误释放 |
| 可重入 | 同线程多次加锁 |
| 主从切换丢锁 | 锁未同步到新主 |
| 无 fencing | 僵尸客户端写 DB |
| 与 DB 事务 | 锁只互斥 |
Redlock
向 N 个独立 Redis 主(常 N=5)加锁,过半成功且耗时 < TTL 算成功。
争议(Martin Kleppmann):时钟、GC、复制下仍可能不安全。
实践:单 Redis Sentinel/Cluster 单主 + Lua + 短 TTL + 看门狗 + 幂等;强一致考虑 Zookeeper 或 DB 锁。
RLock lock = redisson.getLock("lock:order:" + orderId);
if (lock.tryLock(3, 30, TimeUnit.SECONDS)) {
try { /* 业务 */ } finally { lock.unlock(); }
}相关
- Spring Boot 分布式锁
- Cluster(单 key 锁)
- 秒杀