Redis掐禁、Memcache和MongoDB的區(qū)別
Memcached
Memcached的優(yōu)點:
Memcached可以利用多核優(yōu)勢蔫敲,單實例吞吐量極高洋幻,可以達到幾十萬QPS(取決于key、value的字節(jié)大小以及服務(wù)器硬件性能泥兰,日常環(huán)境中QPS高峰大約在4-6w左右)。適用于最大程度扛量题禀。
支持直接配置為session handle鞋诗。
Memcached的局限性:
只支持簡單的key/value數(shù)據(jù)結(jié)構(gòu),不像Redis可以支持豐富的數(shù)據(jù)類型迈嘹。
無法進行持久化削彬,數(shù)據(jù)不能備份,只能用于緩存使用秀仲,且重啟后數(shù)據(jù)全部丟失融痛。
無法進行數(shù)據(jù)同步,不能將MC中的數(shù)據(jù)遷移到其他MC實例中神僵。
Memcached內(nèi)存分配采用Slab Allocation機制管理內(nèi)存雁刷,value大小分布差異較大時會造成內(nèi)存利用率降低,并引發(fā)低利用率時依然出現(xiàn)踢出等問題保礼。需要用戶注重value設(shè)計沛励。
Redis
Redis的優(yōu)點:
支持多種數(shù)據(jù)結(jié)構(gòu),如 string(字符串)炮障、 list(雙向鏈表)目派、dict(hash表)、set(集合)铝阐、zset(排序set)址貌、hyperloglog(基數(shù)估算)
支持持久化操作,可以進行aof及rdb數(shù)據(jù)持久化到磁盤徘键,從而進行數(shù)據(jù)備份或數(shù)據(jù)恢復(fù)等操作练对,較好的防止數(shù)據(jù)丟失的手段。
支持通過Replication進行數(shù)據(jù)復(fù)制吹害,通過master-slave機制螟凭,可以實時進行數(shù)據(jù)的同步復(fù)制,支持多級復(fù)制和增量復(fù)制它呀,master-slave機制是Redis進行HA的重要手段螺男。
單線程請求,所有命令串行執(zhí)行纵穿,并發(fā)情況下不需要考慮數(shù)據(jù)一致性問題下隧。
支持pub/sub消息訂閱機制,可以用來進行消息訂閱與通知谓媒。
支持簡單的事務(wù)需求淆院,但業(yè)界使用場景很少,并不成熟句惯。
Redis的局限性:
Redis只能使用單線程土辩,性能受限于CPU性能支救,故單實例CPU最高才可能達到5-6wQPS每秒(取決于數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)大小以及服務(wù)器硬件性能拷淘,日常環(huán)境中QPS高峰大約在1-2w左右)各墨。
支持簡單的事務(wù)需求,但業(yè)界使用場景很少启涯,并不成熟贬堵,既是優(yōu)點也是缺點。
Redis在string類型上會消耗較多內(nèi)存逝嚎,可以使用dict(hash表)壓縮存儲以降低內(nèi)存耗用扁瓢。
Mc和Redis都是Key-Value類型,不適合在不同數(shù)據(jù)集之間建立關(guān)系补君,也不適合進行查詢搜索引几。比如redis的keys pattern這種匹配操作,對redis的性能是災(zāi)難挽铁。
mongoDB
mongoDB 是一種文檔性的數(shù)據(jù)庫伟桅。先解釋一下文檔的數(shù)據(jù)庫,即可以存放xml叽掘、json楣铁、bson類型系那個的數(shù)據(jù)。
這些數(shù)據(jù)具備自述性(self-describing)更扁,呈現(xiàn)分層的樹狀數(shù)據(jù)結(jié)構(gòu)盖腕。redis可以用hash存放簡單關(guān)系型數(shù)據(jù)。
mongoDB 存放json格式數(shù)據(jù)浓镜。
適合場景:事件記錄溃列、內(nèi)容管理或者博客平臺,比如評論系統(tǒng)膛薛。
1.mongodb持久化原理
mongodb與mysql不同听隐,mysql的每一次更新操作都會直接寫入硬盤,但是mongo不會哄啄,做為內(nèi)存型數(shù)據(jù)庫雅任,數(shù)據(jù)操作會先寫入內(nèi)存,然后再會持久化到硬盤中去咨跌,那么mongo是如何持久化的呢
mongodb在啟動時沪么,專門初始化一個線程不斷循環(huán)(除非應(yīng)用crash掉),用于在一定時間周期內(nèi)來從defer隊列中獲取要持久化的數(shù)據(jù)并寫入到磁盤的journal(日志)和mongofile(數(shù)據(jù))處锌半,當(dāng)然因為它不是在用戶添加記錄時就寫到磁盤上禽车,所以按mongodb開發(fā)者說,它不會造成性能上的損耗,因為看過代碼發(fā)現(xiàn)哭当,當(dāng)進行CUD操作時,記錄(Record類型)都被放入到defer隊列中以供延時批量(groupcommit)提交寫入冗澈,但相信其中時間周期參數(shù)是個要認(rèn)真考量的參數(shù)钦勘,系統(tǒng)為90毫秒,如果該值更低的話亚亲,可能會造成頻繁磁盤操作彻采,過高又會造成系統(tǒng)宕機時數(shù)據(jù)丟失過。
2.什么是NoSQL數(shù)據(jù)庫捌归?NoSQL和RDBMS有什么區(qū)別肛响?在哪些情況下使用和不使用NoSQL數(shù)據(jù)庫?
NoSQL是非關(guān)系型數(shù)據(jù)庫惜索,NoSQL = Not Only SQL特笋。
關(guān)系型數(shù)據(jù)庫采用的結(jié)構(gòu)化的數(shù)據(jù),NoSQL采用的是鍵值對的方式存儲數(shù)據(jù)巾兆。
在處理非結(jié)構(gòu)化/半結(jié)構(gòu)化的大數(shù)據(jù)時猎物;在水平方向上進行擴展時;隨時應(yīng)對動態(tài)增加的數(shù)據(jù)項時可以優(yōu)先考慮使用NoSQL數(shù)據(jù)庫角塑。
在考慮數(shù)據(jù)庫的成熟度蔫磨;支持;分析和商業(yè)智能圃伶;管理及專業(yè)性等問題時堤如,應(yīng)優(yōu)先考慮關(guān)系型數(shù)據(jù)庫。
3.MySQL和MongoDB之間最基本的區(qū)別是什么窒朋?
關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫的區(qū)別搀罢,即數(shù)據(jù)存儲結(jié)構(gòu)的不同。
4.MongoDB的特點是什么炼邀?
(1)面向文檔(2)高性能(3)高可用(4)易擴展(5)豐富的查詢語言
5.MongoDB支持存儲過程嗎魄揉?如果支持的話,怎么用拭宁?
MongoDB支持存儲過程洛退,它是javascript寫的,保存在db.system.js表中杰标。
6.如何理解MongoDB中的GridFS機制兵怯,MongoDB為何使用GridFS來存儲文件?
GridFS是一種將大型文件存儲在MongoDB中的文件規(guī)范腔剂。使用GridFS可以將大文件分隔成多個小文檔存放媒区,這樣我們能夠有效的保存大文檔,而且解決了BSON對象有限制的問題。
7.為什么MongoDB的數(shù)據(jù)文件很大袜漩?
MongoDB采用的預(yù)分配空間的方式來防止文件碎片绪爸。
8.當(dāng)更新一個正在被遷移的塊(Chunk)上的文檔時會發(fā)生什么?
更新操作會立即發(fā)生在舊的塊(Chunk)上宙攻,然后更改才會在所有權(quán)轉(zhuǎn)移前復(fù)制到新的分片上奠货。
9.MongoDB在A:{B,C}上建立索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎座掘?
不會递惋,只會在A:{B,C}上使用索引。
10.如果一個分片(Shard)停止或很慢的時候溢陪,發(fā)起一個查詢會怎樣萍虽?
如果一個分片停止了,除非查詢設(shè)置了“Partial”選項形真,否則查詢會返回一個錯誤杉编。如果一個分片響應(yīng)很慢,MongoDB會等待它的響應(yīng)没酣。
Redis王财、Memcache和MongoDB的區(qū)別
從以下幾個維度,對redis裕便、memcache绒净、mongoDB 做了對比,
1偿衰、性能
都比較高挂疆,性能對我們來說應(yīng)該都不是瓶頸
總體來講,TPS方面redis和memcache差不多下翎,要大于mongodb
2缤言、操作的便利性
memcache數(shù)據(jù)結(jié)構(gòu)單一
redis豐富一些,數(shù)據(jù)操作方面视事,redis更好一些胆萧,較少的網(wǎng)絡(luò)IO次數(shù)
mongodb支持豐富的數(shù)據(jù)表達,索引俐东,最類似關(guān)系型數(shù)據(jù)庫跌穗,支持的查詢語言非常豐富
3、內(nèi)存空間的大小和數(shù)據(jù)量的大小
redis在2.0版本后增加了自己的VM特性虏辫,突破物理內(nèi)存的限制蚌吸;可以對key value設(shè)置過期時間(類似memcache)
memcache可以修改最大可用內(nèi)存,采用LRU算法
mongoDB適合大數(shù)據(jù)量的存儲,依賴操作系統(tǒng)VM做內(nèi)存管理砌庄,吃內(nèi)存也比較厲害羹唠,服務(wù)不要和別的服務(wù)在一起
4奕枢、可用性(單點問題)
對于單點問題,
redis佩微,依賴客戶端來實現(xiàn)分布式讀寫缝彬;主從復(fù)制時,每次從節(jié)點重新連接主節(jié)點都要依賴整個快照,無增量復(fù)制哺眯,因性能和效率問題跌造,
所以單點問題比較復(fù)雜;不支持自動sharding,需要依賴程序設(shè)定一致hash 機制族购。
一種替代方案是,不用redis本身的復(fù)制機制陵珍,采用自己做主動復(fù)制(多份存儲)寝杖,或者改成增量復(fù)制的方式(需要自己實現(xiàn)),一致性問題和性能的權(quán)衡
Memcache本身沒有數(shù)據(jù)冗余機制互纯,也沒必要瑟幕;對于故障預(yù)防,采用依賴成熟的hash或者環(huán)狀的算法留潦,解決單點故障引起的抖動問題只盹。
mongoDB支持master-slave,replicaset(內(nèi)部采用paxos選舉算法,自動故障恢復(fù)),auto sharding機制兔院,對客戶端屏蔽了故障轉(zhuǎn)移和切分機制殖卑。
5、可靠性(持久化)
對于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù)坊萝,
redis支持(快照孵稽、AOF):依賴快照進行持久化,aof增強了可靠性的同時十偶,對性能有所影響
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ù)量較小的更性能操作和運算上
memcache:用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能;做緩存厉亏,提高性能(適合讀多寫少董习,對于數(shù)據(jù)量比較大,可以采用sharding)
MongoDB:主要解決海量數(shù)據(jù)的訪問效率問題