對比 Redis 與 Memcached

xz43發表於2015-10-10

前幾天, Redis 的作者 Antirez 寫了一篇部落格, 駁斥了某個庫作者認為 Redis 比不上 Memcached 的觀點。

Antirez 的博文列舉了幾個他認為 Redis 比 Memcached 更優秀的地方, 但是並沒有對 Redis 和 Memcached 的每個功能進行詳細的對比, 而這篇文章要做的就是對 Antirez 的文章進行補充, 對 Redis 和 Memcached 進行詳細的對比, 透過檢視這些對比結果明白 Redis 和 Memcached 之間的區別。

Memcached是個純記憶體型的快取系統,支援資料型別單一,單個快取資料有限制,支援分散式,是個很理想的快取系統。

Redis是個簡單的NOSQL資料庫,支援幾種簡單的資料型別,支援主從複製,支援持久化,可以看作是個記憶體型資料庫。

由此可見,Memcached是正宗的快取系統,Redis是個可以做快取系統的記憶體型資料庫。

由於Redis的資料可以設定過期時間,支援多種資料型別,資料大小無限制,支援持久化等特點,貌似怎麼看都穩壓Memcached一籌,替代它好像是大勢所趨。

事實並非如此。

網站需要快取的資料可以分為兩種,一種是可丟失性的快取,這種快取不在乎被丟失,丟失了就再從資料庫或其它地方再讀回來,如Session,從資料庫查詢的資料,應用程式碼的快取等;另一種是不可丟失性的快取,就是其它地方沒儲存有,只有Redis快取有的資料。

先說下Memcached和Redis的優缺點:

Memcached是純記憶體型的快取,佔用記憶體小,執行穩定,讀寫資料很快。Redis的資料可以持久化到硬碟,佔用記憶體大,佔用硬碟IO高,在寫頻繁的時候而硬碟效能又不高的時候(目前只有SSD固態硬碟的效能才高,機械硬碟效能都不高),大大佔用CPU資源,讀寫效能會急劇降低,甚至會崩潰,不穩定。

為什麼說Memcached可以快取Session資料?有的人說,Memcached崩潰會造成Session丟失,我覺得這個可能性真的不大。Session是每個頁面都需要讀,每個新使用者都需要寫的,而且大部分的Session資料都是可丟失性的資料(一般網站陌生人Session比登入使用者Session要多的多),資料量也很小,非常適合儲存在Memcached。

Memcached其實是非常穩定的,目前我們網站每天百萬PV,沒出現過Memcached崩潰的問題。只要伺服器不崩潰,不是人為關閉,Memcached幾乎沒有崩潰的可能。如果伺服器經常崩潰的話,我覺得應該考慮換個好點的伺服器而不是把Memcached換成Redis。

當然了,Redis也有其適用的場合,使用Redis儲存那些不可丟失性資料。

功能對比

對比專案 Memcached Redis
支援的資料結構
  • 字串(二進位制安全,可直接儲存位元組資料)
  • 字串(二進位制安全,可直接儲存位元組資料)
  • 雜湊
  • 列表
  • 集合
  • 有序集合
  • 點陣圖(bitmap)
  • 地理位置(GEO)
  • HyperLogLog
單機附加功能
  • 自動過期
  • 流水線
  • 自動過期
  • 流水線
  • 事務
  • Lua 指令碼
  • 釋出與訂閱
  • 鍵空間通知
  • AOF 持久化
  • RDB 持久化
多機附加功能
  • 由客戶端實現的,基於分片的叢集(無Sentinel或複製)
  • 由伺服器端實現的,基於分片的叢集,自帶Sentinel和複製
  • 複製(無需叢集,可獨立運作)
  • Sentinel(無需叢集,可獨立運作)
  • twemproxy、codis、redis-cerberus 等多種第三方代理可選
記憶體分配方式 slab jemalloc
網路模型 使用多個執行緒處理多個客戶端,使用鎖對執行緒進行同步 單執行緒,透過 I/O 多路複用來處理多個客戶端

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1813731/,如需轉載,請註明出處,否則將追究法律責任。

相關文章