一. 基于Redis的分布式锁
1.名词解释
Redis 是一种内存数据库,其特点之一就是支持原子性操作,这使得它成为实现分布式锁的理想选择。基于 Redis 实现的分布式锁主要依赖于 Redis 的 SETNX(SET if Not eXists)命令,该命令用于设置键的值,但仅在键不存在时设置成功。锁的释放则可以通过 DEL 命令或设置过期时间来实现。
实现步骤:
- 客户端请求获取锁时,调用 SETNX 命令尝试将某个唯一标识符作为键名存入 Redis 中,如果 SETNX 执行成功,则获取到锁。
- 如果 SETNX 执行失败,则表示锁已被其他客户端占用,客户端可以选择重试或放弃。
- 获取到锁的客户端在完成操作后,通过 DEL 命令删除键来释放锁,或者可以为键设置过期时间,确保即使客户端崩溃或网络中断,锁也会自动释放。
优点:
- 实现简单,易于理解和部署。
- Redis 的高性能和可靠性保证了分布式锁的性能和稳定性。
缺点:
- 锁的获取和释放不是原子操作,可能会导致死锁或锁过期等问题。
- 锁的粒度较粗,无法支持细粒度的锁。
2.代码实现
下面是一个基于 Redis 的分布式锁的 Java 代码示例:
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private final Jedis jedis;
private final String lockKey;
private final int expireTimeMs;
private boolean locked = false;
public RedisDistributedLock(Jedis jedis, String lockKey, int expir