Redis 和 Memcached 比較

AskHarries發表於2018-05-05

一、 redis介紹

Redis是一個開源,先進的key-value儲存,並用於構建高效能,可擴充套件的Web應用程式的完美解決方案。

Redis從它的許多競爭繼承來的三個主要特點:

  • Redis資料庫完全在記憶體中,使用磁碟僅用於永續性。
  • 相比許多鍵值資料儲存,Redis擁有一套較為豐富的資料型別。
  • Redis可以將資料複製到任意數量的從伺服器。

Redis 優勢:

  • 異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
  • 支援豐富的資料型別:Redis支援最大多數開發人員已經知道像列表,集合,有序集合,雜湊資料型別。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的資料型別更好。
  • 操作都是原子性:所有Redis操作是原子的,這保證瞭如果兩個客戶端同時訪問的Redis伺服器將獲得更新後的值。
  • 多功能實用工具:Redis是一個多實用的工具,可以在多個用例如快取,訊息,佇列使用(Redis原生支援釋出/訂閱),任何短暫的資料,應用程式,如Web應用程式會話,網頁命中計數等。

二、memcache介紹

memcache是一個高效能的分散式的記憶體物件快取系統,用於動態Web應用以減輕資料庫負擔。它通過在記憶體中快取資料和物件,來減少讀取資料庫的次數。從而提高動態、資料庫驅動網站速度。

memcache通過在記憶體裡維護一個統一的巨大的hash表,它能夠用來儲存各種格式的資料,包括影象、視訊、檔案以及資料庫檢索的結果等。memcache主要用於分擔資料庫負的壓力,memcache將資料呼叫到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。

memcached 的目前版本是通過C實現,採用了單程式、單執行緒、非同步I/O,基於事件(event_based)的服務方式.使用libevent作為事件通知實現。多個Server可以協同工作,但這些 Server 之間是沒有任何通訊聯絡的,每個Server只是對自己的資料進行管理。Client端通過指定Server端的ip地址(通過域名應該也可以)。需要快取的物件或資料是以key->value對的形式儲存在Server端。key的值通過hash進行轉換,根據hash值把value傳遞到對應的具體的某個Server上。當需要獲取物件資料時,也根據key進行。首先對key進行hash,通過獲得的值可以確定它被儲存在了哪臺Server上,然後再向該Server發出請求。Client端只需要知道儲存hash(key)的值在哪臺伺服器上就可以了。

memcached的記憶體演算法:
Memcached利用slab allocation機制來分配和管理記憶體,它按照預先規定的大小,將分配的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,資料在存放時,根據鍵值大小去匹配slab大小,找就近的slab存放,所以存在空間浪費現象。
傳統的記憶體管理方式是,使用完通過malloc分配的記憶體後通過free來回收記憶體,這種方式容易產生記憶體碎片並降低作業系統對記憶體的管理效率。

Memcached的快取策略:
Memcached的快取策略是LRU(最近最少使用)加上到期失效策略。當你在memcached記憶體儲資料項時,你有可能會指定它在快取的失效時間,預設為永久。當memcached伺服器用完分配的內時,失效的資料被首先替換,然後也是最近未使用的資料。在LRU中,memcached使用的是一種Lazy Expiration策略,自己不會監控存入的key/vlue對是否過期,而是在獲取key值時檢視記錄的時間戳,檢查key/value對空間是否過期,這樣可減輕伺服器的負載。

分散式演算法(Consistent Hashing):

選擇伺服器演算法有兩種,一種是根據餘數來計算分佈,另一種是根據雜湊演算法來計算分佈。
餘數演算法:
先求得鍵的整數雜湊值,再除以伺服器臺數,根據餘數確定存取伺服器,這種方法計算簡單,高效,但在memcached伺服器增加或減少時,幾乎所有的快取都會失效。
雜湊演算法:
先算出memcached伺服器的雜湊值,並將其分佈到0到2的32次方的圓上,然後用同樣的方法算出儲存資料的鍵的雜湊值並對映至圓上,最後從資料對映到的位置開始順時針查詢,將資料儲存到查詢到的第一個伺服器上,如果超過2的32次方,依然找不到伺服器,就將資料儲存到第一臺memcached伺服器上。如果新增了一臺memcached伺服器,只在圓上增加伺服器的逆時針方向的第一臺伺服器上的鍵會受到影響。

三、總結

1、儲存方式:
memecache 把資料全部存在記憶體之中,斷電後會掛掉,資料不能超過記憶體大小
redis有部份存在硬碟上,這樣能保證資料的永續性,支援資料的持久化(筆者注:有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置檔案快照引數,要不就很有可能伺服器頻繁滿載做dump)。
2、資料支援型別:
redis在資料支援上要比memecache多的多。
3、使用底層模型不同:
新版本的redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求。
4、分散式環境:
memcached的分散式由客戶端實現,通過一致性雜湊演算法來保證訪問的快取命中率;Redis的分散式由伺服器端實現,通過服務端配置來實現分散式;

Redis 和 Memcached 比較



相關文章