快取技術Memcached與Redis的終極大PK
一、在網路IO模型方面
Memcached:
1、Memcached是多執行緒,非阻塞IO複用的網路模型,分為監聽主執行緒和worker子執行緒
2、監聽執行緒監聽網路連線,接受請求後,將連線描述字pipe傳遞給worker執行緒,進行讀寫IO, 網路層使用libevent封裝的事件庫
3、多執行緒模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats命令,實際Memcached所有操作都要對這個全域性變數加鎖,進行計數等工作,帶來了效能損耗
Redis:
1、Redis使用單執行緒的IO複用模型,自己封裝了一個簡單的AeEvent 事件處理框架,主要實現了epoll、kqueue 和 select,對於單純只有IO操作來說,單執行緒可以將速度優勢發揮到最大
2、Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單執行緒模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO排程都是被阻塞住的
二、在記憶體管理方面
Memcached:
1、Memcached使用預分配的記憶體池的方式,使用slab和大小不同的chunk來管理記憶體,Item根據大小選擇合適的chunk儲存,記憶體池的方式可以省去申請/釋放記憶體的開銷,並且能減小記憶體碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在記憶體仍然有很大空間時,新的資料也可能會被剔除
Redis:
1、Redis使用現場申請記憶體的方式來儲存資料,並且很少使用free-list等方式來優化記憶體分配,會在一定程度上存在記憶體碎片,Redis根據儲存命令引數,會把帶過期時間的資料單獨存放在一起,並把它們稱為臨時資料,非臨時資料是永遠不會被剔除的,即便實體記憶體不夠,導致swap也不會剔除任何非臨時資料(但會嘗試剔除部分臨時資料),這點上Redis更適合作為儲存而不是cache
三、在資料一致性方面
Memcached:
1、提供了cas命令,可以保證多個併發訪問操作同一份資料的一致性問題
Redis:
1、沒有提供cas命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串命令的原子性,中間不會被任何操作打斷
四、在儲存方式方面
Memcached:
1、只支援簡單的key-value儲存
Redis:
1、Redis除key/value之外,還支援list,set,sorted set,hash等眾多資料結構
五、在叢集實現方面
Memcached:
1、Memcached本身並不支援分散式,因此只能在客戶端通過像一致性雜湊這樣的分散式演算法來實現Memcached的分散式儲存
2、客戶端向Memcached叢集傳送資料之前,首先會通過內建的分散式演算法計算出該條資料的目標節點
Redis:
1、支援伺服器端構建分散式儲存Redis Cluster
六、終極大PK
1、效能上講,Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在儲存小資料時比Memcached效能更高。而在100k 以上的資料中,Memcached 效能要高於 Redis,雖然Redis最近也在儲存大資料的效能上進行優化,但是比起Memcached,還是稍有遜色
2、記憶體使用率上,使用簡單的key-value儲存的話,Memcached的記憶體利用率更高,而如果Redis採用hash結構來做key-value儲存,由於其組合式的壓縮,其記憶體利用率會高於Memcached
3、資料操作上,Redis相比Memcached來說,擁有更多的資料結構和並支援更豐富的資料操作,通常在Memcached裡,你需要將資料拿到客戶端來進行類似的修改再set回去。這大大增加了網路IO的次數和資料體積。在Redis中,這些複雜的操作通常和一般的GET/SET一樣高效。所以,如果需要快取能夠支援更復雜的結構和操作,那麼Redis會是不錯的選擇
4、相比於Memcached,Redis具備更多的功能,如資料持久化、事務、釋出/訂閱、Lua指令碼、內建伺服器端叢集模組