1、原理
2、redission
(1)lock()源码
(2)看门狗
(3)redlock算法
(4)mq消息幂等
3、面试题剖析
(1)客户端线程在底层是如何实现加锁的?
先定位master节点:
通过key计算出CRC16值,再CRC16值对16384取模得hash slot,通过这个hash slot定位redis-cluster集群中的master节点
加锁:
加锁逻辑底层是通过lua脚本来实现的,如果客户端线程第一次去加锁的话,会在key对应的hash数据结构中添加线程标识UUID:ThreadId 1,指定该线程当前对这个key加锁一次了。
2、客户端线程是如何维持加锁的?
当加锁成功后,此时会对加锁的结果设置一个监听器,如果监听到加锁成功了,也就是返回的结果为空,此时就会在后台通过watchdog看门狗机制、启动一个后台定时任务,每隔10s执行一次,检查如果key当前依然存在,就重置key的存活时间为30s。
维持加锁底层就是通过后台这样的一个线程定时刷新存活时间维持的。
网友评论