Redisson 工作原理-源码分析
1:Redisson 是什么
个人理解:一种 可重入、持续阻塞、独占式的 分布式锁协调框架,可从 ReentrantLock 去看它。
①:可重入
拿到锁的线程后续拿锁可跳过获取锁的步骤,只进行value+1的步骤。
②:持续阻塞
获取不到锁的线程,会在一定时间内等待锁。
日常开发中,应该都用过redis 的setnx 进行分布式的操作吧,那setnx 返回了false我们第一时间是不是就结束了?
因此redisson 优化了这个步骤,拿不到锁会进行等待,直至timeout 。
③:独占式
很好理解,同一环境下理论上只能有一个线程可以获取到锁。
对于redis 集群模式下,若master 的锁还没有同步给slave,这时 master 挂掉,然后哨兵选举出新的master,
由于新的 master 并没有同步到锁,所以这个时候其他的线程仍然能获取到锁。因此独占式在一定条件下是会失效的。
这个观点在另外几篇参考的文章中也有提到,个人也比较赞同,因此在此写个笔记。
2:示例代码
redisson的GitHub地址:https://github.com/redisson/redisson
我用的是boot-starter,配置参考官网给出的就行了。
测试代码块:

是不是和ReentrantLock 很像呢?
贴上我画的草图再讲后面的内容:

3:如何获取锁
获取锁的操作采用lua脚本的形式,以保证指令的原子性。

从截图上的序号来说步骤:
①:如果锁不存在,则进行hincrby 操作(key不存在则value等于1,占锁),并设置过期时间,然后返回nil。
②:如果锁存在且 key 也存在,则进行hincrby操作(可重入锁思想),并以毫秒为单位重新设置过期时间(续命),然后返回nil。
③:如果只存在锁,key 不存在,则说明有其他线程获取到了锁(当前线程需要等待),需要返回锁的过期时间。
从上述中就可以看出这个锁是 hash 结构的:

而key的组成应该是:{uuid}:{threadid}
不信?我给你截图...
①:RedissonBaseLock.getLockName(long threadId)

②:MasterSlaveConne
原创不易,完成人机校验,阅读全文