征服面試官的50道Redis高頻通關面試題

Redis,全稱:Remote Dictionary Server,是一個基於內存的高性能key-value數據庫,是應用服務提高效率和性能必不可少的一部分,因爲當前大部分的應用都離不開Redis,所以學習並熟練Redis操作已經成爲一個必不可少的技能。當然,面試中,Redis也深受面試官喜愛,下面就爲大家整理彙總Redis的高頻面試題,希望能給鄉親們一點幫助。

1、什麼是 Redis?簡述它的優缺點?

Redis 的全稱是:Remote Dictionary.Server,本質上是一個 Key-Value 類型的內存數據庫,很像memcached,整個數據庫統統加載在內存當中進行操作,定期通過異步操作把數據庫數據 flush 到硬盤 上進行保存。
因爲是純內存操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB。
Redis 的出色之處不僅僅是性能,Redis 最大的魅力是支持保存多種數據結構,此外單個 value 的最大限 制是 1GB,不像 memcached 只能保存 1MB 的數據,因此 Redis 可以用來實現很多有用的功能。比方說用他的 List 來做 FIFO 雙向鏈表,實現一個輕量級的高性 能消息隊列服務,用他的 Set 可以做高 性能的 tag 系統等等。
另外 Redis 也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一 個功能加強版的memcached 來用。
Redis 的主要缺點是數據庫容量受到物理內存的限制,不能用作海量數據的高性能 讀寫,因此 Redis 適合的場景主要侷限在較小數據量的高性能操作和運算上。
2、使用redis有哪些好處?

速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)。

支持豐富數據類型,支持string,list,set,sorted set,hash

支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行。

豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除。

3、Redis支持哪幾種數據類型?

答:Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
還有一些數據結構如HyperLogLog、Geo、Pub/Sub等,我們也最好知道,另外像Redis Module,像BloomFilter,RedisSearch,Redis-ML等,能有個印象,哪怕知其然不知其所以然也比聽都沒聽過好點。

4、Redis有哪幾種淘汰策略?

Redis的內存淘汰策略是指在Redis的用於緩存的內存不足時,怎麼處理需要新寫入且需要申請額外空間的數據。
no-eviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。

allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key。

allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key。

volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key。

volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個key。

volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的key優先移除。

注意這裏的6種機制,volatile和allkeys規定了是對已設置過期時間的數據集淘汰數據還是從全部數據集淘汰數據,後面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。  
使用策略規則:

如果數據呈現冪律分佈,也就是一部分數據訪問頻率高,一部分數據訪問頻率低,則使用allkeys-lru

如果數據呈現平等分佈,也就是所有的數據訪問頻率都相同,則使用allkeys-random

5、爲什麼 Redis 需要把所有數據放到內存中?

答:Redis 爲了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁盤。所以 redis 具有快速和數據持久化的特徵,如果不將數據放在內存中,磁盤 I/O 速度爲嚴重影響 redis 的 性能。
在內存越來越便宜的今天,redis 將會越來越受歡迎, 如果設置了最大使用的內存,則數據已有記錄數達 到內存限值後不能繼續插入新值。
6、Redis 有哪些適合的場景?

(1)會話緩存(Session Cache)
最常用的一種使用 Redis 的情景是會話緩存(sessioncache),用 Redis 緩存會話比其他存儲(如Memcached)的優勢在於:Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的 購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨着 Redis 這些年的改進,很容易找到怎麼恰當的使用 Redis 來緩存會話的文檔。甚至廣爲 人知的商業平臺 Magento 也提供 Redis 的插件。
(2)全頁緩存(FPC)

除基本的會話 token 之外,Redis 還提供很簡便的 FPC 平臺。回到一致性問題,即使重啓了 Redis 實 例,因爲有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似 PHP 本地FPC。

再次以 Magento 爲例,Magento 提供一個插件來使用 Redis 作爲全頁緩存後端。此外,對 WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快 速度加載你曾瀏覽過的頁面。
(3)隊列

Reids 在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得 Redis 能作爲一個很好的消息隊列 平臺來使用。Redis 作爲隊列使用的操作,就類似於本地程序語言(如 Python)對 list 的 push/pop操作。

如果你快速的在 Google 中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的 就是利用 Redis 創建非常好的後端工具,以滿足各種隊列需求。例如,Celery 有一個後臺就是使用Redis 作爲 broker,你可以從這裏去查看。
(4)排行榜/計數器

