一、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。