获取锁:setnx,并设置超时时间
释放锁:执行lua脚本,先判断key的值是否为传入的value,是的话,再执行delete。
public Boolean getLock(String key, String value, long timeout, TimeUnit timeUnit){
return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit);
}
public void delLock(String key, String value){
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end ";
DefaultRedisScript<Integer> redisScript = new DefaultRedisScript<Integer>();
redisScript.setScriptText(script);
redisScript.setResultType(Integer.class);
Long res = (Long) redisTemplate.execute(redisScript, Collections.singletonList(key), value);
System.out.println(res);
}