public class RedisTool {
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 static final Long RELEASE_SUCCESS = 1L;
/**
* 尝试获取分布式锁
*
* @param jedis
* Redis客户端
* @param lockKey
* 锁
* @param requestId
* 请求标识
* @param expireTime
* 超期时间
* @return 是否获取成功
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, long 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 jedis
* Redis客户端
* @param lockKey
* 锁
* @param requestId
* 请求标识
* @return 是否释放成功
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) throws FailException {
boolean bool = false;
try {
// Lua代码,可以确保原子性(eval命令执行Lua代码的时候,Lua代码将被当成一个命令去执行,并且直到eval命令执行完成,Redis才会执行其他命令)
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 (RELEASE_SUCCESS.equals(result)) {
bool = true;
}
} catch (Exception e) {
bool = false;
}
return bool;
}
/**
* 尝试获取分布式锁(循环获取一定时间)
*
* @param jedis
* Redis客户端
* @param lockKey
* 锁
* @param requestId
* 请求标识
* @param expireTime
* 超期时间
* @param waitTime
* 循环获取等待时长
* @return 是否获取成功
*/
public static boolean tryGetDistributedLockInfo(Jedis jedis, String lockKey, String requestId, long expireTime, long waitTime) {
boolean bool = false;
long beginTime = System.currentTimeMillis();
while (beginTime + waitTime > System.currentTimeMillis()) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
bool = true;
break;
}
}
return bool;
}
public static void main(String[] args) {
Jedis jedis = RedisUtil.getJedis();
String requestId = UUID.randomUUID().toString();
System.out.println(tryGetDistributedLock(jedis, "000005_ACCOUNT", requestId, 3000));
String requestId01 = UUID.randomUUID().toString();
System.out.println(tryGetDistributedLock(jedis, "000005_ACCOUNT", requestId01, 3000));
Map<String, String> map = new HashMap<>();
System.out.println(System.currentTimeMillis());
map = jedis.hgetAll("AA");
System.out.println(map);
System.out.println(System.currentTimeMillis());
map = jedis.hgetAll("AA");
System.out.println(map);
try {
System.out.println(releaseDistributedLock(jedis, "000005_ACCOUNT", requestId));
System.out.println(tryGetDistributedLock(jedis, "000005_ACCOUNT", requestId01, 3000));
System.out.println(releaseDistributedLock(jedis, "000005_ACCOUNT", requestId01));
} catch (FailException e) {
e.printStackTrace();
}
;
}
}