//解锁
lock.unlock();
}
return resultList;
}
是不是觉得这和我们平时调用本地锁没什么区别呢,没错Redisson就是这么朴实无华,代码简洁不说,内部还帮我们解决了上章中遗留的“锁续命”问题,下面就正式进入源码浅析!
首先通过Redisson客户端获取一把可重入锁,接着调用这个锁的lock()方法尝试加锁,进入lock()方法,如下,可以看到该方法其实还可以传入一个时间作为参数,这个时间代表锁的超时时间,到了这个时间锁就会被释放掉,如果我们没有传入超时时间,那么这个参数会被置为-1。
继续进入内部的lock()方法,里面主要是调用tryAcquire()方法尝试加锁,如果返回null则代表加锁成功返回,否则在后面用while循环继续尝试获取锁。
进入tryAcquire()→ tryAcquireAsync()方法,该方法首先会判断释放时间是否为-1,如果为-1则代表我们在前面没有传入超时时间,根据这个判断结果将会走两条不同的路。
**1、第一条路:**首先来看如果我们在前面传入了自定义超时时间,那么将会执行tryLockInnerAsync()方法,可以看到里面是很直接的在和redis通信,将一段lua脚本以及自定义的超时时间等信息传给redis进行占锁。需注意的是这个方法的返回值是Future,这里用到了异步编排,如果占锁成功,会在后面用这个返回值进行监听。
**2、第二条路:**如果没有传入超时时间,那么不仅会调用tryLockInnerAsync()方法,还会通过一个scheduleExpirationRenawal()的方法进行锁续期。
来看一下tryLockInnerAsync(
必看视频!获取2024年最新Java开发全套学习资料 备注Java
)方法在这里传入的参数,当前面没有传入超时时间时,这里传入了一个“internalLockLeaseTime”参数来替代,追踪这个参数值,可以看到在RedissonLock构造时为这个参数赋了值,而这个时间值就是配置中的“看门狗”的时间,这个值为30s。
也就是说,即使我们不传入超时时间,Redisson也会自动给我们设置一个默认的超时时间30s。
下面再来看神秘的scheduleExpirationRenawal()方法,这是在占锁成功后进行监听过程中涉及到的方法,须注意的是如果我们传入了自定义超时时间是不会执行该方法的。再看这个方法里面有一个重要的方法——renewExpiration(),看名字也能猜出来这是用于重新设置超时时间。进入这个方法,看核心部分可以知道主要是通过一个连接管理器创建了一个定时任务,任务的内容就是用lua脚本和redis通信重新设置超时时间,这个过期时间依然是看门狗的超时时间30s。
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
[外链图片转存中…(img-HinEfqkv-1716356233711)]
[外链图片转存中…(img-0RKzLb07-1716356233711)]