大家好,我是漫步coding, 最近在整理2022年Redis最新面試題, 大家也可以通過我下面的博客地址在線閱讀,?今天講講第5篇 - Redis集群。本文首發(fā)于公眾號:漫步coding
2022年Redis最新面試題目錄
Redis基礎(chǔ)知識
Redis數(shù)據(jù)結(jié)構(gòu)
Redis事務(wù)
Redis數(shù)據(jù)持久化
Redis集群
Redis淘汰策略
Redis分布式鎖
Redis緩存問題
運維和部署
概要
Redis 是單進(jìn)程單線程的嘀略?
是否使用過 Redis 集群钦讳,集群的原理是什么冲九?
可以簡單說說你對Redis Sentinel的理解
Redis Sentinal和Redis Cluster的區(qū)別
Redis 的同步機(jī)制了解么?
Redis 集群最大節(jié)點個數(shù)是多少膨俐?
Redis 是單進(jìn)程單線程的缩歪?
出現(xiàn)概率: ★★★★
大家所熟知的 Redis 確實是單線程模型归薛,指的是執(zhí)行 Redis 命令的核心模塊是單線程的,而不是整個 Redis 實例就一個線程匪蝙,Redis 其他模塊還有各自模塊的線程的主籍。
下面這個解釋比較好:
同時Redis 采用網(wǎng)絡(luò) I/O 多路復(fù)用技術(shù),來保證在多連接的時候系統(tǒng)的高吞吐量逛球。關(guān)于 I/O 多路復(fù)用(又被稱為“事件驅(qū)動”)千元,首先要理解的是,操作系統(tǒng)為你提供了一個功能需忿,當(dāng)你的某個 socket 可讀或者可寫的時候诅炉,它可以給你一個通知蜡歹。這樣當(dāng)配合非阻塞的 socket 使用時屋厘,只有當(dāng)系統(tǒng)通知我哪個描述符可讀了,我才去執(zhí)行 read 操作月而,可以保證每次 read 都能讀到有效數(shù)據(jù)而不做純返回 -1 和 EAGAIN 的無用功汗洒,寫操作類似。
目前多路復(fù)用主要有三種技術(shù):select父款,poll溢谤,epoll瞻凤。epoll 是最新的也是目前最好的多路復(fù)用技術(shù)。
采用多路 I/O 復(fù)用技術(shù)可以讓單個線程高效的處理多個連接請求(盡量減少網(wǎng)絡(luò) I/O 的時間消耗)世杀,且 Redis 在內(nèi)存中操作數(shù)據(jù)的速度非撤Р危快,也就是說內(nèi)存內(nèi)的操作不會成為影響 Redis 性能的瓶頸瞻坝,基于這兩點 Redis 具有很高的吞吐量蛛壳。
是否使用過 Redis 集群,集群的原理是什么所刀?
出現(xiàn)概率: ★★★
Redis Cluster 是 在?3.0 版本正式推出的高可用集群方案衙荐,相比Redis Sentinel,Redis Cluster方案不需要額外部署Sentinel集群浮创,而是通過集群內(nèi)部通信實現(xiàn)集群監(jiān)控忧吟,故障時主從切換;同時斩披,支持內(nèi)部基于哈希實現(xiàn)數(shù)據(jù)分片溜族,支持動態(tài)水平擴(kuò)容。
Redis集群有多個master垦沉,可以減小訪問瞬斷問題的影響斩祭;若集群中有一個master掛了,正好需要向這個master寫數(shù)據(jù)乡话,這個操作需要等待一下摧玫;但是向其他master節(jié)點寫數(shù)據(jù)是不受影響的。
Redis集群有多個master绑青,可以提供更高的并發(fā)量诬像;
Redis集群可以分片存儲,這樣就可以存儲更多的數(shù)據(jù)闸婴;
將整個數(shù)據(jù)集按照一定規(guī)則分配到多個節(jié)點上坏挠,稱為數(shù)據(jù)分片,Redis Cluster采用的分片方案是哈希分片, 基本原理如下:Redis Cluster首先定義了編號0 ~ 16383的區(qū)間邪乍,稱為槽降狠,所有的鍵根據(jù)哈希函數(shù)映射到0 ~ 16383整數(shù)槽內(nèi),計算公式:slot=CRC16(key)&16383庇楞。每一個節(jié)點負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)榜配。
可以簡單說說你對Redis Sentinel的理解
出現(xiàn)概率: ★★★
Redis Sentinel是官方從Redis 2.6版本提供的高可用方案,在Redis主從復(fù)制集群的基礎(chǔ)上吕晌,增加Sentinel集群監(jiān)控整個Redis集群蛋褥。當(dāng)Redis集群master節(jié)點發(fā)生故障時,Sentinel進(jìn)行故障切換睛驳,選舉出新的master烙心,同時Sentinel本身支持高可用集群部署膜廊。
Redis Sentinal和Redis Cluster的區(qū)別
出現(xiàn)概率: ★★★
Redis Sentinal和Redis Cluster的區(qū)別主要在于側(cè)重點不同:
Redis Sentinal主要聚焦于高可用,在master宕機(jī)時會自動將slave提升為master淫茵,繼續(xù)提供服務(wù)爪瓜。
Redis Cluster主要聚焦于擴(kuò)展性,在單個redis內(nèi)存不足時匙瘪,使用Cluster進(jìn)行分片存儲钥勋。
Redis 的同步機(jī)制了解么?
出現(xiàn)概率: ★★★
主從同步辆苔。第一次同步時算灸,主節(jié)點做一次bgsave,并同時將后續(xù)修改操作記錄到內(nèi)存buffer驻啤,待完成后將rdb文件全量同步到復(fù)制節(jié)點菲驴,復(fù)制節(jié)點接受完成后將rdb鏡像加載到內(nèi)存。加載完成后骑冗,再通知主節(jié)點將期間修改的操作記錄同步到復(fù)制節(jié)點進(jìn)行重放就完成了同步過程赊瞬。
全備份過程中,在slave啟動時贼涩,會向其master發(fā)送一條SYNC消息巧涧,master收到slave的這條消息之后,將可能啟動后臺進(jìn)程進(jìn)行備份遥倦,備份完成之后就將備份的數(shù)據(jù)發(fā)送給slave谤绳,初始時的全同步機(jī)制是這樣的:
Redis 集群最大節(jié)點個數(shù)是多少?
出現(xiàn)概率: ★★★
這個比較偏袒哥, 知道的人不多缩筛, 如果你可以答出最大節(jié)點數(shù),然后給出解釋, 估計面試官的好感度, 會蹭蹭的往上漲堡称。
16384 個瞎抛。這是因為Redis 集群并沒有使用一致性hash,而是引入了哈希槽的概念却紧。Redis 集群有16384個哈希槽桐臊,每個key通過CRC16校驗后對16384取模來決定放置哪個槽,集群的每個節(jié)點負(fù)責(zé)一部分hash槽晓殊。
但為什么哈希槽的數(shù)量是16384(2^14)個呢?
在redis節(jié)點發(fā)送心跳包時需要把所有的槽放到這個心跳包里断凶,以便讓節(jié)點知道當(dāng)前集群信息,16384=16k挺物,在發(fā)送心跳包時使用char進(jìn)行bitmap壓縮后是2k(2 * 8 (8 bit) * 1024(1k) = 16K)懒浮,也就是說使用2k的空間創(chuàng)建了16k的槽數(shù)飘弧。
雖然使用CRC16算法最多可以分配65535(2^16-1)個槽位识藤,65535=65k砚著,壓縮后就是8k(8 * 8 (8 bit) * 1024(1k) =65K),也就是說需要需要8k的心跳包痴昧,Redis作者認(rèn)為這樣做不太值得稽穆;并且一般情況下一個redis集群不會有超過1000個master節(jié)點,所以16k的槽位是個比較合適的選擇赶撰。
關(guān)于Redis作者討論為什么這么設(shè)計, 可以看這里舌镶。
也歡迎關(guān)注我的公眾號:?漫步coding。一起交流, 在coding的世界里漫步, ?? ?回復(fù):?redis, 免費獲取最新Redis面試題(含答案)豪娜。