腳踏兩隻船的困惑--Memcached和Redis

一、Memcached與Redis的區別

Memcached:一款完全開源、高性能、分佈式的內存系統

Redis:一個開源的,Key-Value型、基於內存運行並支持持久化的NoSQL數據庫。

從概念上來看,Memcached和Redis並非是一對“孿生兄弟”,能將二者聯繫起來的紐帶就是內存。從誕生之初起,二者的目標就有差異。Memcached追求高性能的內存服務,而Redis不僅支持內存服務,而且支持數據持久化操作。

對比參數 Redis Memcached
類型

支持內存

key-value鍵值對存儲

非關係型數據庫

支持內存

key-value鍵值對存儲

緩存系統

數據存儲類型

String

Set

Zset

List

Hash

String
查詢操作類型

批量操作

事務支持(雖然是假的事務)

每個類型不同的CRUD

CRUD

少量的其他命令

附加功能

發佈/訂閱模式

主從分區

序列號支持

多線程服務支持
網絡IO模型 單進程模式 多線程、非阻塞IO模式
事件庫 自封裝簡易事件庫AeEvent LibEvent事件庫
持久化操作

RDB

AOF

不支持

二、網絡IO之間的對比

Memcached是多線程,非阻塞IO複用的網絡模型。分爲監聽主線程和worker子線程。監聽線程監聽網絡連接,接收請求後,由worker線程進行讀寫。多線程可以發揮多核作用。

Redis是單線程的IO複用模型。對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大。但是Redis也提供了一些簡單的計算功能,比如排序、集合等。對於單線程模型會嚴重影響吞吐量,因爲在CPU計算時整個IO調度都是被阻塞的。

在高併發環境下,多線程非阻塞式的IO的Memcached表現會更加優異。

三、內存管理機制

  • Redis內存空間的利用比Memcached更加精緻。Memcached使用預分配的內存池,類似一個盒子,需要時分配一個盒子或幾個盒子。但是盒子內部可能裝不滿,存在內存空間的浪費。Redis需要使用內存時才進行分配。內存利用更加高效。
  • Memcached沒有內存碎片問題,Redis存在內存碎片問題。
  • Redis並不是將所有數據都放在內存中,只是將所有key都放在內存中,在讀取的時候又一定機率進行IO操作。採用“時間換空間”的思想。

四、數據一致性保障

Redis提供了“事務”概念,但這是假的事務。Redis是單線程操作,而Redis的事務僅是讓一組操作按順序執行,在執行過程中不會插入其他操作。但是這種方式可能造成阻塞。Memcached採用了CAS機制,會快速的返回操作成功或操作失敗。在這一點上,Memcached比Redis更快。

五、集羣形式

Memcached本身並不支持集羣,Memcached的集羣是通過客戶端來實現的,這就是Memcached的兩段hash。

å¾çæè¿°

應用程序首先調用Memcached客戶端,由Memcached通過Hash算法查找Memcached節點。找打節點後再進行一次hash操作。

Redis本身是支持集羣的,各節點之間可以相互通信。

六、總結

以往使用Redis的String類型做的事,都可以用Memcached代替,以此換取更好的性能提升。除此之外,優先考慮Redis。

轉載自:https://www.imooc.com/article/23549

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章