玖叶教程网

前端编程开发入门

分布式锁redis与redission(分布式锁redis和zk)

以下是一个简单的分布式锁,使用了 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 或其他成熟的分布式锁库。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言