redis分布式锁

发布时间 2023-09-01 12:03:27作者: 一个有理想的猿

public
static final String SET_NX_SCRIPT = "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end";
public Boolean setNx(String key, Long expire) {
    return stringRedisTemplate.execute(new DefaultRedisScript<>(SET_NX_SCRIPT, Boolean.class), Collections.singletonList(key), 1, expire);
}

执行脚本语言所需要参数,会在execute()方法中的参数中获取也就是    KEYS[1], ARGV[1]     keys[1]指的是Collections.singletonList(key),

                                          ARGV[1] 指的是 ’1‘(内容)   ARGV[2]指的是 expire(时间)

 

setIfAbsent(K key, V value, long timeout, TimeUnit unit);

上面这个方法就是实现Redis分布式锁的方法,但是这个方法有问题就是,设置key对应的value值与key存活时间是分两步进行的,

如果在多线程的情况下刚设置完key,在设置key的存活时间之前做了一些别的操作 或者 刚设置完key,Redis宕机了,那么这个锁将永远不会消失(除非你打开Redis自行删除)

所以可以选择最上面的方法,执行lua脚本语言进行原子操作可以排除这个问题(Redis就是用lua写的)