面試官:Redis集群有哪些方式,Leader選舉又是什么原理呢?

      網友投稿 731 2025-04-03

      哈嘍!大家好,我是小奇,一位不靠譜的程序員

      小奇打算以輕松幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧

      文章持續更新,可以微信搜索【小奇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集群有哪些方式,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還沒有整理完畢,文章后面持續更新,建議。

      文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。

      如果覺得我的文章還不錯的話就點個贊吧,另外可以微信搜索【小奇JAVA面試】閱讀更多的好文章,獲取我為大家準備的資料。

      Redis 網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:瘋狂Java學習筆記(56)------------對象序列化
      下一篇:ECMAScript 6 基礎篇-知識點整理大綱概要
      相關文章
      亚洲色最新高清av网站| 亚洲国产精品无码av| 亚洲色偷偷综合亚洲AVYP| 国产偷国产偷亚洲高清在线| 亚洲天堂免费在线| 亚洲国产精品无码av| 亚洲国产综合无码一区| 亚洲精品亚洲人成在线观看下载| 亚洲国产理论片在线播放| 久久久久亚洲AV成人无码| 亚洲av中文无码乱人伦在线播放 | 亚洲综合无码无在线观看| 亚洲五月丁香综合视频| 国产亚洲A∨片在线观看| 亚洲大尺码专区影院| 亚洲乱码在线播放| 亚洲 日韩经典 中文字幕| avtt天堂网手机版亚洲| 亚洲欧洲在线播放| 亚洲成年人在线观看| 亚洲视频在线观看| 亚洲一区二区三区夜色| 亚洲美女视频免费| 亚洲中文久久精品无码1| 久久国产成人亚洲精品影院| 日本亚洲中午字幕乱码| 亚洲高清无码在线观看| 亚洲黄片毛片在线观看| 亚洲精品WWW久久久久久| 亚洲午夜精品久久久久久浪潮| 久久久久亚洲av成人无码电影 | 亚洲日韩精品一区二区三区无码| 狠狠综合久久综合88亚洲| 亚洲人成人77777网站| 亚洲欧美成人一区二区三区| 亚洲色丰满少妇高潮18p| 亚洲人妖女同在线播放| 亚洲成av人片在线天堂无| 豆国产96在线|亚洲| 亚洲熟妇无码av另类vr影视| 亚洲成年轻人电影网站www |