
如何使用Redis和Java开发分布式锁功能
import redis.clients.jedis.Jedis;
public class DistributedLock {
private static final String LOCK_KEY = "distributed_lock";
private static final int LOCK_TIMEOUT = 3 * 1000; // 锁的超时时间,单位为毫秒
private Jedis jedis;
public DistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean lock() {
long start = System.currentTimeMillis();
try {
while (true) {
String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", LOCK_TIMEOUT);
if ("OK".equals(result)) {
return true;
} else {
// 进行重试
Thread.sleep(100);
}
long end = System.currentTimeMillis();
if (end - start > LOCK_TIMEOUT) {
// 超时退出
return false;
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
public void unlock() {
jedis.del(LOCK_KEY);
}
}LOCK_KEY作为分布式锁的键,这个键在所有节点中必须保持唯一。另外,设置了一个LOCK_TIMEOUT常量来表示锁的超时时间。在lock方法中,首先获取当前时间作为开始时间,然后使用一个无限循环来尝试获取分布式锁。在循环中,使用Redis的set命令进行设置操作,设置键为LOCK_KEY,值为"locked",并且设置了NX和PX选项,NX表示只有键不存在时才执行设置操作,PX表示设置键的过期时间为LOCK_TIMEOUT毫秒。
如果设置成功,则表示获取锁成功,方法返回true;否则继续进行重试,每次重试时会等待100毫秒。同时,还需要判断获取锁的时间是否超过了LOCK_TIMEOUT的值,如果超过则表示获取锁的等待时间已经过长,放弃获取锁,并返回false。
在unlock方法中,通过调用del命令删除分布式锁的键。
立即学习“Java免费学习笔记(深入)”;
import redis.clients.jedis.Jedis;
public class LockTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
DistributedLock lock = new DistributedLock(jedis);
try {
if (lock.lock()) {
// 获取到分布式锁后执行需要保护的代码
System.out.println("获取到分布式锁");
// ... 执行需要保护的代码
} else {
System.out.println("获取分布式锁失败");
}
} finally {
lock.unlock();
}
}
}在调用示例中,首先创建了一个Jedis连接对象,然后创建了一个DistributedLock对象,并传入Jedis连接对象作为参数。在try-finally块中,先尝试获取分布式锁,如果成功则输出"获取到分布式锁",并执行需要保护的代码,然后在finally块中释放分布式锁。
以上就是如何使用Redis和Java开发分布式锁功能的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号