redison 的分布式锁是使用lua脚本实现(合并多次网络请求,原子性)
1.保证设值和设置超时时间是原子性
2.用守护线程完成锁的自动续期
3.优化了主备节点的锁同步
缺点:一般采用的是同步处理锁的变化,一个redis的节点抖动容易拖慢性能.
lua脚本如下:
if (redis.call('exists' KEYS[1]) == 0) then + -- exists 判断key是否存在
redis.call('hset' KEYS[1] ARGV[2] 1); + --如果不存在,hset存哈希表
redis.call('pexpire' KEYS[1] ARGV[1]); + --设置过期时间
return nil; + -- 返回null 就是加锁成功
end; +
if (redis.call('hexists' KEYS[1] ARGV[2]) == 1) then + -- 如果key存在,查看哈希表中是否存在
redis.call('hincrby' KEYS[1] ARGV[2] 1); + -- 给哈希中的key加1,代表重入1次,以此类推
redis.call('pexpire' KEYS[1] ARGV[1]); + -- 重设过期时间
return nil; +
end; +
return redis.call('pttl' KEYS[1]); --如果前面的if都没进去,说明ARGV2 的值不同,也就是不是同 一线程的锁,这时候直接返回该锁的过期时间
1333



被折叠的 条评论
为什么被折叠?



