java Redission 分布式锁的使用
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private Jedis jedis;
private String lockKey; // 锁的键值
private int expireTime; // 锁的超时时间
public RedisDistributedLock(Jedis jedis, String lockKey, int expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.expireTime = expireTime;
}
// 尝试获取锁
public boolean tryLock() {
long expires = System.currentTimeMillis() + expireTime + 1;
String expiresStr = String.valueOf(expires); // 锁到期时间
if (jedis.setnx(lockKey, expiresStr) == 1) {
// 获取锁成功
jedis.expire(lockKey, expireTime); // 设置锁的过期时间
return true;
}
String currentValueStr = jedis.get(lockKey); // Redis里面的时间
if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) {
// 锁已经过期,获取新锁
String oldValueStr = jedis.getSet(lockKey, expiresStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {
// 获取锁成功
jedis.expire(lockKey, expireTime); // 设置锁的过期时间
return true;
}
}
// 其他情况,无法获取锁
return false;
}
// 释放锁
public void unlock() {
String currentValueStr = jedis.get(lockKey);
if (currentValueStr != null && Long.parseLong(currentValueStr) < System.currentTimeMillis()) {
// 锁已经过期,可以被其他线程获取,不需要执行删除
jedis.del(lockKey);
}
}
}
这个简化版本的RedisDistributedLock类提供了tryLock和unlock方法,用于尝试获取和释放分布式锁。这个实现假设Redis服务器运行正常且可以连接。在实际应用中,你需要处理Jedis实例的创建和关闭,异常处理,以及合理设置锁的超时时间等问题。
评论已关闭