import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
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";
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
/**
* 尝试获取分布式锁
* @param lockKey 锁的key
* @param requestId 请求标识
* @param expireTime 锁的超时时间(毫秒)
* @return 是否成功获取锁
*/
public boolean tryGetLock(String lockKey, String requestId, int expireTime) {
SetParams params = new SetParams();
params.nx().px(expireTime);
String result = jedis.set(lockKey, requestId, params);
return LOCK_SUCCESS.equals(result);
}
/**
* 释放分布式锁
* @param lockKey 锁的key
* @param requestId 请求标识
* @return 是否成功释放锁
*/
public boolean releaseLock(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, 1, lockKey, requestId);
return result != null && (Long) result == 1L;
}
}
tryGetLock
方法:
SET
命令并带上 NX
和 PX
参数来实现加锁操作。NX
表示只有当锁不存在时才设置锁。PX
表示设置锁的过期时间,单位为毫秒。"OK"
,则表示成功获取锁。releaseLock
方法:
Jedis
:
Jedis
是一个 Redis 的 Java 客户端库,用于与 Redis 服务器进行交互。上一篇:java 延迟队列
下一篇:java divide函数
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站