1. 程式人生 > >Memcached和Redis比較

Memcached和Redis比較

計數 select work key-value 網絡io io操作 htm 系統設計 chunk

一、存儲

Memcached基本只支持簡單的key-value存儲方式。
Redis除key-value之外,還支持list,set,sorted set,hash等數據結構;
Redis支持數據的備份,即master-slave模式的數據備份;
Redis支持數據的持久化(快照、AOF),可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用;
Redis可以實現主從復制,實現故障恢復;
Redis的Sharding技術,很容易將數據分布到多個Redis實例中。

二、數據一致性

Memcached的cas命令在並發場景下,保證數據的一致性。
Redis事務支持比較弱,只能保證事務中的每個操作連續執行。

三、內存管理

  Memcached使用預分配的內存池的方式。使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除。
  Redis使用現場申請內存的方式來存儲數據。並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,並把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

四、網絡IO模型

  Memcached是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程。監聽線程監聽網絡連接,接受請求後,將連接描述字pipe傳遞給worker線程,進行讀寫IO,網絡層使用libevent封裝的事件庫。多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變量加鎖,進行計數等工作,帶來了性能損耗。
  Redis是單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select。對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴 重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

五、性能

二者的性能都很高。由於Redis只使用單核,而Memcached可以使用多核,所以在比較上,平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起Memcached,還是稍有遜色。無論你使用哪一個,每秒處理請求的次數都不會成為瓶頸。


查看更多:

開發一個微信小程序實例教程

HTTP協議整理

PHP安全之Web攻擊

秒殺系統設計優化

MySQL優化

Linux下常見的IO模型

Memcached和Redis比較