key-value 記憶體資料庫 : memcached vs redis

來源:互聯網
上載者:User

標籤:io   ar   os   使用   sp   java   strong   檔案   on   

 

Memcached:

  • 高效能的分布式快取資料庫
  • key-value儲存方式(hashmap)
  • 不支援資料持久化,伺服器關閉後資料全部被丟失
  • C開發的,基於libevent庫,在大多數linux,bsd,solaris,以及windows 等os上都可用
  • 用戶端實現軟體的語言非常多:C/C++, PHP, Java, Python, Erlang, Perl, Lua,Go 等

 

 

Redis:

  • 開源key-value 儲存系統
  • C語言開發
  • 在大多數linux,bsd,solaris 等系統上無需依賴就可以使用
  • 用戶端語言:C/C++,C#,Obj-C,PHP, Python,Java,Perl,Lua,Erlang

 

記憶體管理方式:

  Memcached:預設使用Slab allocation 機制管理記憶體,主要思想是按照預先規定的大小,將分配的記憶體分割成特定長度的塊以儲存相應長度的key-value記錄,以解決記憶體片段的問題。 Slab allocation 只是用於外部資料的儲存,而memcached其他的記憶體需求還是通過malloc/free來申請。

      Slab Allocation的原理相當簡單。 3所示,它首先從作業系統申請一大塊記憶體,並將其分割成各種尺寸的塊Chunk,並把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來儲存key-value資料的最小單位。每個Slab Class的大小,可以在Memcached啟動的時候通過制定Growth Factor來控制。假定Figure 1中Growth Factor的取值為1.25,所以如果第一組Chunk的大小為88個位元組,第二組Chunk的大小就為112個位元組,依此類推。

當記憶體不足時會採用LRU機制,替換出陳舊資料

      Redis:

      Redis的記憶體管理主要通過源碼中zmalloc.h和zmalloc.c兩個檔案來實現的。Redis為了方便記憶體的管理,在分配一塊記憶體之後,會將 這塊記憶體的大小存入記憶體塊的頭部。

          size | mem block

    Redis通過定義一個數組來記錄所有的記憶體配置情況,這個數組的長度為ZMALLOC_MAX_ALLOC_STAT。數組的每一個元素代表當前程式所分配的記憶體塊的個數,且記憶體塊的大小為該元素的下標。在源碼中,這個數組為zmalloc_allocations。 zmalloc_allocations[16]代表已經分配的長度為16bytes的記憶體塊的個數。zmalloc.c中有一個靜態變數 used_memory用來記錄當前分配的記憶體總大小。所以,總的來看,Redis採用的是封裝的mallc/free,相較於Memcached的記憶體 管理方法來說,要簡單很多。

採取磁碟儲存機制實現資料持久化。但是,當資料量達到1千萬左右時,由於記憶體中不能儲存如此大量數目的資料,頻繁同磁碟進行資料交換,導致資料查詢、儲存效能的急劇下降,將導致服務不可用

分布式機制:

  memcached:本身並不支援分布式,因此只能在用戶端通過像一致性雜湊這樣的分布式演算法來實現Memcached的分布式儲存。

  Redis:更偏向於在伺服器端構建分布式儲存。儘管Redis當前已經發布的穩定版本還沒有添加分布式儲存功能,但Redis開發版中已經具備了Redis Cluster的準系統。預計在2.6版本之後,Redis就會發布完全支援分布式的穩定版本,時間不晚於2012年底。下面我們會根據開發版中的實現,簡單介紹一下Redis Cluster的核心思想。

  Redis Cluster是一個實現了分布式且允許單點故障的Redis進階版本,它沒有中心節點,具有線性可伸縮的功能。

 

整體效能:

  

1)效能對比:由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在儲存小資料時比Memcached效能更 高。而在100k以上的資料中,Memcached效能要高於Redis,雖然Redis最近也在儲存大資料的效能上進行最佳化,但是比起 Memcached,還是稍有遜色。

2)記憶體使用量效率對比:使用簡單的key-value儲存的話,Memcached的記憶體利用率更高,而如果Redis採用hash結構來做key-value儲存,由於其組合式的壓縮,其記憶體利用率會高於Memcached。

3)Redis支援伺服器端的資料操作:Redis相比Memcached來說,擁有更多的資料結構和並支援更豐富的資料操作,通常在Memcached 裡,你需要將資料拿到用戶端來進行類似的修改再set回去。這大大增加了網路IO的次數和資料體積。在Redis中,這些複雜的操作通常和一般的 GET/SET一樣高效。所以,如果需要緩衝能夠支援更複雜的結構和操作,那麼Redis會是不錯的選擇。

4)如果你對資料持久化和資料同步有所要求,那麼推薦你選擇Redis。因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統後快取資料不會丟失,選擇Redis也是明智的。

key-value 記憶體資料庫 : memcached vs redis

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.