Java Redis 同步全局锁实现:锁失败继续尝试锁定
要实现 Java Redis 同步全局锁,并在锁失败时继续尝试锁定,可以使用 Redis 的 SETNX 命令来实现。
SETNX 命令用于设置一个键的值,仅当键不存在时才会设置成功。我们可以利用这个特性来实现全局锁。
以下是一个示例代码:
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String LOCK_KEY = 'global_lock';
private static final int LOCK_EXPIRE = 60; // 锁的过期时间,单位为秒
private Jedis jedis;
public RedisLock() {
jedis = new Jedis('localhost');
}
public boolean lock() {
long result = jedis.setnx(LOCK_KEY, 'locked');
if (result == 1) {
jedis.expire(LOCK_KEY, LOCK_EXPIRE);
return true;
}
return false;
}
public void unlock() {
jedis.del(LOCK_KEY);
}
public static void main(String[] args) {
RedisLock redisLock = new RedisLock();
boolean locked = redisLock.lock();
if (locked) {
try {
// 执行需要加锁的代码
System.out.println('Lock acquired, executing critical section...');
Thread.sleep(5000); // 模拟执行时间
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
redisLock.unlock();
System.out.println('Lock released');
}
} else {
System.out.println('Failed to acquire lock');
}
}
}
在上面的示例中,我们首先创建了一个 RedisLock 类,它负责与 Redis 服务器进行通信。在 lock() 方法中,我们使用 SETNX 命令尝试设置一个键为 'global_lock' 的值为 'locked',如果设置成功,则表示获得了锁,并设置了过期时间。如果设置失败,说明锁已经被其他线程占用,此时返回 false。
在 main() 方法中,我们首先尝试获得锁,如果成功,则执行需要加锁的代码,并在最后释放锁。如果锁失败,则打印一条失败消息。
注意,上述代码中的锁并不是线程安全的,如果多个线程同时调用 lock() 方法,可能会出现竞争条件。为了确保线程安全,可以使用分布式锁的解决方案,如 Redission、Curator 等。
原文地址: https://www.cveoy.top/t/topic/fTFy 著作权归作者所有。请勿转载和采集!