/**
* 分布式事务锁
*
* @param key 使用key来当锁,唯一
* @param val 解锁依据
* @param time 超时时间 时间过后,key将会自动删除,避免死锁
* @return true 为上锁成功,false为上锁失败
*/
public static boolean setnx(String key, String val, long time) {
boolean flag;
RedisConnection connection = stringRedisTemplate.getConnectionFactory().getConnection();
try {
flag = connection.setNX(key.getBytes(), val.getBytes());
} finally {
connection.close();
}
if (flag){
stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);}
return flag;
}
/**
* 基于redis的分布式同步锁版本2,保证了加锁与设置超时时间两个动作的原子性
* @param key 使用key来当锁,唯一
* @param val 解锁依据
* @param time 超时时间 时间过后,key将会自动删除,避免死锁
* @return
*/
public static boolean setDistributedLock(String key, String val, long time) {
boolean flag = false;
RedisConnection connection = stringRedisTemplate.getConnectionFactory().getConnection();
try {
connection.set(key.getBytes(), val.getBytes(), Expiration.from(time,TimeUnit.SECONDS), RedisStringCommands.SetOption.UPSERT);
flag = true;
} finally {
connection.close();
}
return flag;
}
@Override
public void execute() {
if (RedisUtil.setnx(BLOCK_REDIS_REFRESH, BLOCK_REDIS_REFRESH, NX_TIME_OUT)) {
try {
} finally {
RedisUtil.deleteString(BLOCK_REDIS_REFRESH);
}
}
}