哈嘍!大家好,我是小奇,一位不靠譜的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新
一、前言
作為一名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還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧。