下面是一个简单的基于Redis实现的分布式锁Java代码示例:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class DistributedLock {
private final Jedis jedis;
private final String lockKey;
private final String lockValue;
private final int expireTime; // 锁过期时间,单位:秒
public DistributedLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.lockValue = lockValue;
this.expireTime = expireTime;
}
public boolean tryLock() {
SetParams params = new SetParams();
params.nx(); // 只有键不存在时才设置值
params.ex(expireTime); // 设置过期时间,防止死锁
String result = jedis.set(lockKey, lockValue, params);
return "OK".equals(result);
}
public boolean releaseLock() {
// Redis不支持原子删除带有特定值的键,需要使用Lua脚本来实现
String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
return (Long) result == 1L;
}
}
使用示例:
Jedis jedis = new Jedis("localhost", 6379); // 连接到Redis服务器
DistributedLock lock = new DistributedLock(jedis, "my-lock", "my-value", 30); // 创建分布式锁
if (lock.tryLock()) { // 尝试获取锁
try {
// 执行需要加锁的代码,同一时刻只能有一个线程执行该代码
} finally {
lock.releaseLock(); // 释放锁
}
}