Redis 在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(SortedSet)也使 得我們在執行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的 10 個用戶–我們稱之爲“user_scores”,我們只需要像 下面一樣執行即可: 當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執 行:
ZRANGE user_scores 0 10 WITHSCORES

Agora Games 就是一個很好的例子,用 Ruby 實現的,它的排行榜就是使用 Redis 來存儲數據的,你可 以在這裏看到。
(5)發佈/訂閱

最後(但肯定不是最不重要的)是 Redis 的發佈/訂閱功能。發佈/訂閱的使用場景確實非常多。我已看見 人們在社交網絡連接中使用,還可作爲基於發佈/訂閱的腳本觸發器,甚至用 Redis 的發佈/訂閱功能來建 立聊天系統!

7、說說 Redis 哈希槽的概念?

Redis 集羣沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集羣有 16384 個哈希槽,每個 key 通 過 CRC16 校驗後對 16384 取模來決定放置哪個槽,集羣的每個節點負責一部分 hash 槽。

8、Redis 集羣的主從複製模型是怎樣的?

爲了使在部分節點失敗或者大部分節點無法通信的情況下集羣仍然可用,所以集羣使用了主從複製模型,每個節點都會有 N-1 個複製品。

9、Redis 集羣會有寫操作丟失嗎?爲什麼?

Redis 並不能保證數據的強一致性,這意味這在實際中集羣在特定的條件下可能會丟失寫操作。

10、Redis 集羣之間是如何複製的?
答:異步複製

11、Redis 中的管道有什麼用?
一次請求/響應服務器能實現處理新的請求即使舊的請求還未被響應,這樣就可以將多個命令發送到服務 器,而不用等待回覆,最後在一個步驟中讀取該答覆。這就是管道(pipelining),是一種幾十年來廣泛使用的技術。例如許多 POP3 協議已經實現支持這個功 能,大大加快了從服務器下載新郵件的過程。

12、怎麼理解 Redis 事務?

事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行,事務在執行的過程中,不會 被其他客戶端發送來的命令請求所打斷。

事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。

13、Redis 事務相關的命令有哪幾個?

MULTI、EXEC、DISCARD、WATCH

14、Redis key 的過期時間和永久有效分別怎麼設置?

EXPIRE 和 PERSIST 命令

15、Redis 如何做內存優化?

儘可能使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存非常小,所以你應該 儘可能的將你的數據模型抽象到一個散列表裏面。
比如你的 web 系統中有一個用戶對象,不要爲這個用戶的名稱,姓氏,郵箱,密碼設置單獨的 key,而是 應該把這個用戶的所有信息存儲到一張散列表裏面。

16、Redis 回收進程如何工作的?
一個客戶端運行了新的命令,添加了新的數據。Redi 檢查內存使用情況,如果大於 maxmemory 的限制, 則根據設定好的策略進行回收。一個新的命令被執行,等等。所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然後不斷地回收回到邊界以下。如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限 制就會被這個內存使用量超越。

17、Redis集羣最大節點個數是多少?
答:16384個。

18、Redis集羣如何選擇數據庫?
答:Redis集羣目前無法做數據庫選擇,默認在0數據庫。

19、都有哪些辦法可以降低Redis的內存使用情況呢?

答:如果你使用的是32位的Redis實例,可以好好利用Hash,list,sorted set,set等集合類型數據,因爲通常情況下很多小的Key-Value可以用更緊湊的方式存放到一起。

20、Redis的內存用完了會發生什麼?

答:如果達到設置的上限,Redis的寫命令會返回錯誤信息(但是讀命令還可以正常返回。)或者你可以將Redis當緩存來使用配置淘汰機制,當Redis達到內存上限時會沖刷掉舊的內容。

21、一個Redis實例最多能存放多少的keys?List、Set、Sorted Set他們最多能存放多少元素?

答:理論上Redis可以處理多達232的keys,並且在實際中進行了測試,每個實例至少存放了2億5千萬的keys。我們正在測試一些較大的值。任何list、set、和sorted set都可以放232個元素。換句話說,Redis的存儲極限是系統中的可用內存值。

22、假如Redis裏面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

答:使用keys指令可以掃出指定模式的key列表。

23、如果這個redis正在給線上的業務提供服務,那使用keys指令會有什麼問題?

