最全Redis49題詳細答案:執行緒設計+哨兵+複製+事務+叢集+持久化等

架構師springboot發表於2019-03-26
最全Redis49題詳細答案:執行緒設計+哨兵+複製+事務+叢集+持久化等

Redis支援哪幾種資料型別?

支援多種型別的資料結構

1.string:最基本的資料型別,二進位制安全的字串,最大512M。

2.list:按照新增順序保持順序的字串列表。

3.set:無序的字串集合,不存在重複的元素。

4.sorted set:已排序的字串集合。

5.hash:key-value對的一種集合。

最全Redis49題詳細答案:執行緒設計+哨兵+複製+事務+叢集+持久化等

Redis主要有哪些功能?

1.哨兵(Sentinel)和複製(Replication)

Redis伺服器毫無徵兆的罷工是個麻煩事,如何保證備份的機器是原始伺服器的完整備份呢?這時候就需要哨兵和複製。

Sentinel可以管理多個Redis伺服器,它提供了監控,提醒以及自動的故障轉移的功能,Replication則是負責讓一個Redis伺服器可以配備多個備份的伺服器。

Redis也是利用這兩個功能來保證Redis的高可用的

2.事務

很多情況下我們需要一次執行不止一個命令,而且需要其同時成功或者失敗。redis對事務的支援也是源自於這部分需求,即支援一次性按順序執行多個命令的能力,並保證其原子性。

3.LUA指令碼

在事務的基礎上,如果我們需要在服務端一次性的執行更復雜的操作(包含一些邏輯判斷),則lua就可以排上用場了

4.持久化

redis的持久化指的是redis會把記憶體的中的資料寫入到硬碟中,在redis重新啟動的時候載入這些資料,從而最大限度的降低快取丟失帶來的影響。

5.叢集(Cluster)

單臺伺服器資源的總是有上限的,CPU資源和IO資源我們可以通過主從複製,進行讀寫分離,把一部分CPU和IO的壓力轉移到從伺服器上,這也有點類似mysql資料庫的主從同步。

在Redis官方的分散式方案出來之前,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進行分散式的,下面的內容有具體叢集方案詳解。

Redis是單程式單執行緒的?

Redis是單程式單執行緒的,Redis利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷。

Redis為什麼是單執行緒的?

多執行緒處理會涉及到鎖,而且多執行緒處理會涉及到執行緒切換而消耗CPU。因為CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體或者網路頻寬。單執行緒無法發揮多核CPU效能,不過可以通過在單機開多個Redis例項來解決。

其它開源軟體採用的模型

Nginx:多程式單執行緒模型

Memcached:單程式多執行緒模型

使用Redis的優勢?

1.速度快,因為資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1)

2. 支援豐富資料型別,支援string,list,set,sorted set,hash

3.支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行

4. 豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除

Redis單點吞吐量

單點TPS達到8萬/秒,QPS達到10萬/秒,補充下TPS和QPS的概念

1.QPS: 應用系統每秒鐘最大能接受的使用者訪問量

每秒鐘處理完請求的次數,注意這裡是處理完,具體是指發出請求到伺服器處理完成功返回結果。可以理解在server中有個counter,每處理一個請求加1,1秒後counter=QPS。

2.TPS: 每秒鐘最大能處理的請求數

每秒鐘處理完的事務次數,一個應用系統1s能完成多少事務處理,一個事務在分散式處理中,可能會對應多個請求,對於衡量單個介面服務的處理能力,用QPS比較合理。

Redis相比memcached有哪些優勢?

1.memcached所有的值均是簡單的字串,Redis作為其替代者,支援更為豐富的資料型別

2.Redis的速度比memcached快很多

3.Redis可以持久化其資料

4.Redis支援資料的備份,即master-slave模式的資料備份。

Redis有哪幾種資料淘汰策略?

在Redis中,允許使用者設定最大使用記憶體大小server.maxmemory,當Redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。

1.volatile-lru:從已設定過期的資料集中挑選最近最少使用的淘汰

2.volatile-ttr:從已設定過期的資料集中挑選將要過期的資料淘汰

3.volatile-random:從已設定過期的資料集中任意挑選資料淘汰

4.allkeys-lru:從資料集中挑選最近最少使用的資料淘汰

5.allkeys-random:從資料集中任意挑選資料淘汰

6.noenviction:禁止淘汰資料

redis淘汰資料時還會同步到aof

Redis叢集方案應該怎麼做?都有哪些方案?

1.twemproxy

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

3.Redis cluster3.0自帶的集,特點在於他的分散式演算法不是一致性hash,而是hash槽的概念,以及自身支援節點設定從節點。

Redis讀寫分離模型

通過增加Slave DB的數量,讀的效能可以線性增長。為了避免Master DB的單點故障,叢集一般都會採用兩臺Master DB做雙機熱備,所以整個叢集的讀和寫的可用性都非常高。

讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須儲存完整的資料,如果在資料量很大的情況下,叢集的擴充套件能力還是受限於單個節點的儲存能力,而且對於Write-intensive型別的應用,讀寫分離架構並不適合。

Redis資料分片模型

為了解決讀寫分離模型的缺陷,可以將資料分片模型應用進來。

可以將每個節點看成都是獨立的master,然後通過業務實現資料分片。

結合上面兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。

Redis提供了哪幾種持久化方式?

1. Redis主要提供了兩種持久化機制:RDB和AOF;

2.RDB

預設開啟,會按照配置的指定時間將記憶體中的資料快照到磁碟中,建立一個dump.rdb檔案,Redis啟動時再恢復到記憶體中。

Redis會單獨建立fork()一個子程式,將當前父程式的資料庫資料複製到子程式的記憶體中,然後由子程式寫入到臨時檔案中,持久化的過程結束了,再用這個臨時檔案替換上次的快照檔案,然後子程式退出,記憶體釋放。

需要注意的是,每次快照持久化都會將主程式的資料庫資料複製一遍,導致記憶體開銷加倍,若此時記憶體不足,則會阻塞伺服器執行,直到複製結束釋放記憶體;都會將記憶體資料完整寫入磁碟一次,所以如果資料量大的話,而且寫操作頻繁,必然會引起大量的磁碟I/O操作,嚴重影響效能,並且最後一次持久化後的資料可能會丟失;

3.AOF

以日誌的形式記錄每個寫操作(讀操作不記錄),只需追加檔案但不可以改寫檔案,Redis啟動時會根據日誌從頭到尾全部執行一遍以完成資料的恢復工作。包括flushDB也會執行。

主要有兩種方式觸發:有寫操作就寫、每秒定時寫(也會丟資料)。

因為AOF採用追加的方式,所以檔案會越來越大,針對這個問題,新增了重寫機制,就是當日志檔案大到一定程度的時候,會fork出一條新程式來遍歷程式記憶體中的資料,每條記錄對應一條set語句,寫到臨時檔案中,然後再替換到舊的日誌檔案(類似rdb的操作方式)。預設觸發是當aof檔案大小是上次重寫後大小的一倍且檔案大於64M時觸發。

當兩種方式同時開啟時,資料恢復Redis會優先選擇AOF恢復。一般情況下,只要使用預設開啟的RDB即可,因為相對於AOF,RDB便於進行資料庫備份,並且恢復資料集的速度也要快很多。

開啟持久化快取機制,對效能會有一定的影響,特別是當設定的記憶體滿了的時候,更是下降到幾百reqs/s。所以如果只是用來做快取的話,可以關掉持久化。

Redis常見效能問題和解決方案?

(1) Master最好不要做任何持久化工作,如RDB記憶體快照和AOF日誌檔案

(2) 如果資料比較重要,某個Slave開啟AOF備份資料,策略設定為每秒同步一次

(3) 為了主從複製的速度和連線的穩定性,Master和Slave最好在同一個區域網內

(4) 儘量避免在壓力很大的主庫上增加從庫

(5) 主從複製不要用圖狀結構,用單向連結串列結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

Redis支援的Java客戶端都有哪些?官方推薦用哪個?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson。

Redis雜湊槽的概念?

Redis叢集沒有使用一致性hash,而是引入了雜湊槽的概念,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。

Redis叢集最大節點個數是多少?

Redis叢集預分好16384個桶(雜湊槽)

Redis叢集的主從複製模型是怎樣的?

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

Redis叢集會有寫操作丟失嗎?為什麼?

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

Redis叢集之間是如何複製的?

非同步複製

Redis如何做記憶體優化?

儘可能使用雜湊表(hashes),雜湊表(是說雜湊表裡面儲存的數少)使用的記憶體非常小,所以你應該儘可能的將你的資料模型抽象到一個雜湊表裡面。比如你的web系統中有一個使用者物件,不要為這個使用者的名稱,姓氏,郵箱,密碼設定單獨的key,而是應該把這個使用者的所有資訊儲存到一張雜湊表裡面.

Redis回收程式如何工作的?

一個客戶端執行了新的命令,新增了新的資料。

Redi檢查記憶體使用情況,如果大於maxmemory的限制, 則根據設定好的策略進行回收。

Redis回收使用的是什麼演算法?

LRU演算法

Redis有哪些適合的場景?

1)Session共享(單點登入)

2)頁面快取

3)佇列

4)排行榜/計數器

5)釋出/訂閱

以上就是最全Redis詳細答案總結。

覺得不錯請點贊支援,歡迎留言或進我的個人群855801563領取【架構資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本群專用於學習交流技術、分享面試機會,拒絕廣告,我也會在群內不定期答題、探討。


相關文章