面试官问我,Redis分布式锁如何续期?懵了。
真实案例
Redis分布式锁的正确姿势
据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多
System.out.println();等语句.其实Redis分布式锁比较正确的姿势是采用
redisson这个客户端工具.具体介绍可以搜索最大的同性交友网站
github.
如何回答
首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题
So easy.我们来看
坦白说,如果你英文棒棒哒那么看英文文档可能更好理解
By default lock watchdog timeout is 30 seconds and can be changed through Config.lockWatchdogTimeout setting.
但是你如果看的是中文文档
看门狗检查锁的超时时间默认是30秒
这句话肥朝从语文角度分析就是一个歧义句,他有两个意思
1.看门狗默认30秒去检查一次锁的超时时间
2.看门狗会去检查锁的超时时间,锁的时间时间默认是30秒
看到这里,我希望大家不要黑我的小学体育老师,虽然他和语文老师是同个人.语文不行,我们可以源码来凑!
源码分析
我们根据官方文档给出的例子,写了一个最简单的demo,例子根据上面截图中
Ctr+C和Ctr+V一波操作,如下
[code] 1public class DemoMain { 2 3 public static void main(String[] args) throws Exception { 4 Config config = new Config(); 5 config.useSingleServer().setAddress("redis://127.0.0.1:6379"); 6 7 RedissonClient redisson = Redisson.create(config); 8 RLock lock = redisson.getLock("anyLock"); 9 10 lock.lock(); 11 //lock.unlock(); 12 } 13}
create
从这里我们知道,
internalLockLeaseTime和
lockWatchdogTimeout这两个参数是相等的.
lockWatchdogTimeout默认值如下
[code] 1public class Config { 2 3 private long lockWatchdogTimeout = 30 * 1000; 4 5 public long getLockWatchdogTimeout() { 6 return lockWatchdogTimeout; 7 } 8 9 //省略无关代码 10}
从
internalLockLeaseTime这个单词也可以看出,这个加的分布式锁的超时时间默认是30秒.但是还有一个问题,那就是这个看门狗,多久来延长一次有效期呢?我们往下看
lock
从我图中框起来的地方我们就知道了,获取锁成功就会开启一个定时任务,也就是
watchdog,定时任务会定期检查去续期
renewExpirationAsync(threadId).
这里定时用的是
netty-common包中的
HashedWheelTimer,肥朝公众号已经和各大搜索引擎建立了密切的合作关系,你只需要把这个类在任何搜索引擎一搜,都能知道相关API参数的意义.
从图中我们明白,该定时调度每次调用的时间差是
internalLockLeaseTime / 3.也就10秒.
真相大白
通过源码分析我们知道,默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒.那这个时候可能又有同学问了,那业务的机器万一宕机了呢?宕机了定时任务跑不了,就续不了期,那自然30秒之后锁就解开了呗.
我总结出了互联网公司java程序员在面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料)大家可以关注我获取更多干货!
获取资料的方式:加群:739486042 进群即可获取!
- Redis实现分布式锁(setnx、getset、incr)以及如何处理超时情况(一)
- Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁
- 如何用redis实现分布式锁
- 如何操作Redis和zookeeper实现分布式锁
- 如何用 redis 造一把分布式锁
- 程序员如何写一份另面试官眼前一亮的简历
- 如何用 redis 实现分布式幂等服务中间件
- win10 下 如何安装 redis
- 如何停止/重启/启动redis服务
- 如何使用RedisTemplate访问Redis数据结构
- 18 redis如何通过读写分离来承载读请求QPS超过10万+?
- 基于Redis的分布式锁实现
- Redis 2.4:后台线程如何解决aof缺陷?【转】
- 如何搭建一个 Redis 集群
- 如何选择Redis的数据结构?
- 如何实现redis分布式缓存
- 如何增大Redis的客户端连接数?
- 如何在ASP.NET Core中使用Redis
- Redis实现分布式锁
- 基于Redis实现分布式锁