Redis 之所以快,主要歸功於以下幾個關鍵設計:


1. 基於內存存儲

  • 數據主要存儲在內存中,讀寫操作直接操作內存,避免磁盤 I/O 的延遲。
  • 內存的訪問速度比磁盤快幾個數量級(納秒 vs 毫秒級)。

2. 高效的數據結構

  • Redis 不僅支持簡單的鍵值對,還提供了經過優化的高效數據結構:
  • 字符串(String)列表(List)哈希(Hash)集合(Set)有序集合(ZSet) 等。
  • 每種數據結構都針對特定場景做了優化(如哈希表的漸進式 rehash、跳錶實現有序集合等)。

3. 單線程模型(核心網絡模型)

  • Redis 6.0 之前,網絡 I/O 和鍵值操作使用單線程,避免了多線程的上下文切換和競爭條件。
  • 單線程簡化了設計,無需鎖機制,保證了原子性操作。
  • Redis 6.0 後引入了多線程 I/O(處理網絡讀寫),但核心命令執行仍是單線程

4. I/O 多路複用

  • 使用 epoll(Linux)、kqueue(BSD)等系統調用,實現高併發的非阻塞 I/O。
  • 單個線程可以同時處理大量客户端連接,減少等待時間。

5. 優化的編碼與協議

  • RESP(Redis 序列化協議) 簡單高效,易於解析。
  • 根據不同數據動態選擇緊湊的編碼方式(如 ziplistintset 等),節省內存和帶寬。

6. 避免上下文切換

  • 單線程模型避免了多線程頻繁切換的開銷,尤其在 CPU 密集場景下表現更穩定。

7. 持久化優化

  • 雖然支持持久化(RDB/AOF),但通過 fork 子進程異步處理,不影響主線程的性能。
  • AOF 的 appendfsync 可配置為每秒同步,平衡性能與數據安全。

8. 局部性原理與緊湊存儲

  • 數據在內存中連續存儲,利用 CPU 緩存行(Cache Line)提升訪問效率。
  • 特殊編碼(如 ziplist)將多個小數據壓縮存儲,減少內存碎片。

9. 管道(Pipeline)與批處理

  • 客户端可通過管道一次性發送多個命令,減少網絡往返時間(RTT)。

性能瓶頸提示:

  • Redis 的瓶頸通常是內存大小網絡帶寬,而非 CPU。
  • 複雜命令(如 KEYS *FLUSHALL)或大數據量的操作可能阻塞單線程,需謹慎使用。

總結:

Redis 的快是 內存存儲 + 高效數據結構 + 單線程模型 + I/O 多路複用 共同作用的結果。它在設計上做出了合理的取捨(如犧牲持久化實時性換取性能),從而成為高性能緩存的經典解決方案。