Redission分布式锁
使用及原理
//看门狗(锁)
RLock lock = redisson.getLock("myLock");
lock.lock();
lock.unlock();
加锁机制(源码Lua脚本分析1)
某个客户端要加锁,如果他面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器。这里注意,仅仅只是选择一台机器!这点很关键!
紧接着,就会发送一段lua脚本到该redis机器上。为什么要使用lua脚本?因为一大坨复杂的业务逻辑,可以通过封装在lua脚本中发送给redis,保证这段复杂业务逻辑执行的原子性。
首先解释一下名词:
KEYS[1] ——你加锁的那个key,比如代码里我们获取锁是这样的:RLock lock = redisson.getLock("myLock")。这里你自己设置了加锁的那个锁key就是“myLock”。
ARGV[1] ——锁key的默认生存时间,默认30秒。
ARGV[2] ——加锁的客户端的ID,类似于这样:8743c9c0-0795-4907-87fd-6c719a6b4586:1
第一段if判断语句,就是用 exists myLock 命令判断一下,如果你要加锁的那个锁key不存在的话,你就进行加锁。
如何加锁?如第2行lua脚本,创建一个名为myLock的hash结构数据,在redis中的命令就是:
hset myLock 8743c9c0-0795-4907-87fd-6c719a6b4586:1 1
而第3行lua脚本则会执行 pexpire myLock 30000 命令,设置myLock