Memcached 是一個高效能的分布式記憶體對象緩衝系統,用於動態Web應用以減輕資料庫負載。它通過在記憶體中快取資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴充性。
redis是一個key-value儲存系統,是一個高效能的key-value資料庫。
在考慮對應用程式的效能表現進行提升時,緩衝機制往往是解決問題的重要起點,而Memcached與Redis則經常被作為初步方案來加以比較。
二者相似點:
Memcached與Redis都屬於記憶體內、索引值資料存放區方案。從效能表現的角度來看,兩類資料存放區機制也具備諸多共通性,包括擁有幾乎相同的特徵(與指標)表現、而且高度關注工作負載的資料輸送量與延遲狀況。
Memcached與Redis在任何一種可行性程式設計語言領域都擁有能夠提供支援的用戶端庫,而且二者也被包含在開發人員們使用的多種庫及軟體包之內。
二者不同點:
1.資料持久化支援不同
memcahced不支援資料的持久化,伺服器關閉之後數 據全部丟失。而redis支援資料持久化和資料同步。
重啟memcached、重啟作業系統會導致全部資料消失。另外,內容容量達到指定值之後,就基於LRU(Least Recently Used)演算法自動刪除不使用的緩衝。memcached本身是為緩衝而設計的伺服器,因此並沒有過多考慮資料的永久性問題。
2.資料類型支援不同
Memcached僅支援簡單的key-value結構的資料。Redis支援的資料類型要豐富得多。最為常用的資料類型主要由五種:String、Hash、List、Set和Sorted Set。Redis內部使用一個redisObject對象來表示所有的key和value。
3.記憶體管理機制不同 在Redis中,並不是所有的資料都一直儲存在記憶體中的。這是和Memcached相比一個最大的區別。當實體記憶體用完時,Redis可以將一些很久沒用到的value交換到磁碟。Redis只會緩衝所有的key的資訊,如果Redis發現記憶體的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在記憶體中清除。這種特性使得Redis可以保持超過其機器本身記憶體大小的資料。redis相較於Memcached的記憶體管理方法來說,要簡單很多。
4.叢集管理不同
作為基於記憶體的儲存系統來說,機器實體記憶體的大小就是系統能夠容納的最大資料量。如果需要處理的資料量超過了單台機器的實體記憶體大小,就需要構建分布式叢集來擴充儲存能力。
Memcached本身並不支援分布式,因此只能在用戶端通過像一致性雜湊這樣的分布式演算法來實現Memcached的分布式儲存。下圖給出了Memcached的分布式儲存實現架構。當用戶端向Memcached叢集發送資料之前,首先會通過內建的分布式演算法計算出該條資料的目標節點,然後資料會直接發送到該節點上儲存。但用戶端查詢資料時,同樣要計算出查詢資料所在的節點,然後直接向該節點發送查詢請求以擷取資料。
Redis更偏向於在伺服器端構建分布式儲存。最新版本的Redis已經支援了分布式儲存功能。Redis Cluster是一個實現了分布式且允許單點故障的Redis進階版本,它沒有中心節點,具有線性可伸縮的功能。下圖給出Redis Cluster的分布式儲存架構,其中節點與節點之間通過二進位協議進行通訊,節點與用戶端之間通過ascii協議進行通訊。在資料的放置策略上,Redis Cluster將整個key的數範圍分成4096個雜湊槽,每個節點上可以儲存一個或多個雜湊槽,也就是說當前Redis Cluster支援的最大節點數就是4096。Redis Cluster使用的分布式演算法也很簡單:crc16( key ) % HASH_SLOTS_NUMBER。