Redis、Memcache、MongoDb的優缺點
Redis優點
支援多種資料結構,如 string(字元串)、 list(雙向連結清單)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算)
支援持久化操作,可以進行aof及rdb資料持久化到磁盤,進而進行資料備份或資料恢複等操作,較好的防止資料丢失的手段。
支援通過Replication進行資料複制,通過master-slave機制,可以實時進行資料的同步複制,支援多級複制和增量複制,master-slave機制是Redis進行HA的重要手段。
單線程請求,所有指令串行執行,并發情況下不需要考慮資料一緻性問題。
支援pub/sub消息訂閱機制,可以用來進行消息訂閱與通知。
支援簡單的事務需求,但業界使用場景很少,并不成熟。
Redis缺點
Redis隻能使用單線程,性能受限于CPU性能,故單執行個體CPU最高才可能達到5-6wQPS每秒(取決于資料結構,資料大小以及伺服器硬體性能,日常環境中QPS高峰大約在1-2w左右)。
支援簡單的事務需求,但業界使用場景很少,并不成熟,既是優點也是缺點。
Redis在string類型上會消耗較多記憶體,可以使用dict(hash表)壓縮存儲以降低記憶體耗用。
Memcache優點
Memcached可以利用多核優勢,單執行個體吞吐量極高,可以達到幾十萬QPS(取決于key、value的位元組大小以及伺服器硬體性能,日常環境中QPS高峰大約在4-6w左右)。适用于最大程度扛量。支援直接配置為session handle。
Memcache缺點
隻支援簡單的key/value資料結構,不像Redis可以支援豐富的資料類型。
無法進行持久化,資料不能備份,隻能用于緩存使用,且重新開機後資料全部丢失。
無法進行資料同步,不能将MC中的資料遷移到其他MC執行個體中。
Memcached記憶體配置設定采用Slab Allocation機制管理記憶體,value大小分布差異較大時會造成記憶體使用率降低,并引發低使用率時依然出現踢出等問題。需要使用者注重value設計。
MongoDB優點
更高的寫負載,MongoDB擁有更高的插入速度。
處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。
高可用性,設定M-S不僅友善而且很快,MongoDB還可以快速、安全及自動化的實作節點(資料中心)故障轉移。
快速的查詢,MongoDB支援二維空間索引,比如管道,是以可以快速及精确的從指定位置擷取資料。MongoDB在啟動後會将資料庫中的資料以檔案映射的方式加載到記憶體中。如果記憶體資源相當豐富的話,這将極大地提高資料庫的查詢速度。
非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載進而導緻性能下降,由于MongoDB的弱資料結構模式,添加1個新字段不會對舊表格有任何影響,整個過程會非常快速。
MongoDB缺點
不支援事務。MongoDB占用空間過大 。
MongoDB沒有成熟的維護工具。
Redis、Memcache、MongoDB的差別
性能
三者的性能都比較高,總的來講:Memcache和Redis差不多,要高于MongoDB。
便利性
memcache資料結構單一。
redis豐富一些,資料操作方面,redis更好一些,較少的網絡IO次數。
mongodb支援豐富的資料表達,索引,最類似關系型資料庫,支援的查詢語言非常豐富。
存儲空間
redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;
可以對key value設定過期時間(類似memcache)。
memcache可以修改最大可用記憶體,采用LRU算法。
mongoDB适合大資料量的存儲,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和别的服務在一起。
可用性
redis,依賴用戶端來實作分布式讀寫;主從複制時,每次從節點重新連接配接主節點都要依賴整個快照,無增量複制,因性能和效率問題,是以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一緻hash 機制。一種替代方案是,不用redis本身的複制機制,采用自己做主動複制(多份存儲),或者改成增量複制的方式(需要自己實作),一緻性問題和性能的權衡。
Memcache本身沒有資料備援機制,也沒必要;對于故障預防,采用依賴成熟的hash或者環狀的算法,解決單點故障引起的抖動問題。
mongoDB支援master-slave,replicaset(内部采用paxos選舉算法,自動故障恢複),auto sharding機制,對用戶端屏蔽了故障轉移和切分機制。
可靠性
redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響。
memcache不支援,通常用在做緩存,提升性能。
MongoDB從1.8版本開始采用binlog方式支援持久化的可靠性。
一緻性
Memcache 在并發場景下,用cas保證一緻性。
redis事務支援比較弱,隻能保證事務中的每個操作連續執行。
mongoDB不支援事務。
資料分析
mongoDB内置了資料分析的功能(mapreduce),其他兩者不支援。
應用場景
redis:資料量較小的更性能操作和運算上。
memcache:用于在動态系統中減少資料庫負載,提升性能;做緩存,提高性能(适合讀多寫少,對于資料量比較大,可以采用sharding)。
MongoDB:主要解決海量資料的通路效率問題。