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