1. 程式人生 > >redis、memcached、mongoDB 對比

redis、memcached、mongoDB 對比

頁面 處理 還得 進行 修改 相對 有序 適合 tcp

Mongodb和Memcached不是一個範疇內的東西。Mongodb是文檔型的非關系型數據庫,其優勢在於查詢功能比較強大,能存儲海量數據。Mongodb 和 Memcached不存在誰替換誰的問題。

Memcached 和 Redis它們都是內存型數據庫,數據保存在內存中,通過tcp直接存取,優勢是速度快,並發高。

Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。

Memcached 的分布式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點,Memcached 的分布式是基於客戶端的Key的hash來做均衡,是個偽分布式的系統。

Redis是一個key-value存儲系統。和 Memcached 類似,它支持存儲的value類型相對更多,包括string(字符串)、 list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支持各種不同方式的排序。與 Memcached 一樣,為了保證效率,數據都是緩存在內存中。區別的是Redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件。


技術分享圖片





1、性能

總體來講,TPS 方面 Redis 和 Memcache 差不多,要大於 Mongodb。
Redis 支持高並發量,官方宣傳支持10萬級別的並發讀寫。

2、操作的便利性

Memcached 數據結構單一(key-value)。
Redis 支持的數據類型更多,數據操作方面,Redis 更好一些,也可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積,同時還提供String、Hash、List、Set和Sorted Set等數據結構的存儲。
Mongodb 支持豐富的數據表達,索引,最類似關系型數據庫,支持的查詢語言非常豐富。

3、內存空間的大小和數據量的大小

Redis 在 2.0 版本後增加了自己的 VM 特性,突破物理內存的限制,可以限定內存使用大小,當數據超過閾值,則通過類似LRU的算法把內存中的最不常用數據保存到硬盤的頁面文件中;可以對 key value 設置過期時間(類似 Memcached);Redis一個value最大支持512MB。
Memcached 可以修改最大可用內存,采用 LRU 算法;Memcached單個key-value大小有限,一個value最大只支持1MB。
MongoDB 適合大數據量的存儲,依賴操作系統 VM 做內存管理,吃內存也比較厲害,服務不要和別的服務在一起。

4、可靠性(持久化)

Redis 具有持久化機制,可以定期將內存中的數據持久化到硬盤上,Redis 支持(快照、AOF),依賴快照進行持久化,aof 增強了可靠性的同時,對性能有所影響。
Memcached 不支持數據持久化,斷電或重啟後數據消失,通常用在做緩存,提升性能。
MongoDB 從 1.8 版本開始采用 binlog 方式支持持久化的可靠性。

6、數據一致性(事務支持)

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

7、數據分析

MongoDB 內置了數據分析的功能(mapreduce),其他不支持。

8、應用場景

Redis:適用於對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統;數據量較小的更性能操作和運算,Redis 只使用單核,而 Memcached 可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。
Memcached:用於在動態系統中減少數據庫負載,提升性能;做緩存,提高性能(適合讀多寫少,對於數據量比較大,可以采用 sharding)。
MongoDB:主要解決海量數據的訪問效率問題。


總結:

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

? 在內存使用效率上,如果使用簡單的key-value存儲,Memcached的內存利用率更高。而如果Redis采用hash結構來做key-value存儲,由於其組合式的壓縮,其內存利用率會高於Memcached。當然,這和你的應用場景和數據特性有關。

? 如果你對數據持久化和數據同步有所要求,那麽推薦你選擇Redis。因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統後緩存數據不會丟失,選擇Redis也是明智的。

? 當然,最後還得說到你的具體應用需求。Redis相比Memcached來說,擁有更多的數據結構,並支持更豐富的數據操作。通常在Memcached裏,你需要將數據拿到客戶端來進行類似的修改再set回去。這大大增加了網絡IO的次數和數據體積。在Redis中,這些復雜的操作通常和一般的GET/SET一樣高效。所以,如果你需要緩存能夠支持更復雜的結構和操作,那麽Redis會是不錯的選擇。

redis、memcached、mongoDB 對比