關(guān)于redis、memcache、mongoDB
1.性能
都比較高,性能對我們來說應(yīng)該都不是瓶頸。
總體來說,TPS方面redis和memcache差不多,要大于mongoDB。
2.操作的便利性
memcache的數(shù)據(jù)結(jié)構(gòu)單一。(key-value)
redis豐富一些,數(shù)據(jù)操作方面,redis更好一些,較少的網(wǎng)絡(luò)IO次數(shù),同時還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
mongodb支持豐富的數(shù)據(jù)表達(dá),索引,最類似關(guān)系型數(shù)據(jù)庫,支持的查詢語言非常豐富。
3.內(nèi)存空間的大小和數(shù)據(jù)量的大小
redis在2.0版本后增加了自己的VM特性,突破物理內(nèi)存的限制;可以對key value設(shè)置過期時間(類似memcache)
memcahce可以修改最大可用內(nèi)存,采用LRU算法。memcahce代理軟件magent,比如建立10臺4G的memcache集群,就相當(dāng)于有了40G。magent -s 10.1.2.1 -s 10.1.2.2:11211 -b
10.1.2.3:14000
mongoDB 適合大數(shù)據(jù)量的存儲,依賴操作系統(tǒng)VM做內(nèi)存管理,吃內(nèi)存也比較厲害。服務(wù)不要和別的服務(wù)在一起。
4.可用性(單點問題)
redis,依賴客戶端來實現(xiàn)分布式讀寫;主從復(fù)制時,每次從節(jié)點重新連接主節(jié)點都要依賴整個快照,無增量復(fù)制,因性能和效率問題,所以單點問題比較復(fù)雜;不支持自動sharding,需要依賴程序設(shè)定一致hash機(jī)制。一種替代方案是,不用redis本身的復(fù)制機(jī)制,采用自己做主動復(fù)制(多份存儲),或者改成增量復(fù)制的方式(需要自己實現(xiàn)),一致性問題和性能的權(quán)衡。
memcache本身沒有數(shù)據(jù)冗余機(jī)制,也沒必要;對應(yīng)故障預(yù)防,采用依賴成熟的hash或者環(huán)狀的算法,解決單點故障引起的抖動問題。
mongodb支持master-slave,replicaset(內(nèi)部采用選舉算法,自動故障恢復(fù)),auto sharding機(jī)制,對客戶端屏蔽了故障轉(zhuǎn)移和切分機(jī)制。
5.可靠性(持久化)
對于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù)
redis支持(快照、AOF):依賴快照進(jìn)行持久化,aof增強(qiáng)了可靠性的同時,對性能有所影響;
memcache不支持,通常用在做緩存,提升性能;
mongodb從1.8版本開始采用binlog方式支持持久化的可靠性;
6.數(shù)據(jù)一致性(事務(wù)支持)
memcache在并發(fā)場景下,用cas保證一致性;
redis事務(wù)支持比較弱,只能保證事務(wù)中每個操作連續(xù)執(zhí)行;
mongodb不支持事務(wù);
7.數(shù)據(jù)分析
mongodb內(nèi)置了數(shù)據(jù)分析的功能(mapreduce),其他不支持
8.應(yīng)用場景
redis:數(shù)據(jù)量較小的更性能操作和運(yùn)算上
memcache:用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能;做緩存,提高性能(適合讀多寫小,對于數(shù)據(jù)量比較大,可以用sharding)
mongodb:主要解決海量數(shù)據(jù)的訪問效率問題。
對比參數(shù) | memcache | redis | mongodb |
---|---|---|---|
數(shù)據(jù)庫類型 | 純粹的key-value數(shù)據(jù)庫,數(shù)據(jù)結(jié)構(gòu)單一 | 結(jié)構(gòu)化數(shù)據(jù)庫 | 對象數(shù)據(jù)庫 |
支持?jǐn)?shù)據(jù)類型 | string | string,list,sort,sorted,hash 豐富的數(shù)據(jù)表達(dá) | 索引,類似于關(guān)系型數(shù)據(jù)庫 |
可用性 | 沒有數(shù)據(jù)冗余機(jī)制,使用一致性hash增加可用性 | 支持ms,mss結(jié)構(gòu),slave重連主節(jié)點會導(dǎo)致一次全量同步產(chǎn)生,影響性能和效率。可以實現(xiàn)讀寫分離,slave重連使用全量數(shù)據(jù),性能和效率會有問題,不支持自動sharding,需要程序上實現(xiàn)一致性hash | 支持ms,支持replication set,set可以自動故障轉(zhuǎn)換,支持autosharding |
持久化支持 | 數(shù)據(jù)完全放在內(nèi)存中,沒有持久化支持 | 支持持久化,快照持久化和aof持久化 | 1.8版本開始采用binlog方式支持持久化的可靠性 |
內(nèi)存空間優(yōu)化 | 最大內(nèi)存限制,LRU算法淘汰(可選) | 獨立的vm機(jī)制,最大內(nèi)存限制,數(shù)據(jù)ttl過期設(shè)置,內(nèi)存淘汰(可選) | 依賴于操作系統(tǒng)的vm管理機(jī)制,使用內(nèi)存映射文件,把剩余內(nèi)存作為緩存使用,沒有最大內(nèi)存限制,數(shù)據(jù)存在文件系統(tǒng)上和內(nèi)存 |
是否多線程 | 是,可以通過-t控制進(jìn)線程數(shù) | 單線程 | 多線程 |
性能 | 15W/s的GET,11W/s的SET | 單個實例qps:8.5W左右(GET/SET)(RH2285) | 單個qps:3.5W左右(GET/SET)(RH2285) |
事務(wù)支持 | 并發(fā)場景下,用cas保證一致性 | 事務(wù)支持比較弱,保證每個事務(wù)操作連續(xù)執(zhí)行,如果一個操作失敗,不會回滾。使用樂觀鎖實現(xiàn)cas。 | 不支持事務(wù) |
數(shù)據(jù)分析 | 簡單的get查詢功能 | 簡單查詢功能,支持對集合和hash的操作等 | 查詢方便,有類似于sql的語法,支持條件查詢 |
應(yīng)用場景 | 常作為前端緩存 | 緩存和數(shù)據(jù)存儲,隊列 | 大數(shù)據(jù)量存儲 |
特點 | - | 支持使用pipeline減少查詢次數(shù) | auto sharding,故障自動切換,mapreduce支持,大文件下的GridFs文件系統(tǒng) |
安全問題 | 目前沒有身份驗證 | 支持密碼驗證(requirepass) | 支持collection級別的身份驗證(auth) |
數(shù)據(jù)備份和還原 | 數(shù)據(jù)存放于內(nèi)存中,不方便備份和還原(stats cachedump) | 可以使用持久化做備份和還原 | mongodump倍份,mogorestore還原。數(shù)據(jù)導(dǎo)出:mongoexport,mongoimport,導(dǎo)出數(shù)據(jù)支持csv格式 |
slowlog相關(guān) | 沒有slowlog相關(guān)的設(shè)置 | 支持slowlog,slowlog存在于數(shù)據(jù)庫中,使用slowlog get獲取相關(guān)日志,slowlog的大小有限制,超過后會刪除舊的 | 支持slowlog(profiling),slowlog存在于system.profile(capped collection)的collection中 |
狀態(tài)查看 | stats | info | mongostat,db.serverStatus(),db.stats(),rs.statsu()等 |
tunning | 1.object size不要太大(默認(rèn)只支持1M)2.object 的expires設(shè)置(緩存應(yīng)該具有超時的特點)3.適合數(shù)據(jù)處理后的緩存,不適合緩存后的處理輸出 | 1.開啟vm,將不常用的value值給交換到磁盤上 2.盡量將數(shù)據(jù)存放在內(nèi)存中 3.前端使用proxy或persistence hash來實現(xiàn)均衡訪問 4.使用master-slave結(jié)構(gòu),做讀寫分離 5.大數(shù)據(jù)量時持久化數(shù)據(jù)dump時影響服務(wù),應(yīng)該放在slave端做6.使用pipeline聚合訪問7.網(wǎng)卡bonding | 1.索引相關(guān)(讀多寫少時) 2.explain解析查詢 3.限定返回條目(limit) 4.只查看指定需要字段,不查詢所有字段 5.使用capped collection (特殊業(yè)務(wù))6.使用replsets,擴(kuò)展整體集群能力 |
- 類型——memcacheheredis都是將數(shù)據(jù)存放在內(nèi)存,所以是內(nèi)存數(shù)據(jù)庫。當(dāng)然,memcache也可用于緩存其他東西,例如圖片等等。
- 數(shù)據(jù)類型——Memcache 在添加數(shù)據(jù)時就要指定數(shù)據(jù)的字節(jié)長度,而 redis 不需要。
- 虛擬內(nèi)存——當(dāng)物理內(nèi)存用完時,可以將一些很久沒用到的 value 交換到磁盤。
- 過期策略——memcache 在 set 時就指定,例如 set key1 0 0 8,即永不過期。Redis 可以通過例如 expire 設(shè)定,例如 expire name 10。
- 分布式——設(shè)定 memcache 集群,利用 magent 做一主從;redis可以做一主多從。都可以一主一從。
- 存儲數(shù)據(jù)安全——memcache 斷電就斷了,數(shù)據(jù)沒了;redis 可以定期 save 到磁盤。
- 災(zāi)難恢復(fù)——memcache 同上,redis 丟了后可以通過 aof 恢復(fù)。