答:redis的單線程的。keys指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重複概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。

24、如果有大量的key需要設置同一時間過期,一般需要注意什麼?

答:如果大量的key過期時間設置的過於集中,到過期的那個時間點,redis可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。

25、Redis 集羣方案應該怎麼做?都有哪些方案?

codis:目前用的最多的集羣方案,基本和 twemproxy 一致的效果,但它支持在節點數量改變情況下,舊節點數據可恢復到新 hash 節點。

redis cluster3.0 自帶的集羣,特點在於他的分佈式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持節點設置從節點。具體看官方文檔介紹。

在業務代碼層實現,起幾個毫無關聯的 redis 實例,在代碼層,對 key 進行 hash 計算,然後去對應的redis 實例操作數據。這種方式對 hash 層代碼要求比較高,考慮部分包括,節點失效後的替代算法方案,數據震盪後的自動腳本恢復,實例的監控,等等。

26、使用過 Redis 分佈式鎖麼,它是怎麼實現的?

答:先拿 setnx 來爭搶鎖,搶到之後,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。

27、如果在 setnx 之後執行 expire 之前進程意外 crash 或者要重啓維護了,那會怎麼樣?

答:set 指令有非常複雜的參數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!

28、使用過 Redis 做異步隊列麼,你是怎麼用的?有什麼缺點?

一般使用 list 結構作爲隊列,rpush 生產消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep 一會再重試。
缺點:在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 rabbitmq 等。
能不能生產一次消費多次呢?
使用 pub/sub 主題訂閱者模式,可以實現 1:N 的消息隊列。

29、緩存穿透、緩存擊穿、緩存雪崩解決方案?

緩存穿透:指查詢一個一定不存在的數據,如果從存儲層查不到數據則不寫入緩存,這將 導致這個不存在的數據每次請求都要到 DB 去查詢,可能導致 DB 掛掉。

解決方案:

1.查詢返回的數據爲空,仍把這個空結果進行緩存,但過期時間會比較短;

2.布 隆過濾器:將所有可能存在的數據哈希到一個足夠大的 bitmap 中,一個一定不存在的數據 會被這個 bitmap 攔截掉,從而避免了對 DB 的查詢。

緩存擊穿:對於設置了過期時間的 key,緩存在某個時間點過期的時候,恰好這時間點對 這個 Key 有大量的併發請求過來,這些請求發現緩存過期一般都會從後端 DB 加載數據並 回設到緩存,這個時候大併發的請求可能會瞬間把 DB 壓垮。

解決方案:

1.使用互斥鎖:當緩存失效時,不立即去load db,先使用如Redis的setnx去設 置一個互斥鎖,當操作成功返回時再進行load db的操作並回設緩存,否則重試get緩存的 方法。

2.永遠不過期:物理不過期,但邏輯過期(後臺異步線程去刷新)。

緩存雪崩:設置緩存時採用了相同的過期時間,導致緩存在某一時刻同時失效,請求全部 轉發到 DB,DB 瞬時壓力過重雪崩。與緩存擊穿的區別:雪崩是很多 key,擊穿是某一個key 緩存。

解決方案:

將緩存失效時間分散開,比如可以在原有的失效時間基礎上增加一個隨機值, 比如 1-5 分鐘隨機,這樣每一個緩存的過期時間的重複率就會降低,就很難引發集體失效 的事件。

30、爲什麼redis單線程還是那麼快?

答:redis利用隊列技術將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷。
31、使用 redis 如何設計分佈式鎖?說一下實現思路?使用 zk 可以嗎?如何實現?這兩種有什 麼區別?

redis:

線程 A setnx(上鎖的對象,超時時的時間戳 t1),如果返回 true,獲得鎖。

線程 B 用 get 獲取 t1,與當前時間戳比較,判斷是是否超時,沒超時 false,若超時執行第 3 步。

計算新的超時時間 t2,使用 getset 命令返回 t3(該值可能其他線程已經修改過),如果t1==t3,獲得鎖,如果 t1!=t3 說明鎖被其他線程獲取了。4.獲取鎖後,處理完業務邏輯,再去判斷鎖是否超時,如果沒超時刪除鎖,如果已超時, 不用處理(防止刪除其他線程的鎖)。

zk:

客戶端對某個方法加鎖時,在 zk 上的與該方法對應的指定節點的目錄下,生成一個唯一 的瞬時有序節點 node1。

