动态

详情 返回 返回

性能比拼: Redis vs Memcached - 动态 详情

本內容是對知名性能評測博主 Anton Putra Redis vs Memcached Performance Benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準

在本視頻中,我們將對比 RedisMemcached。我會介紹一些功能上的不同,但主要關注 性能

首先,我們會衡量緩存系統最重要的指標之一---延遲(latency),使用 p99 百分位數。緩存系統最常見的操作是 set(寫入)get(讀取),因此我們將重點測試這兩個操作。此外,我們還會衡量:

  • 吞吐量(throughput):即每秒可處理的操作數
  • 飽和度(saturation):通過監控 CPU 使用率、內存使用率 以及 網絡流量 來評估

所有測試均在 AWS 上運行,並使用與生產環境完全相同的基礎設施。本次測試中,我們使用 m7a.medium 實例來運行 Redis 和 Memcached。眾所周知,Redis 主要依賴 單線程,因此垂直擴展能力有限。

接下來,我會介紹測試設計。此外,我還使用了 EKS(Elastic Kubernetes Service) 集羣,運行 Graviton 實例來部署監控組件,同時運行客户端以模擬負載。


什麼是緩存?

假設你有一個典型的 三層架構

  1. 客户端層:可能是瀏覽器或移動應用
  2. 邏輯層:運行應用程序和業務邏輯
  3. 數據層:用於持久化存儲數據

舉個例子,假設你運營一個 電商網站,所有 用户數據商品信息 都存儲在 關係型數據庫 中。每當客户登錄賬户時,你需要展示他們的 姓名、收貨地址 以及其他詳細信息。

這些數據並不會頻繁變更,但每次請求時,仍然需要查詢數據庫。如果你的用户數量較少,這還可以接受,但如果有成千上萬的用户,這些查詢 會變得越來越慢

解決方案是:
當用户登錄時,查詢數據庫並將數據存儲在緩存中(例如 60 秒)
這樣可以 提高用户體驗,加快網站加載速度,並減少數據庫負載。

你還可以緩存其他 SQL 查詢,比如 最暢銷商品,以便在首頁展示。這就是緩存系統最初解決的問題---緩存 SQL 查詢結果,存入臨時存儲。

之後,緩存系統的使用場景不斷擴展,並發展出了 持久化存儲 等額外功能。

目前,Memcached 仍主要用於 緩存數據庫查詢,而 Redis 則發展出了 豐富的功能集


測試設計

為了保證測試的公平性,我每次都會使用 Terraform 創建所有基礎設施。

  • 本次測試使用 medium(中等)實例,因為 Redis 是單線程的,只能通過 水平擴展(Redis 集羣) 進行擴展。
  • 另外,我創建了一個 EKS 集羣,並部署 Prometheus、Grafana 等監控組件,還配置了 每種緩存 20 個客户端 來模擬負載。
  • 我會 逐步增加客户端數量,直到 Redis 和 Memcached 都達到極限
  • 每次測試通常運行 1.5 - 2 小時

配置概覽

  • 我使用當前最新版本:

  • Redis 7.4.1
  • Memcached 1.6.32

  • Redis

    • 採用最小化配置,保留大部分默認設置
    • 禁用持久化
    • 最大連接數設為 10,000


  • Memcached

    • 默認內存從 64MB 增加到 4GB(與 VM 限制一致)
    • 最大連接數同樣設為 10,000
  • 客户端

  • 使用 Go 語言開發
  • 內部集成 Prometheus 指標
  • 採用 最流行、最高效的驅動
  • 不使用內部緩存指標,而是通過 相同的直方圖桶 從客户端端測量延遲,以確保測試更加準確。

第一次測試

接下來,我們開始運行測試。

在下方的圖表中,你可以看到我們逐步增加客户端數量。

Redis 的 set(寫入)延遲從一開始就比 Memcached 略慢,但 get(讀取)延遲在最初幾分鐘幾乎相同
然而,當負載增加時,情況開始發生變化

  • CPU 使用率 在整個測試過程中幾乎相同
  • 內存使用情況 也相似,但呈現出不同的模式:

    • set 操作設置 20 秒的過期時間,因此 Redis 和 Memcached 每 20 秒都會刪除數據
    • 兩者的內存清理方式不同
  • 網絡傳輸的數據量 也有一些不同

當操作數達到 50,000 次/秒 時,Redis 開始落後於 Memcached,並且 延遲上升到 10 - 15 毫秒
相比之下,Memcached 在整個測試過程中保持穩定

在網絡上,你可能會看到 Memcached 的性能比 Redis 更強,但 延遲才是最關鍵的指標
更高的延遲意味着網頁加載更慢,最終影響用户體驗。

儘管 Redis 具有豐富的功能,但你真的需要它們嗎?

Redis 集羣難以擴展和維護,你可能需要不斷添加 新的分片(shard) 並進行 重新平衡
通常,很多人一開始自己管理 Redis,但隨着負載增加,他們會轉向 Redis 集羣
經歷幾次 生產事故 後,最終可能會選擇 昂貴的託管 Redis(AWS 或其他雲服務)

相比之下,Memcached 非常容易運行,如果你 只是想緩存 SQL 查詢 以加速數據庫,Memcached 是一個不錯的選擇


測試結果

在 CPU 資源耗盡之前:

  • Redis 最高處理能力:94,000 請求/秒
  • Memcached 最高處理能力:112,000 請求/秒

最重要的還是延遲
根據本次測試結果,你可以自己決定:

  • 是選擇簡單、低延遲的 Memcached
  • 還是選擇功能強大的 Redis

請記住,維護 Redis 集羣非常困難,很多公司甚至專門僱人 只負責維持 Redis 的正常運行




現在,我們查看整個測試期間的各項指標:

  1. 每秒操作數(Operations per second)

  • 50,000 ops/sec 時,Redis 和 Memcached 的性能開始出現差異
  • 可以清楚地看到 每種緩存的最大處理能力
  1. SET(寫入)操作的延遲

  • 延遲差異 非常明顯
  • 在 Redis 過載時,延遲甚至接近 SQL 查詢本身的延遲(35ms)
  • 但在 CPU 使用率低於 15% 時,兩者的延遲都很穩定且較低
  1. GET(讀取)操作的延遲

  • 趨勢類似,但 GET 操作的平均時間約為 SET 操作的一半
  • Redis 最高 GET 延遲約為 20ms
  1. CPU 使用率

  • 兩者表現幾乎相同,在 CPU 滿載前都能維持穩定
  1. 內存使用

  • 兩者模式稍有不同
  1. 網絡使用

  • 有一定的區別

總結

這些測試都使用的是 默認配置
如果你能優化 Redis 或 Memcached,歡迎提交 PR(Pull Request),我會給予 署名,並分享如何改進性能。

Add a new 评论

Some HTML is okay.