以下是一个简单的分布式锁,使用了 Redis 来实现。这个示例中的分布式锁基于 Redis 的 SETNX 命令和 EXPIRE 命令。
import redis.clients.jedis.Jedis;
public class DistributedLock {
private final String lockName;
private final Jedis jedis;
public DistributedLock(String lockName, String redisHost, int redisPort) {
this.lockName = lockName;
// 创建 Jedis 实例,连接到 Redis 服务器
this.jedis = new Jedis(redisHost, redisPort);
}
public boolean tryLock() {
// 使用 SETNX 命令尝试在 Redis 中设置一个锁,该锁以锁的名称为键
if (jedis.setnx(lockName, "1") == 1) {
// 如果 SETNX 成功(返回值为 1),设置锁的过期时间
jedis.expire(lockName, 10);
return true;
}
// 如果 SETNX 失败(返回值为 0),表示锁已被其他进程或线程持有
return false;
}
public void releaseLock() {
// 通过删除键来释放锁
jedis.del(lockName);
}
public static void main(String[] args) {
String lockName = "myLock";
String redisHost = "localhost";
int redisPort = 6379;
DistributedLock lock = new DistributedLock(lockName, redisHost, redisPort);
if (lock.tryLock()) {
System.out.println("获取到锁");
// 持有锁的逻辑部分
lock.releaseLock();
} else {
System.out.println("未获取到锁");
}
}
}
以下是每行代码的解释:
● 在 DistributedLock 构造函数中,接受锁的名称和 Redis 服务器的主机和端口作为参数,并创建了一个 Jedis 实例来与 Redis 交互。
● tryLock 方法用于尝试获取锁。它使用 SETNX 命令尝试在 Redis 中设置一个锁,如果设置成功(返回值为 1),则表示获取到了锁。然后,通过 EXPIRE 命令设置锁的过期时间。
● releaseLock 方法用于释放锁。它通过 DEL 命令删除锁的键,从而释放锁。
● 在 main 方法中,创建了一个分布式锁实例,并调用 tryLock 方法尝试获取锁。根据获取锁的结果,输出相应的信息。
以上实例与 Redisson 都是用于实现分布式锁的解决方案,但它们之间有一些区别。
以上实例是一个简单的基于 Redis 的分布式锁实现,它使用了 Redis 的SETNX命令和EXPIRE命令来尝试获取锁并设置过期时间。这个实现相对简单,适用于一些简单的场景。
而 Redisson 是一个更完善和强大的分布式锁实现,它提供了更多的功能和特性,包括:
1.锁的超时自动释放:Redisson 支持设置锁的超时时间,当锁超过指定的时间未被释放时,Redisson 会自动释放锁,避免死锁的发生。
2.可重入锁:Redisson 支持可重入锁,即同一个线程可以多次获取同一个锁,而不会出现死锁。
3.锁的续租:Redisson 支持锁的续租功能,当持有锁的线程需要延长锁的超时时间时,可以通过续租来延长锁的有效时间。
4.集群支持:Redisson 支持在 Redis 集群环境中使用分布式锁,它可以自动处理节点故障和主从切换等情况。
5.更多的锁类型:Redisson 除了支持简单的分布式锁,还支持读写锁、公平锁等多种锁类型,以满足不同场景的需求。
总的来说,Redisson 提供了更强大、更完善的分布式锁实现,适用于更复杂的分布式系统。如果你的需求比较简单,可以使用以上实例中的简单实现;如果需要更复杂的功能和更好的可靠性,建议使用 Redisson 或其他成熟的分布式锁库。