客戶端獲取該路徑下所有已經創建的子節點,如果發現自己創建的 node1 的序號是最小 的,就認爲這個客戶端獲得了鎖。

如果發現 node1 不是最小的,則監聽比自己創建節點序號小的最大的節點,進入等待。

獲取鎖後,處理完邏輯,刪除自己創建的 node1 即可。

區別:zk 性能差一些,開銷大,實現簡單。

32、知道 redis 的持久化嗎?底層如何實現的?有什麼優點缺點?

RDB(Redis DataBase:在不同的時間點將 redis 的數據生成的快照同步到磁盤等介質上):內存 到硬盤的快照,定期更新。缺點:耗時,耗性能(fork+io 操作),易丟失數據。
AOF(Append Only File:將redis所執行過的所有指令都記錄下來,在下次redis重啓時,只 需要執行指令就可以了):寫日誌。缺點:體積大,恢復速度慢。

bgsave 做鏡像全量持久化,aof 做增量持久化。因爲 bgsave 會消耗比較長的時間,不夠實 時,在停機的時候會導致大量的數據丟失,需要 aof 來配合,在 redis 實例重啓時,優先使 用 aof 來恢復內存的狀態,如果沒有 aof 日誌,就會使用 rdb 文件來恢復。Redis 會定期做aof 重寫,壓縮 aof 文件日誌大小。Redis4.0 之後有了混合持久化的功能,將 bgsave 的全量 和 aof 的增量做了融合處理,這樣既保證了恢復的效率又兼顧了數據的安全性。bgsave 的 原理,fork 和 cow, fork 是指 redis 通過創建子進程來進行 bgsave 操作,cow 指的是 copy on write,子進程創建後,父子進程共享數據段,父進程繼續提供讀寫服務,寫髒的頁面數據 會逐漸和子進程分離開來。

33、redis 過期策略都有哪些?LRU 算法知道嗎?寫一下 java 代碼實現?

過期策略:

定時過期(一 key 一定時器)。

惰性過期:只有使用 key 時才判斷 key 是否已過期,過期則清除。

定期過期:前兩者折中。

LRU:

new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true);
//第三個參數置爲 true,代表 linkedlist 按訪問順序排序,可作爲 LRU 緩存;設爲 false 代表 按插入順序排序,可作爲 FIFO 緩存

LRU 算法實現:

1.通過雙向鏈表來實現,新數據插入到鏈表頭部;

2.每當緩存命中(即緩存 數據被訪問),則將數據移到鏈表頭部;

3.當鏈表滿的時候,將鏈表尾部的數據丟棄。

LinkedHashMap:HashMap 和雙向鏈表合二爲一即是 LinkedHashMap。HashMap 是無序 的,LinkedHashMap 通過維護一個額外的雙向鏈表保證了迭代順序。該迭代順序可以是插 入順序(默認),也可以是訪問順序。

34、緩存與數據庫不一致怎麼辦?
答:假設採用的主存分離,讀寫分離的數據庫,
如果一個線程 A 先刪除緩存數據,然後將數據寫入到主庫當中,這個時候,主庫和從庫同 步沒有完成,線程 B 從緩存當中讀取數據失敗,從從庫當中讀取到舊數據,然後更新至緩 存,這個時候,緩存當中的就是舊的數據。
發生上述不一致的原因在於,主從庫數據不一致問題,加入了緩存之後,主從不一致的時間被拉長了。
處理思路:在從庫有數據更新之後,將緩存當中的數據也同時進行更新,即當從庫發生了
數據更新之後,向緩存發出刪除,淘汰這段時間寫入的舊數據。

35、主從數據庫不一致如何解決?

場景描述,對於主從庫,讀寫分離,如果主從庫更新同步有時差,就會導致主從庫數據的
不一致,解決方法:

忽略這個數據不一致,在數據一致性要求不高的業務下,未必需要時時一致性。

強制讀主庫,使用一個高可用的主庫,數據庫讀寫都在主庫,添加一個緩存,提升數據讀取的性能。

選擇性讀主庫,添加一個緩存,用來記錄必須讀主庫的數據,將哪個庫,哪個表,哪個 主鍵,作爲緩存的 key,設置緩存失效的時間爲主從庫同步的時間,如果緩存當中有這個數 據,直接讀取主庫,如果緩存當中沒有這個主鍵,就到對應的從庫中讀取。

