哈喽!大家好,我是小奇,一位不靠谱的程序员
小奇打算以轻松风趣的对话形式来分享一些技术,如果你感觉通过小奇的文章学到了货色,那就给小奇一个赞吧
文章继续更新,能够微信搜寻【小奇 JAVA 面试】第一工夫浏览,回复【材料】更有我为大家筹备的福利哟!
一、前言
作为一名 Java 程序员,Redis 底层的一些原理是咱们 不用学会 就能够搬砖工作的一种技能点,然而小奇为什么还要讲一下呢?难道就是为了节约大家 1 分钟 的宝贵时间,一个人 1 分钟,50 万人就是 1 年,5000 万人就是100 年,赚了,小奇以一己之力胜利搞挂一个人(血赚)。
当然不是,并且小奇的文章也没有那么多人看,最多也就节约个 肾吧。
学习 Redis 底层原理是因为 面试官要问啊!,所以咱们就要学,什么?不实用的你不学?那街坊小奇可要使劲学啦,到时候面试官只有小奇不要你。
至于你问为什么面试官要问 Redis 底层原理呢,这个。。。我把这次机会留给你,下次你面试的时候面试官问:“讲一下 Redis 底层原理”。你:“面试官你好,请问为什么你要问 Redis 底层原理呢,你给我台电脑,我 五分钟 给你搭建好 图书管理系统 他不香吗,咱们键盘上见真章”。这时面试官就会通知你答案,你就能够把答案打在评论区,让小奇以及泛滥小伙伴一起晓得一下到底为什么要问?
二、面试
在一个晴朗的周日,我来到了一个生疏的园区(别问为什么是周日,问就是 997,不过为了填饱肚子的打工人,只能明知山有虎、偏差虎山行),坐在生疏的会议室,期待 HR 小姐姐去叫面试官,此时我的情绪和各位小伙伴一样五味杂陈,放心面试官问的会不会很难?问到我的常识盲区我该怎么办?一会自我介绍的时候要不要吹一下我和小奇的关系?
一位英俊潇洒,眼神犀利的面试官走了进来,看到他那犀利、好像能看穿所有的眼神,我在想要不然一会就不要 20k 了,要 8k 得了,这个面试官一看就不好糊弄啊,然而我想起来我来之前刚看了小奇的趣学编程系列,我曾经齐全学会了小奇的精华,我登时就来了底气,决定一会要 30k,不给就学小奇赖着不走(哈哈)
面试官:小奇是吧,带简历了吗?
我:没带,当初彩印两块一张,我简历五张,每次面试都要花费十块,我敌人说了还没工作就先让你掏钱的工作不要去。
面试官:。。。那你靠什么来驯服我,让我录用你
我:气质?
(此时面试官并没有叫保安,而是从门后拿出了恭候我多时的棍子,我霎时怂了)
我只好从我的双肩包中拿出了我上午从其余公司面试官手中 要回的简历,上午的情景是这样的。
上午的面试官:明天的面试就到这吧,回去等告诉吧!
我:面试官你好,如果贵公司不打算录取我的话,能不能把我的纸质简历还给我,我下午还有一家面试。
上午的面试官:我说你的简历怎么皱皱巴巴,原来你始终在循环利用啊!这个症状呈现多久了?
我:半拉月了。。。
(当我把皱皱巴巴的简历交给面试官后,这场面试才得以持续进行。。。)
三、Redis 哨兵集群
面试官:我看你简历上写的精通 Redis?(哼,面试官轻蔑的一笑)
(看着面试官轻蔑的笑容,我忍不住拿出了我的 Redis 书籍推给了他)
我:这本书我滚瓜烂熟,你轻易发问,答不上来算我输,答上来你就要为你的轻蔑向我赔罪。
(我的笑容逐步自信。。。)
(此时面试官看着书若有所思,我狐疑他必定在想他对这本书的理解水平吧)
面试官:好吧,那你先说一下 Redis 有哪些集群形式呢
我:Redis 次要有两种持集群形式,哨兵集群和 Cluster(高可用)集群。
面试官:能够说一说两者的区别和如何配置应用吗
我:上次面试我曾经简略说了一下哨兵模式,当初再来简略看一下
这里咱们能够看到客户端只能连贯一个哨兵集群,也就是说客户端在写入数据的时候只能通过哨兵集群通知的地址来进行写入
如果主节点挂了,那么哨兵选举一个从节点成为主节点,在这期间客户端来拜访是被阻塞的,因为主节点正在被选举,还不晓得谁是主节点呢,怎么插入数据。
那么为了解决这个问题,咱们能够应用高可用集群模式 Cluster 模式,也能够称之为多个主从节点(主从节点上一章讲过)模式集群
四、Redis 高可用集群 Cluster 模式
面试官:能说一下高可用集群模式具体是怎么一个流程吗,为什么能够解决选举期待问题?
我:(能不说吗。。。)
通过图中能够看出咱们客户端通过拜访入口能够拜访多个主节点,如果其中一个主节点挂了,那么其余的主节点还能够失常工作不受影响。
面试官:这么多主节点,我哪晓得我 set 一个数据应该放入到哪个主从构造外面呢?
我:(你随机放一个不就行了吗。。。不对,随机放一个取的时候就不晓得去哪个主从构造里去取了,总不能每一个主节点外面都去查找一遍吧)
我:他会依据要 set 进去的 key 进行一个 hash 计算,计算完后就晓得要往哪个主节点外面寄存值了,获得时候也依据 key 进行一个 hash 计算,就晓得去哪个主节点里拿取了。
面试官:那这个时候来一个 age 计算 hash 是 150 要插入哪个主节点
我:必定是第二个主节点啊,redis 集群采纳分片模式,将所有数据分片放入多个主节点中,不便与程度扩大。
面试官:如果主节点挂了,哨兵模式下哨兵集群会选举出一个主节点,那你这种高可用模式,如果一个主节点挂了,怎么选举呢?
我:(应该是依照大小个吧。。。)
面试官:你特么找打是吧,数据那特么有大小个。。。
五、Leader 选举原理
我:这个时候就须要其余主节点来反对选举了,我来用一张图形容一下。
我:咱们能够把这三个主从节点看做是 三个国家,如果一个国家的喽罗挂掉了,那么他底下其中一股权势就会找其余的国家喽罗来反对本人成为喽罗。
我:当然其余国家的喽罗不会看你国家这两股权势哪个好哪个坏,而是哪个先找我我就反对你。
我:而且图中有三个国家,反对本人的票数必须超过总国家的一半以上,也就是起码要有两票反对,所以 redis 集群节点起码要三个主从构造,不然的话两个没方法选举,票数最多一票不够两个国家的半数以上。
面试官:还别说你小子应用这个图讲的是绘声绘色
我:你这不废话吗,趣学编程不趣学那还学个屌。。。
面试官:那塔利班和正规军他们两个怎么确定谁先发出请求呢,必定是谁先收回音讯谁赢呗?
我:他们两个小权势并不是喽罗挂了就立马发出请求反对音讯,而是有肯定的延迟时间,这个延迟时间依据一个公式计算,公式中蕴含随机数,和依据 SLAVE_RANK 的大小来计算,SLAVE_RANK 的大小示意从节点从主节点同步的数据总量的 Rank。Rank 越小代表一复制的数据越新,能够做主节点。
提早公式:DELAY = 500ms +random(0 ~ 500ms) + SLAVE_RANK * 1000ms
面试官:如果当初网络抖动,从节点一瞬间连贯不上主节点了,他就开始发送音讯,网络好了当前不就有两个主节(俗称脑裂,主节点相当于一个主从构造的大脑,只能有一个)点了吗?
我:那咱们能够配置连贯不上的工夫让他长一点,通过 cluster-node-timeout 来配置,如果配置 5 秒钟,那么 5 秒钟之内从节点连贯不上主节点是不会发动申请反对的信息的。
面试官:万一 5 秒不够呢,万一我网络抖动的厉害呢?
我:你是食堂阿姨吗,手抖的这么厉害。。。
我:你说的这种状况属于一瞬间有两个主节点都在写入新的数据,那么等网络复原当前只会将一个节点作为主节点,其余节点变为从节点过去同步,那么就会失落一部分数据。
我:这里咱们会发现age 20 数据失落了,那这个怎么办呢,咱们能够通过一个配置min‐replicas‐to‐write [数量],这个配置是写的数据起码同步的从节点数量。
如果我这里配置的是 1,那么就是我写入一个值起码有一个从节点同步到了这个值才算写入胜利,不然就是写入失败。
这样的话就能够解决上述问题,当网络抖动主节点无奈给从节点同步数据的时候就写入失败,不会造成失落数据,然而这种配置十分影响性能,不倡议应用。
面试官:如果 redis 集群中一个主从构造全副挂了,这个 redis 集群还能够应用吗?
我:咱们能够配置cluster-require-full-coverage 为 no,这样只是一个主从构造全副挂了不影响其余主从构造的应用,如果为 yes,一个主从构造挂了整个 redis 集群就不能用了。
面试官:Redis 集群为什么至多须要三个主节点,并且举荐节点数为奇数?
我:下面咱们说过如果是两个主节点,那么其中一个主节点挂了,剩下活着的主节点 只有一个了 ,没有达到 总数的一半以上,投票也不好使啊,挂了的主节点那里还是选举不进去新的主节点。
另外如果是 4 台主节点,那么他跟三台主节点一样都是最多只能挂一个主节点,如果同时挂两个主节点,那么剩下活着的主节点也无奈超过总数的一半,所以依照性价比来说,奇数主节点性价比更高,不过贵公司要是土豪,违心弄几个主节点就弄几个吧。。。
面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)
我:额。。。面试官这个我的纸质简历能够给我吗,能够不往我的简历上写写画画吗,我今天的面试还要用。
面试官:还面啥别的公司啊,就来我这吧,条件轻易开
我:那就 100k 吧(此时面试官又拿起了他筹备好的棍子)
面试官:你要是不来就给我举荐一下,让他人来我这面试一下
我:你先好好学习一下 Redis 吧,明天幸好只是我来了,如果是小奇的忠诚读者来了,你将会被虐的很惨的。(我将我的《Redis 设计与实现》留给了面试官,转身留下了帅气的背影,而面试官落寞无神的呆呆的坐在那里,好像一个亿离他而去。。。)
六、总结
这里对于 Redis 还没有整顿结束,文章前面继续更新,倡议珍藏。
文章中波及到的命令大家肯定要像我一样每个都敲几遍,只有在敲的过程中能力发现自己对命令是否真正的把握了。
如果感觉我的文章还不错的话就点个赞吧。