3.2 Redis和Memcached的集羣實現機制對比html
Memcached是全內存的數據緩衝系統,Redis雖然支持數據的持久化,可是全內存畢竟纔是其高性能的本質。做爲基於內存的存儲系統來講,機器物理內存的大小就是系統可以容納的最大數據量。若是須要處理的數據量超過了單臺機器的物理內存大小,就須要構建分佈式集羣來擴展存儲能力。算法
3.2.1 Memcached的分佈式存儲緩存
Memcached自己並不支持分佈式,所以只能在客戶端經過像一致性哈希這樣的分佈式算法來實現Memcached的分佈式存儲。圖6 給出了Memcached的分佈式存儲實現架構。當客戶端向Memcached集羣發送數據以前,首先會經過內置的分佈式算法計算出該條數據的目標節點,而後數據會直接發送到該節點上存儲。但客戶端查詢數據時,一樣要計算出查詢數據所在的節點,而後直接向該節點發送查詢請求以獲取數據。服務器
圖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。分佈式
圖7 Redis分佈式架構ide
爲了保證單點故障下的數據可用性,Redis Cluster引入了Master節點和Slave節點。如圖4所示,在Redis Cluster中,每一個Master節點都會有對應的兩個用於冗餘的Slave節點。這樣在整個集羣中,任意兩個節點的宕機都不會致使數據的不可用。當Master節點退出後,集羣會自動選擇一個Slave節點成爲新的Master節點。性能
圖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會是不錯的選擇。