Redisson分布式锁的实现原理
加锁机制
如果该客户端面对的是一个 redis cluster 集群,他首先会根据 hash节点选择一台机器。发送 lua 脚本到 redis 服务器上,脚本如下

如果该客户端面对的是一个 redis cluster 集群,他首先会根据 hash节点选择一台机器。发送 lua 脚本到 redis 服务器上,脚本如下
"if (redis.call('exists',KEYS[1])==0) then "+ --看有没有锁
"redis.call('hset',KEYS[1],ARGV[2],1) ; "+ --无锁 加锁 "redis.call('pexpire',KEYS[1],ARGV[1]) ; "+ "return nil; end ;" + "if
(redis.call('hexists',KEYS[1],ARGV[2]) ==1 ) then "+ --我加的锁
"redis.call('hincrby',KEYS[1],ARGV[2],1) ; "+ --重入锁
"redis.call('pexpire',KEYS[1],ARGV[1]) ; "+ "return nil; end ;" + "return
redis.call('pttl',KEYS[1]) ;" --不能加锁,返回锁的时间
lua的作用:保证这段复杂业务逻辑执行的原子性。
lua
的解释:
KEYS[1])
: 加锁的
key
ARGV[1]
:
key
的生存时间,默认为
30
ARGV[2]
: 加锁的客户端
ID (
UUID.randomUUID()
)
+ “:” + threadId
)
第一段
if
判断语句,就是用
“exists myLock”
命令判断一下,如果你要加锁的那个锁
key不存在的话,你就进行加锁。如何加锁呢?很简单,用下面的命令:
hset myLock