標籤: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