標籤:memcached redis 快取服務器 高效能 nosql
GitHub版本地址: https://github.com/cncounter/translation/blob/master/tiemao_2014/Redis_beats_Memcached/Redis_beats_Memcached.md
Redis是新興的通用儲存系統,而Memcached仍有其適用領域
Memcached還是Redis? 在現代高效能Web應用中這一直是個爭論不休的話題。 在基於關係型資料庫的Web應用需要提高效能時,使用緩衝是絕大多數架構師的第一選擇,自然,Memcached和Redis通常是優先選擇。
共同特徵
- 都是 key-value 形式的記憶體資料庫
- 都是NoSQL家族的資料管理解決方案
- 都基於同樣的key-value 資料模型
- 所有資料全部放在記憶體中(這也是適用於緩衝的原因)
- 效能得分不分伯仲,包括資料輸送量和延遲等指標
- 都是成熟的、廣受開源項目歡迎的 key-value儲存系統
Memcached最初在2003年由 Brad Fitzpatrick 為 LiveJournal網站開發。然後又用C語言重寫了一遍(初版為Perl實現),並開放給公眾使用,從此成為現代Web系統開發的基石。 當前Memcached的發展方向是改進穩定性和效能最佳化,而不是添加新功能特性。
Redis於2009年由 Salvatore Sanfilippo 建立, 直到今天 Sanfilippo 依然是Redis的唯一開發人員和代碼維護者。 Redis也被稱為 "Memcached增強版(Memcached on steroids)", 這一點也不令人驚訝, 因為 Redis 有一部分就是在 Memcached 的經驗總結之上構建的的。 Redis比Memcached具有更多的功能特性,這使得它更靈活,更強大也更複雜。
Memcached和Redis被眾多企業以及大量生產系統所採用, 支援各種語言開發的用戶端,有豐富的SDK。 事實上, 在上點規模的互連網Web開發語言中,基本上沒有不支援Memcached或Redis的。
為什麼Memcached和Redis如此流行? 不僅是其具有超高的效能,還因為相對來說他們都非常簡單。 對程式員來說上手使用Memcached或Redis相當容易。 安裝和設定並整合到系統中可能只需要幾分鐘時間。 因此花費一點點時間和精力就能立刻大幅提升系統效能 —— 通常是提升一個數量級。 一個簡潔的解決方案卻能獲得巨大的效能收益: 這酸爽簡直超乎你的想象。
Memcached 適用情境
因為Redis是新興解決方案,提供了更多的功能特性,比起Memcached來說, Redis一般都是更好的選擇。 在兩個特定情境下Memcached可能是更好的選擇。
第一種是很細碎的待用資料,如HTML程式碼片段。 Memcached的記憶體管理不像Redis那麼複雜,所以效能更高一些,原因是Memcached 的中繼資料metadata更小,相對來說額外開銷就很少。 Memcached唯一支援的資料類型是字串 String
,非常適合緩衝唯讀資料,因為字串不需要額外的處理。
第二個情境,是Memcached比Redis更容易水平擴充。 原因在於它的設計和和功能很簡單,Memcached更容易擴充。 訊息顯示, Redis在即將到來的3.0版(閱讀CA版本發布筆記)將內建可靠的叢集支援[但一直在跳票]。
Redis 用武之地
除非受環境制約(如遺留系統),或者業務符合上面的2種情況,否則你應該優先選擇Redis。 使用Redis作為緩衝,通過調優緩衝內容,系統效率能獲得極其提升。
很明顯Redis的優勢在於緩衝管理。 緩衝通過某種資料回收機制(data eviction mechanism)在必要時將舊資料從記憶體中刪除,為新資料騰出空間。 Memcached的資料回收機制使用LRU(Least Recently Used,最近最少使用)演算法,同時優先清除與新資料大小差不多的舊資料區塊。 相比之下,Redis允許細粒度控制到期緩衝,有6種不同的策略可供選擇。 Redis還採用了一些更複雜的記憶體管理方法和回收策略。
Redis對緩衝的對象提供更大的靈活性。 而Memcached限制 key 為250位元組,限制 value 為1 MB,且只能通過純文字String通訊. Redis的 key 和 value 大小限制都是512 MB,是二進位安全的【即不丟資料,與編碼無關】。 Redis提供6種資料類型,使緩衝以及管理緩衝變得更加智能和方便,為應用程式開發人員開啟了一個無限可能的世界。
相比將對象序列化後通過字串儲存, Redis 通過 Hash來儲存一個對象的欄位和值,並可以通過單個key來管理它們。
看看用Memcached更新一個對象需要幹什麼:
- 擷取整個字串
- 還原序列化為對象
- 修改其中的值
- 再次序列化該對象
- 在緩衝中將整個字串替換為新字串
並且每次更新都要幹這些破事。
而使用Redis Hash的方式, 可以大幅度降低資源消耗並提高效能。 Redis的其他資料類型,如List 或者 Set,可用來實現更複雜的緩衝管理員模式。
Redis的另一個重大優點是其儲存的資料是不透明的,這意味著在伺服器端可以直接操縱這些資料。 160多個命令中的大部分都可以用來進行資料操作, 所以通過服務端指令碼調用進行資料處理成為現實。 這些內建命令和使用者指令碼可以讓你直接靈活地處理資料任務,而無需通過網路將資料轉送給另一個系統進行處理。
Redis提供了可選/可調整的資料持久化, 目的是為了在 崩潰/重啟後可以快速載入緩衝。 雖然我們一般認為緩衝中的資料是不穩定,瞬時的, 但在緩衝系統中將資料持久化到磁碟還是很有價值的。 在重啟後立即載入預熱的方式耗時很短, 而且減輕了主要資料庫系統的開銷。
最後, Redis提供主從複製(replication)。 Replication 可用於實現高可用的cache系統,允許某些伺服器宕機的情況下也能提供不間斷的服務。 假設要求在某台快取服務器崩潰時, 只有少部分使用者和程式在短時間內受影響, 大多數情況下就需要有一個行之有效解決方案,來保證緩衝內容和服務的可用性。
當今開源軟體一直在提供最佳的實用技術方案。 需要使用緩衝來提高應用系統效能時,Redis和Memcached是最佳的產品級解決方案。 但考慮到其豐富的功能和先進的設計,絕大多數時候Redis都應該是你的第一選擇。
作者簡介: Itamar Haber (@itamarhaber) 是 Redis Labs的首席開發人員, 該企業為開發人員提供完全託管的Memcached和Redis雲端服務。 具有多年軟體產品研發經驗,曾在 Xeround, Etagon, Amicada, and M.N.S Ltd.擔任管理和領導職位. Itamar 獲得 Northwestern and Tel-Aviv Universitiesd 的Kellogg-Recanati工商管理碩士, 以及 Science in Computer Science 學士。
相關閱讀:
- 用Memcached提升Java公司專屬應用程式效能,Part 1:體繫結構和配置
- 用Memcached提升Java公司專屬應用程式效能,Part 2:基於資料庫的webApp
- Cache之爭: Azure和AWS升級快取服務
原文連結: Why Redis beats Memcached for caching
原文日期: 2014-10-15
翻譯日期: 2014-10-23
翻譯人員: 鐵錨
Redis為何要比Memcached的Bigger高