前言

上一篇[面试官问我,使用Dubbo有没有遇到一些坑?我笑了。]之后,又有一位粉丝和我说在面试过程中被虐了.鉴于这位粉丝是之前肥朝的老粉丝,而且周一又要开启新一轮的面试,为了回馈他长期以来的支持,所以连夜写了本篇,希望能对他接下来的面试有所帮助.

真实案例

图片

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一波操作,如下

 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默认值如下

 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开发,我们只调接口,不调情!


更多相关文章

  1. 分布式系统架构常见面试知识点梳理(每次面试都会问到其中某一块知
  2. 分布式系统架构常见知识点梳理
  3. 带有过期时间的LRU实现(java版)
  4. 不看教程,可能更浪费你的时间
  5. Redission 实现分布式锁
  6. 抽点时间写篇文章都是享受
  7. JDK 1.8 中的日期与时间 API 一览
  8. 4: zabbix5.0自动发现网站域名并监控访问状态和请求时间

随机推荐

  1. sklearn.LabelEncoder以前从未见过的值
  2. python函数篇0-2
  3. [LeetCode] 682. Baseball Game 棒球游戏
  4. Python2.7.13,Anaconda环境下Opencv2编程b
  5. RobotFramework中加载自定义python包中的
  6. jmeter 调用python的方法三种 (还没试)
  7. 将muilti维Json数组解析为Python
  8. python常用数据类型-字典
  9. 为什么Python的eval()拒绝这个多行字符串
  10. python3编写网络爬虫21-scrapy框架的使用