36、Redis 常見的性能問題和解決方案

master 最好不要做持久化工作,如 RDB 內存快照和 AOF 日誌文件。

如果數據比較重要,某個 slave 開啓 AOF 備份,策略設置成每秒同步一次。

爲了主從複製的速度和連接的穩定性,master 和 Slave 最好在一個局域網內。

儘量避免在壓力大得主庫上增加從庫5、主從複製不要採用網狀結構,儘量是線性結構,Master<–Slave1<----Slave2 …

37、爲什麼要做Redis分區?
答:分區可以讓Redis管理更大的內存,Redis將可以使用所有機器的內存。如果沒有分區,你最多隻能使用一臺機器的內存。分區使Redis的計算能力通過簡單地增加計算機得到成倍提升,Redis的網絡帶寬也會隨着計算機和網卡的增加而成倍增長。

38、你知道有哪些Redis分區實現方案?

答:客戶端分區就是在客戶端就已經決定數據會被存儲到哪個redis節點或者從哪個redis節點讀取。大多數客戶端已經實現了客戶端分區。
代理分區意味着客戶端將請求發送給代理,然後代理決定去哪個節點寫數據或者讀數據。代理根據分區規則決定請求哪些Redis實例,然後根據Redis的響應結果返回給客戶端。redis和memcached的一種代理實現就是Twemproxy

查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實例,然後由Redis將請求轉發給正確的Redis節點。Redis Cluster實現了一種混合形式的查詢路由,但並不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點。

39、Redis分區有什麼缺點?

涉及多個key的操作通常不會被支持。例如你不能對兩個集合求交集,因爲他們可能被存儲到不同的Redis實例(實際上這種情況也有辦法,但是不能直接使用交集指令)。
同時操作多個key,則不能使用Redis事務。
分區使用的粒度是key,不能使用一個非常長的排序key存儲一個數據集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set)。
當使用分區的時候,數據處理會非常複雜,例如爲了備份你必須從不同的Redis實例和主機同時收集RDB / AOF文件。
分區時動態擴容或縮容可能非常複雜。Redis集羣在運行時增加或者刪除Redis節點,能做到最大程度對用戶透明地數據再平衡,但其他一些客戶端分區或者代理分區方法則不支持這種特性。然而,有一種預分片的技術也可以較好的解決這個問題。

40、Redis持久化數據和緩存怎麼做擴容?

答:如果Redis被當做緩存使用,使用一致性哈希實現動態擴容縮容。
如果Redis被當做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關係,節點的數量一旦確定不能變化。否則的話(即Redis節點需要動態變化的情況),必須使用可以在運行時進行數據再平衡的一套系統,而當前只有Redis集羣可以做到這樣。

41、redis的併發競爭問題如何解決?

答:Redis爲單進程單線程模式,採用隊列模式將併發訪問變爲串行訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連接並不存在競爭,但是在Jedis客戶端對Redis進行併發訪問時會發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由於客戶端連接混亂造成。

對此有2種解決方法:

1.客戶端角度,爲保證每個客戶端間正常有序與Redis進行通信,對連接進行池化,同時對客戶端讀寫Redis操作採用內部鎖synchronized。
2.服務器角度,利用setnx實現鎖。
注:對於第一種,需要應用程序自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。

42、簡述redis的哨兵模式

答:哨兵是對redis進行實時的監控,主要有兩個功能。

監測主數據庫和從數據庫是否正常運行。

當主數據庫出現故障的時候,可以自動將一個從數據庫轉換爲主數據庫,實現自動切換。

43、redis的哨兵的監控機制是怎樣的?

答:哨兵監控也是有集羣的,會有多個哨兵進行監控,當判斷髮生故障的哨兵達到一定數量的時候才進行修復。一個健壯的部署至少需要三個哨兵實例。

1.每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令

2.如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。

3.如果一個Master被標記爲主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。

4.當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線

5.在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令

6.當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次

7.若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

Redis高頻面試題就整理到這兒,總感覺遺漏了點什麼,又忽然間想不起來,希望看完的鄉親們如有補充的,麻煩留言告訴一聲,讓我補充的更完整一些。

更多面試題可以關注我的個人公衆號【碼之初】,真心的希望可以給你的面試之路助上一臂之力,願你被生活溫柔以待,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章