Redis 分布式锁的原理
Redis 分布式锁的核心目标是确保在分布式系统中,同一时刻只有一个客户端能访问共享资源。其实现依赖于 Redis 的单线程特性,通过 SETNX
(SET if Not eXists)命令或 Redisson
等客户端工具实现。
常见的实现方式分为两类:
- 基于
SETNX
和过期时间:通过设置键值对和超时机制避免死锁。 - 基于 RedLock 算法:由多个独立的 Redis 节点组成,通过多数派确认锁的获取。
关键点包括:
- 互斥性:锁必须由唯一客户端持有。
- 防死锁:即使客户端崩溃,锁也需自动释放。
- 容错性:Redis 节点故障时仍能正常工作。
基于 SETNX 的实现
通过 Redis 的 SET
命令结合 NX
(不存在时设置)和 PX
(过期时间)参数实现基础分布式锁。以下是一个简单示例:
public class RedisDistributedLock {
private final StringRedisTemplate redisTemplate;
private static final String LOCK_PREFIX = "LOCK:";
private static final long DEFAULT_EXPIRE = 30000; // 30秒
public boolean lock(String key, String value) {
return redisTemplate.opsForValue().setIfAbsent(
LOCK_PREFIX + key,
value,
Duration.ofMillis(DEFAULT_EXPIRE)
);
}
public boolean unlock(String key, String value) {
String currentValue = redisTemplate.opsForValue().get(LOCK_PREFIX + key);
if (Objects.equals(value, currentValue)) {
redisTemplate.delete(LOCK_PREFIX + key);
return true;
}
return false;
}
}
缺陷:
- 非原子性操作可能导致锁误删。
- 锁续期问题需额外处理。
使用 Redisson 实现高可靠
Redis 分布式锁的原理
Redis 分布式锁的核心目标是确保在分布式系统中,同一时刻只有一个客户端能访问共享资源。其实现依赖于 Redis 的单线程特性,通过 SETNX
(SET if Not eXists)命令或 Redisson
等客户端工具实现。
常见的实现方式分为两类:
- 基于
SETNX
和过期时间:通过设置键值对和超时机制避免死锁。 - 基于 RedLock 算法:由多个独立的 Redis 节点组成,通过多数派确认锁的获取。
关键点包括:
- 互斥性:锁必须由唯一客户端持有。
- 防死锁:即使客户端崩溃,锁也需自动释放。
- 容错性:Redis 节点故障时仍能正常工作。
基于 SETNX 的实现
通过 Redis 的 SET
命令结合 NX
(不存在时设置)和 PX
(过期时间)参数实现基础分布式锁。以下是一个简单示例:
public class RedisDistributedLock {
private final StringRedisTemplate redisTemplate;
private static final String LOCK_PREFIX = "LOCK:";
private static final long DEFAULT_EXPIRE = 30000; // 30秒
public boolean lock(String key, String value) {
return redisTemplate.opsForValue().setIfAbsent(
LOCK_PREFIX + key,
value,
Duration.ofMillis(DEFAULT_EXPIRE)
);
}
public boolean unlock(String key, String value) {
String currentValue = redisTemplate.opsForValue().get(LOCK_PREFIX + key);
if (Objects.equals(value, currentValue)) {
redisTemplate.delete(LOCK_PREFIX + key);
return true;
}
return false;
}
}
缺陷:
- 非原子性操作可能导致锁误删。
- 锁续期问题需额外处理。