Redis 高性能架構詳解 -圖文全面總結-

大家好,我是 mikechen。

Redis 現在是大型架構的必備技能,也是大廠重點考察對象,下面我就全面來詳解 Redis 的高性能架構 @mikechen

IO 多路複用技術

Redis 的高性能,有功於其使用的 IO 多路複用技術(IO multiplexing)。

IO 多路複用是一種 IO 模型,它使單個線程可以監視多個文件描述符(如:網絡套接字)。

這種機制避免了爲每個連接創建一個線程或進程的開銷,從而提升了性能。

Redis 在處理網絡 IO 時,採用異步非阻塞模式,利用了操作系統提供的 IO 多路複用技術(如 epoll),可以同時處理多個客戶端連接而不會阻塞整個服務進程。

如下圖所示:

IO 多路複用庫,包括 :select、poll、epoll(Linux)。

在不同的操作系統上,Redis 會選擇最適合的 IO 多路複用庫,Linux:主要使用 epoll。

epoll 是 Linux 下的高性能 IO 多路複用機制,利用了紅黑樹和事件就緒隊列,提供了更高效的文件描述符管理和事件通知,適合於需要處理大量併發連接的場景。

內存存儲

Redis 之所以性能快,主要原因是它將數據存儲在 " 內存 " 中,而不是在磁盤上。

原因很簡單,內存的讀寫帶寬遠高於磁盤,支持更高的併發讀寫操作。

爲什麼磁盤慢這麼多呢?原因是自己的設計結構,如下圖所示:

一次數據的讀寫,主要會涉及到:尋道、以及旋轉延遲。

尋道

爲了讀取、或寫入數據,首先,磁頭需要移動到正確的軌道上,這就是尋道。

如果每次讀取,都需要定位到正確的軌道,這就需要時間,特別是機械硬盤,就非常浪費時間。

所以,磁頭移動到目標軌道,這是最慢的一步之一。

旋轉延遲

當磁頭到達目標軌道後,還需要等待盤片,旋轉到正確位置以便訪問數據塊,這就會涉及到 “旋轉延遲”。

旋轉延遲,通常佔據了總 I/O 時間的一大部分,平均延遲時間約爲盤片轉一圈時間的一半。

所以,這些步驟,都是非常耗費性能的。

而內存,沒有磁盤旋轉、和磁頭移動的機械延遲,訪問時間在納秒級別,而磁盤訪問時間在毫秒級別。

所以,內存的速度會快非常多,這也是性能快的核心原因。

數據結構高效

Redis 提供了多種高效的數據結構(如:字符串、列表、集合、有序集合、哈希等),如下圖所示:

這些數據結構在內存中進行優化,能夠快速進行數據操作。

比如:

LPUSH task_queue "task1"
RPOP task_queue

列表使用 QuickList(雙向鏈表),可以在列表兩端快速插入和刪除元素。

常數時間複雜度:在列表兩端進行的操作時間複雜度爲 O(1)。

再比如:

SADD user_tags "tag1"
SISMEMBER user_tags "tag1"

集合基於哈希表實現,能夠在常數時間內完成添加和檢查操作。

優化的網絡通信協議

Redis 使用自己優化的 RESP(REdis Serialization Protocol),網絡通信協議。

該協議簡單且高效,能夠減少網絡通信的開銷,提升數據傳輸效率。

總之,Redis 通過上述多個方面的優化、和設計,使得它成爲了一個高性能的分佈式緩存,適用於各種需要快速響應、和處理大規模數據的應用場景。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/a4PQUxjgxEkDfdu3YDs77A