Redison分布式锁加锁过程
2022-11-23 17:39:18 0 举报
Redison分布式锁加锁过程
作者其他创作
大纲/内容
unlock()1.lua脚本中删除key,publish发布解锁命令2.执行LockPubSub中的onMessage方法, value.getLatch().release()唤醒channel中对应的线程,表示可以去加锁了
加锁失败后,返回的是ttl,也就是锁剩余的过期时间1.订阅redisson_lock__channel:{lockName}这个channel频道,lockName是锁名称2.while(true)死循环,先去获取锁一次,跟加锁逻辑一样,成功则执行,否则返回ttl3.如果剩余的时间大于等于0,则将线程tryAcquire(Semaphore的方法)休眠ttl时间,这个方法会释放cpu资源
成功
后台线程
释放锁unlock()
失败
加锁(tryAcquire)
加锁失败同样是用lua脚本,执行的命令是ttl,也就是返回锁的剩余过期时间
加锁使用的是lua脚本,加锁成功分为两种情况:1.第一次加锁成功,也就是setnx成功,返回null2.并不是第一次加锁,就是同样的线程加锁第二次或者第三次等等,也就是重入锁的操作,即redisson.getLock是可重入锁,这个时候做了两个操作:将锁对应的key,执行incrby(key,1)、将key的过期时间刷新为watchdogTime(默认为30s),返回的同样是null
Redis(slave)
renewExpiration()future线程定时任务,delay 锁过期时间的1/3,刷新锁的时间(默认为30s)
redisson
Redis(master)
0 条评论
下一页