談談Memcached與Redis(四)
3.2 Redis和Memcached的叢集實現機制對比
Memcached是全記憶體的資料緩衝系統,Redis雖然支援資料的持久化,但是全記憶體畢竟才是其高效能的本質。作為基於記憶體的儲存系統來說,機器實體記憶體的大小就是系統能夠容納的最大資料量。如果需要處理的資料量超過了單臺機器的實體記憶體大小,就需要構建分散式叢集來擴充套件儲存能力。
3.2.1 Memcached的分散式儲存
Memcached本身並不支援分散式,因此只能在客戶端通過像一致性雜湊這樣的分散式演算法來實現Memcached的分散式儲存。圖6 給出了Memcached的分散式儲存實現架構。當客戶端向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。
為了保證單點故障下的資料可用性,Redis Cluster引入了Master節點和Slave節點。如圖4所示,在Redis Cluster中,每個Master節點都會有對應的兩個用於冗餘的Slave節點。這樣在整個叢集中,任意兩個節點的當機都不會導致資料的不可用。當Master節點退出後,叢集會自動選擇一個Slave節點成為新的Master節點。
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會是不錯的選擇。
相關文章
- 談談Redis快取中MySQL的資料如何與Redis同步Redis快取MySql
- 圖解Redis,談談Redis的持久化,RDB快照與AOF日誌圖解Redis持久化
- 【Redis與Memcached比較】Redis
- 對比 Redis 與 MemcachedRedis
- Redis與Memcached的區別Redis
- 談談mysql和redis的區別MySqlRedis
- 淺談redis持久化Redis持久化
- 談談面試與面試題面試題
- Redis的配置及與memcached區別Redis
- Memcached與Redis有什麼區別Redis
- Memcached 與 Redis 實現的對比Redis
- memcached與redis實現的對比Redis
- redis和memcachedRedis
- Redis作者談Redis應用場景Redis
- 架構雜談《四》架構
- 淺談星期四
- 談談java的類與物件Java物件
- 月半談(一)redis-分散式鎖與應用Redis分散式
- java基礎(四):談談java中的IO流Java
- Redis 字典結構細談Redis
- PostgreSQL、Redis與Memcached的效能比較 - CYBERTECSQLRedis
- 淺談Ogre的四元數與旋轉-1
- 敏捷開發大家談(四)敏捷
- 【原創】談談redis的熱key問題如何解決Redis
- Redis工作系列之一 與 Memcached對比理解Redis
- 淺談 Redis 資料結構Redis資料結構
- 淺談Redis的隱性成本Redis
- 簡單來談談Unicode與emojiUnicode
- 談談Markdown的認識與入門
- 談談前端異常捕獲與上報前端
- 談談反爬蟲“政策與對策”爬蟲
- 談談“物件導向”與“程式導向”物件
- 談談redis,memcache的區別和具體應用場景Redis
- 我們們一起來談談,redis為什麼快?Redis
- Redis 和 Memcached 比較Redis
- 【MySQL】四、Insert buffer 漫談MySql
- 【原創】淺談指標(四)指標
- 談談測試環境管理與實踐