在Java中,你可以使用Jedis或者Redisson等客户端库来实现Redis分布式锁。以下是使用Jedis来实现Redis分布式锁的一个简单示例:
首先,确保你已经添加了Jedis的依赖到你的项目中。如果你使用Maven,可以在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version> <!-- 请检查并使用最新版本 -->
</dependency>
接下来是实现分布式锁的Java代码:
import redis.clients.jedis.Jedis;
import java.util.Collections;
import java.util.Set;
public class RedisDistributedLock {
private static final String LOCK_SUCCESS = "OK";
private static final String SET_IF_NOT_EXIST = "NX";
private static final String SET_WITH_EXPIRE_TIME = "PX";
/**
* 尝试获取分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @param expireTime 预期锁的过期时间(单位:毫秒)
* @return 是否获取成功
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
return LOCK_SUCCESS.equals(result);
}
/**
* 释放分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @return 是否释放成功
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
"return redis.call('del', KEYS[1]) " +
"else " +
"return 0 " +
"end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
return LOCK_SUCCESS.equals(result.toString());
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost"); // Redis服务器地址
String lockKey = "myLock";
String requestId = Thread.currentThread().getId() + ""; // 可以使用UUID等其他唯一标识代替
int expireTime = 10000; // 锁过期时间10秒
// 尝试获取锁
if (tryGetDistributedLock(jedis, lockKey, requestId, expireTime)) {
try {
// 获取锁成功,执行需要保护的代码
System.out.println("Acquired lock, doing some work...");
// 模拟耗时操作
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 释放锁
releaseDistributedLock(jedis, lockKey, requestId);
System.out.println("Lock released.");
}
} else {
// 获取锁失败
System.out.println("Failed to acquire lock.");
}
// 关闭Jedis连接
if (jedis != null) {
jedis.close();
}
}
}
在这个示例中,我们定义了两个方法:tryGetDistributedLock
和 releaseDistributedLock
。tryGetDistributedLock
方法尝试获取锁,它使用set
命令的NX
和PX
选项来实现。如果锁不存在,则设置锁并设置过期时间;如果锁已存在,则不做任何操作。releaseDistributedLock
方法用于释放锁,它使用Lua脚本来确保只有当锁由当前请求持有时才删除锁。
在main
方法中,我们创建了一个Jedis实例来连接Redis服务器,并尝试获取锁。如果获取成功,则执行一些需要保护的代码,并在完成后释放锁。
请注意,这个示例仅用于教学目的,它假设只有一个Redis实例,没有考虑Redis集群或哨兵模式。在生产环境中,你可能需要使用Redisson等更强大的库,它们提供了更多的特性和更好的可靠性。