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(); }
}

相关