private static final Long SUCCESS = 1L;
private static String script1 = "if redis.call('setNx',KEYS[1],ARGV[1]) then " +
" if redis.call('get',KEYS[1])==ARGV[1] then " +
" return redis.call('expire',KEYS[1],ARGV[2]) " +
" else " +
" return 0 " +
" end " +
"end" ;
private RedisScript<String> lockRedisScript1 = new DefaultRedisScript<>(script1, String. class );
private static String script2 = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" ;
private RedisScript<String> unLockRedisScript = new DefaultRedisScript<>(script2, String. class );
@Override
public boolean lock(String lockKey, String value, long expireTime) {
redisTemplate.setKeySerializer( new StringRedisSerializer());
redisTemplate.setValueSerializer( new StringRedisSerializer());
Object result = redisTemplate.execute(lockRedisScript1, Collections.singletonList(lockKey), value, String.valueOf(expireTime));
return SUCCESS.equals(result);
}
@Override
public boolean unlock(String lockKey, String value) {
try {
Object result = redisTemplate.execute(unLockRedisScript, Collections.singletonList(lockKey), value);
if (SUCCESS.equals(result)) {
return true ;
}
} catch (Exception e) {
e.printStackTrace();
}
return false ;
}