redis、memcache和mongodb各自的優點是什麼,怎麼選擇呢?


謝邀

redis、memcahce 比較相似,但與 mongodb 完全不同,幾乎沒有可比性。

總的來說 redis/memcache 是基於內存的,講究的是性能,多用作緩存層,比如說存放session。而 mongodb 是面向文檔的,存儲的是類似JSON的非結構化數據,查詢起來非常方便,開發效率高,比較類似傳統SQL關係型資料庫。

普遍認為redis性能明顯好於MemoryCache。所以這裡主要比較 Redis 和 Mongodb。

體積

Redis是一個基於內存的鍵值資料庫,它由C語言實現的,以單線程非同步的方式工作,與Nginx/ NodeJS工作原理近似。所以文件非常小。編繹出來的主文件還不到 2Mb,在 Linux 伺服器上初始只需要佔用1Mb左右的內存。

Mongodb安裝包則要大的多,跟mySQL差不多,都是百兆級的。

持久化

Redis是先讀寫內存再非同步同步到磁碟,但持久化數據是需要時間的,如果每條記錄都觸發持久化,則性能優勢則體現不出來,這裡可能會產生一個問題,就是在數據改動不夠多時,數據還沒有持久化就重啟了系統,這部分數據是有可能丟失的。

這裡可以在設置文件中設置與入規則:

save 900 1
save 300 10
save 60 10000

以上規則表明,如果在1秒內發生900次數據發動,則開始寫入到硬碟。如果10秒發生300次發動,則就持久化。

當你也可以設置成 save 1 1 每次發動都保存到硬碟,但是性能會下降。

MongoDB則不存在內存數據有可能丟失的問題,因為MongoDB每次改動都會寫入資料庫文件。

數據表

Redis沒有嚴格意義上的表,習慣上一般採用 schema:key 形式做為鍵值,其中

schema: 可理解為傳統資料庫中的表名
key: 可理解為表中的主鍵

比如將 user:1 中的name設置為kris

HSET user:1 name kris


Mongodb則可將collection當作表

var col = db.collection("createIndexExample1");
col.find({}).toArray(function(err, items) {

});

數據寫入

Redis 可以通過 hash set數據類型支持,JSON對象的寫入,不過是二維的,有深層次JSON對象時,需要先序列化成string [JS代碼]

client.hmset(user:1, { username: "lee", age: "21" }, function(err) {
console.log(err)
})

實際上執行的則是

hmset user:1 user_name lee age 21

MongoDB支持複雜結構JSON文件的寫入 [JS代碼]

var col = db.collection("createIndexExample1");
col.insert([{a:1, node: {b:1}}], {w:1}, function(err, result) {
}
});

數據查詢

MongoDB支持對JSON對象的任何層次和數據進行查詢,使用起來非常方便:[JS代碼]

col.find({ a:1 }).toArray(function(err, items)

});

Redis 出於性能考慮,不能按照 hash object的值來搜索hash對象。

需要藉助一系列的複雜操作才能進行數據查詢,這一點比較接近資料庫的底層。

比如我們有三條學生記錄,存放著ID,名字和姓名 [redis 指令]

# 添加 3 個用戶和信息

hmset user:1 user_name lee age 21
hmset user:2 user_name david age 25
hmset user:3 user_name chris age 25

如果想要按name和age查詢,則要創建相關的數據集合(set)來作為索引

# 維護age索引
sadd age:21 1
sadd age:25 2 3
# 維護name索引
sadd name:lee 1
sadd name:david 2
sadd name:chris 3

然後,求數據集交集(sinter),實現多條件查詢,比如我們要名字是lee,年齡是25歲的學生,會返回用戶ID

sinter age:25 name:lee


搬運自己的答案,mongodb不應和redis/memcache比較,因為兩者的適用場景是完全不同的。

mongodb是一款介於內存資料庫和關係資料庫的資料庫,是高性能、無模式的文檔型資料庫。

mongodb數據存儲在磁碟,只有在需要時通過mmap映射到內存,在內存中修改,修改完畢由操作系統負責flush到磁碟。

優點:支持複雜的數據結構,能存儲海量的數據,能提供類似關係資料庫般強大的查詢。

redis是一個開源的key-value存儲系統,所有數據都是放在內存中的,持久化是使用RDB方式或者aof方式。僅支持key、string、hash、list、set幾種結構,優點:讀寫速度非常快。缺點:受內存限制無法存儲過多的數據,也無法提供強大的查詢,只使用單核。

memcache是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。memcache僅支持簡單的key-value結構,但使用多核。

在爬蟲中,經常採用redis+mongodb的方式,Mongodb用於存儲爬取的海量的數據,而redis則用於去重和保存待爬取的url。


memcache可做代理伺服器,redis是把瑞士軍刀,mongodb是最常用的nosql, 且支持sql語法。三者間在部分場景兩兩重疊。但是缺乏全面的可比性。就好比饅頭,蛋糕和餛飩。


推薦閱讀:

TAG:Redis | MongoDB | Memcached | 資料庫 |