import redis.clients.jedis.Jedis;
import java.util.Collections;
public class DistributedLock {
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";
private Jedis jedis; // Redis客户端
/**
* 尝试获取分布式锁
* @param lockKey 锁的key
* @param requestId 请求标识
* @param expireTime 超时时间(毫秒)
* @return 是否获取成功
*/
public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 释放分布式锁
* @param lockKey 锁的key
* @param requestId 请求标识
* @return 是否释放成功
*/
public boolean releaseDistributedLock(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));
if (result.toString().equals("1")) {
return true;
}
return false;
}
}
Jedis 作为 Redis 客户端,与 Redis 进行交互。SET 命令尝试设置锁。NX 表示只有当锁不存在时才设置,PX 表示设置锁的过期时间(以毫秒为单位)。true,表示获取锁成功;否则返回 false。true;否则返回 false。这个实现确保了分布式锁的安全性和可靠性。
上一篇:java 加密
下一篇:java list 交集
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站