Memcache與Redis比較

下文中,memcached簡稱M,redis簡稱R。 redis

定位

M最初的定位是內存緩存的擴展,能夠合理分配使用多臺服務器的未使用內存。 後端

R的定位是結構數據存儲服務器,在內存中存儲數據是增長性能的一種方式,因此它支持數據持久化以及不活躍數據落到磁盤。
R同時支持Pub/Sub模式的消息隊列服務 數組

數據類型支持

M使用key-value的方式存儲數據,對於集合類型沒有很好的支持。 緩存

R支持strings、hashes、lists、sets、sorted sets,能夠更方便的適應業務場景,可是集合類型會帶來額外的性能開銷。 服務器

數據存儲

M是全內存的方式存儲數據。 網絡

R是內存優先,其中key是所有存放在內存中的,value部分存儲在內存中,部分存儲在磁盤中(非活躍數據)。R有兩種方式將數據存儲到磁盤,一種是之內存快照的方式存儲(adb.c),一種是以順序命令的方式(aof.c)。 多線程

內存管理

M使用固定長度的方式分配內存。首先選擇合適大小的Slab Class(不一樣的固定大小,根據數據的大小選擇),而後將數據存儲到Slab Class下的Chunk(固定大小)中。Chunk使用空閒列表的方式管理。 併發

R將每一個數據塊的大小存儲在數據塊的頭部,經過一個數組(zmalloc_allocations)來管理數據塊,參見zmalloc.c。
R推薦使用hashes,它有更好的存儲和檢索效率。相對於M來講,R的方式可能會產生少許的內存碎片,同時R會存在數據從內存swap到磁盤的狀況。 分佈式

集羣

M自己並不支持集羣,通常是用一致性hash的方式將不一樣區段的數據存儲在不一樣的服務器上面,所以存在單點故障和集羣容量伸縮的問題。
M集羣的問題能夠經過緩存代理服務器規避,後端的M各自獨立,代理服務器負責之間的數據同步及可用性檢測。 memcached

R的cluster支持分佈式存儲的方式,同時支持Master-Slave應對單獨故障。R的節點之間經過命令記錄的方式執行同步。

數據一致性

M使用cas命令保證數據一致性。

R使用事務(Pipelining、Scripting方式)保證一組操做的原子性。

IO

M使用多線程模型,非阻塞IO複用(使用epoll或者kqueue,也能夠用poll or select可是不推薦),網絡IO處理使用了libevent。多線程能夠發揮多核的優點,可是會帶來併發讀寫的問題,M使用了鎖來處理緩存一致性的問題,這會帶來額外的性能開銷。

R使用單線程模型,非阻塞IO複用,使用了一個簡單事件驅動庫ae(ae.c),支持epoll、kqueue和select。單線程方式有更好的性能,可是聚合計算等操做會形成阻塞。數據的持久化使用了額外的線程。

性能

  • M在數據長度比較大時性能優於R(多線程IO)
  • R在數據超出內存大小且冷熱不明顯時,性能很是差(swap優化不到位或者R不太關注swap,特別是執行數據壓縮時,cpu消耗很大)
  • 對於集合類型的操做,R明顯是比M好的(天生支持hashes、lists、sets、sorted sets,減小網絡開銷)

總結

M更適合分佈式緩存,若是你不care緩存穿透和緩存丟失。 R更適合數據存儲,同時它的內存存儲方式能夠大大提升操做效率,問題在於它對於事務支持的缺乏。可是R並不適合單純的存儲系統,這方面Mongodb會是更好的選擇。

相關文章
相關標籤/搜索