美文网首页互联网科技码农的世界Java
面试官问我,Redis分布式锁如何续期?懵了

面试官问我,Redis分布式锁如何续期?懵了

作者: 433c801e5456 | 来源:发表于2019-07-04 16:15 被阅读3次

    真实案例

    面试官问我,Redis分布式锁如何续期?懵了

    Redis分布式锁的正确姿势

    据肥朝了解,很多同学在用分布式锁时,都是直接百度搜索找一个Redis分布式锁工具类就直接用了.关键是该工具类中还充斥着很多System.out.println();等语句.其实Redis分布式锁比较正确的姿势是采用redisson这个客户端工具.具体介绍可以搜索最大的同性交友网站github.

    如何回答

    首先如果你之前用Redis的分布式锁的姿势正确,并且看过相应的官方文档的话,这个问题So easy.我们来看

    面试官问我,Redis分布式锁如何续期?懵了

    坦白说,如果你英文棒棒哒那么看英文文档可能更好理解

    By default lock watchdog timeout is 30 seconds and can be changed through Config.lockWatchdogTimeout setting.

    但是你如果看的是中文文档

    看门狗检查锁的超时时间默认是30秒

    这句话肥朝从语文角度分析就是一个歧义句,他有两个意思

    <pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">1.看门狗默认30秒去检查一次锁的超时时间
    2.看们狗会去检查锁的超时时间,锁的时间时间默认是30秒
    </pre>

    看到这里,我希望大家不要黑我的小学体育老师,虽然他和语文老师是同个人.语文不行,我们可以源码来凑!

    源码分析

    我们根据官方文档给出的例子,写了一个最简单的demo,例子根据上面截图中Ctr+C和Ctr+V一波操作,如下

    面试官问我,Redis分布式锁如何续期?懵了

    create

    面试官问我,Redis分布式锁如何续期?懵了

    从这里我们知道,internalLockLeaseTime 和 lockWatchdogTimeout这两个参数是相等的.

    lockWatchdogTimeout默认值如下

    面试官问我,Redis分布式锁如何续期?懵了

    从internalLockLeaseTime这个单词也可以看出,这个加的分布式锁的超时时间默认是30秒.但是还有一个问题,那就是这个看门狗,多久来延长一次有效期呢?我们往下看

    lock

    面试官问我,Redis分布式锁如何续期?懵了

    从我图中框起来的地方我们就知道了,获取锁成功就会开启一个定时任务,也就是watchdog,定时任务会定期检查去续期renewExpirationAsync(threadId).

    这里定时用的是netty-common包中的HashedWheelTimer,肥朝公众号已经和各大搜索引擎建立了密切的合作关系,你只需要把这个类在任何搜索引擎一搜,都能知道相关API参数的意义.

    从图中我们明白,该定时调度每次调用的时间差是internalLockLeaseTime / 3.也就10秒.

    真相大白

    通过源码分析我们知道,默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒.那这个时候可能又有同学问了,那业务的机器万一宕机了呢?宕机了定时任务跑不了,就续不了期,那自然30秒之后锁就解开了呗.

    多年Java开发,今年年初,我根据目前市场技术栈的需求,录制了一套2019最新Java精讲视频教程,如果你现在正在学习Java,在入门学习Java的顾聪当中缺乏这样的一份视频教程,或者说有任何行业,技术方面的问题,你都可以加入我的Java学习交流qun:494,801,931,即可免费获取,群文件里面还有我整理的学习手册,面试题,开发工具,PDF文档教程,需要的话可以自己去下载。

    相关文章

      网友评论

        本文标题:面试官问我,Redis分布式锁如何续期?懵了

        本文链接:https://www.haomeiwen.com/subject/wperhctx.html