在高并发场景下,多个线程/服务可能同时操作共享资源,比如库存扣减。这时就需要分布式锁来保证数据一致性。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
- 分布式锁不是万能的,要结合业务需求谨慎使用