Redis 分布式锁的正确用法

44 阅读1分钟

在高并发场景下,多个线程/服务可能同时操作共享资源,比如库存扣减。这时就需要分布式锁来保证数据一致性。Redis 是常见的实现方案。

1. 基础实现

最简单的分布式锁是用 SETNX

SET lock_key unique_value NX EX 30
  • NX:仅当 key 不存在时才设置
  • EX 30:设置过期时间,避免死锁

2. 释放锁

只有持有锁的客户端才能释放:

if redis.get(lock_key) == unique_value:
    redis.del(lock_key)

3. 存在的问题

  • 锁超时:业务没执行完,锁就过期,可能导致多个客户端同时进入临界区
  • 主从延迟:Redis 主从同步延迟可能导致锁丢失

4. 推荐方案

  • 使用 Redisson,它内部实现了看门狗机制和更安全的锁管理。
  • 关键配置:
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");

RedissonClient redisson = Redisson.create(config);

RLock lock = redisson.getLock("myLock");
lock.lock();
try {
    // 业务逻辑
} finally {
    lock.unlock();
}

5. 总结

  • 简单场景:可以用 SETNX + EX
  • 复杂场景:推荐用 Redisson
  • 分布式锁不是万能的,要结合业务需求谨慎使用