談談Memcached與Redis(四)

鴨脖發表於2015-05-21
3.2 Redis和Memcached的叢集實現機制對比
Memcached是全記憶體的資料緩衝系統,Redis雖然支援資料的持久化,但是全記憶體畢竟才是其高效能的本質。作為基於記憶體的儲存系統來說,機器實體記憶體的大小就是系統能夠容納的最大資料量。如果需要處理的資料量超過了單臺機器的實體記憶體大小,就需要構建分散式叢集來擴充套件儲存能力。
3.2.1 Memcached的分散式儲存
Memcached本身並不支援分散式,因此只能在客戶端通過像一致性雜湊這樣的分散式演算法來實現Memcached的分散式儲存。圖6 給出了Memcached的分散式儲存實現架構。當客戶端向Memcached叢集傳送資料之前,首先會通過內建的分散式演算法計算出該條資料的目標節點,然後資料會直接傳送到該節點上儲存。但客戶端查詢資料時,同樣要計算出查詢資料所在的節點,然後直接向該節點傳送查詢請求以獲取資料。
談談Memcached與Redis(四)
圖6 Memcached客戶端分散式儲存實現
3.2.2 Redis的分散式儲存
相較於Memcached只能採用客戶端實現分散式儲存,Redis更偏向於在伺服器端構建分散式儲存。儘管Redis當前已經發布的穩定版本還沒有新增分散式儲存功能,但Redis開發版中已經具備了Redis Cluster的基本功能。預計在2.6版本之後,Redis就會發布完全支援分散式的穩定版本,時間不晚於2012年底。下面我們會根據開發版中的實現,簡單介紹一下Redis Cluster的核心思想。
Redis Cluster是一個實現了分散式且允許單點故障的Redis高階版本,它沒有中心節點,具有線性可伸縮的功能。圖7給出Redis Cluster的分散式儲存架構,其中節點與節點之間通過二進位制協議進行通訊,節點與客戶端之間通過ascii協議進行通訊。在資料的放置策略上,Redis Cluster將整個key的數值域分成4096個雜湊槽,每個節點上可以儲存一個或多個雜湊槽,也就是說當前Redis Cluster支援的最大節點數就是4096。Redis Cluster使用的分散式演算法也很簡單:crc16( key ) % HASH_SLOTS_NUMBER。
談談Memcached與Redis(四)
圖7 Redis分散式架構
為了保證單點故障下的資料可用性,Redis Cluster引入了Master節點和Slave節點。如圖4所示,在Redis Cluster中,每個Master節點都會有對應的兩個用於冗餘的Slave節點。這樣在整個叢集中,任意兩個節點的當機都不會導致資料的不可用。當Master節點退出後,叢集會自動選擇一個Slave節點成為新的Master節點。
談談Memcached與Redis(四)
圖8 Redis Cluster中的Master節點和Slave節點
3.3 Redis和Memcached整體對比
Redis的作者Salvatore Sanfilippo曾經對這兩種基於記憶體的資料儲存系統進行過比較,總體來看還是比較客觀的,現總結如下:
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會是不錯的選擇。

相關文章