一、分布式锁的必要性
在分布式系统中,当多个节点需要对共享资源进行读写操作时,传统的本地锁(如Java的synchronized或ReentrantLock)无法跨节点生效。此时,必须引入分布式锁来保证操作的原子性和一致性。分布式锁需满足以下核心特性:
- 互斥性:任意时刻仅一个客户端持有锁
- 防死锁:即使持有锁的客户端崩溃,锁仍可被释放
- 可重入性:同一客户端可多次获取同一把锁
- 一致性:解锁操作必须由锁的持有者执行
二、Redis分布式锁实现
Redis实现分布式锁主要利用Redis的setnx命令。
SETNX key value 是 Redis 的原子性命令,用于设置键值对,仅当键不存在时生效,否则不执行任何操作。
1. 基础实现(SETNX+EXPIRE)
// 加锁(非原子操作)
if (redisTemplate.execute((RedisCallback<Long>) connection -> connection.setNX(lockKey.getBytes(), UUID.randomUUID().toString().getBytes())) == 1) {
redisTemplate.expire(lockKey, expireTime, TimeUnit.SECONDS);
return true;
}
return false;
- 问题:SETNX与EXPIRE的非原子性导致可能存在锁未设置过期时间的风险
2. 原子化实现(SET命令增强)
// 原子化加锁
Boolean success = redisTemplate.execute((RedisCallback<Boolean