-
1 # 劉凱78213346109
-
2 # IT老友
搬運自己的答案,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。
-
3 # IT程式設計師碼農技術文摘
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 1save 300 10save 60 10000以上規則表明,如果在1秒內發生900次資料發動,則開始寫入到硬碟。如果10秒發生300次發動,則就持久化。
當你也可以設定成 save 1 1 每次發動都儲存到硬碟,但是效能會下降。
MongoDB則不存在記憶體資料有可能丟失的問題,因為MongoDB每次改動都會寫入資料庫檔案。
資料表
Redis沒有嚴格意義上的表,習慣上一般採用 schema:key 形式做為鍵值,其中
schema: 可理解為傳統資料庫中的表名key: 可理解為表中的主鍵
比如將 user:1 中的name設定為kris
HSET user:1 name krisMongodb則可將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 21MongoDB支援複雜結構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 21hmset user:2 user_name david age 25hmset user:3 user_name chris age 25如果想要按name和age查詢,則要建立相關的資料集合(set)來作為索引
# 維護age索引sadd age:21 1sadd age:25 2 3# 維護name索引sadd name:lee 1sadd name:david 2sadd name:chris 3然後,求資料集交集(sinter),實現多條件查詢,比如我們要名字是lee,年齡是25歲的學生,會返回使用者ID
sinter age:25 name:lee
回覆列表
memcache可做代理伺服器,redis是把瑞士軍刀,mongodb是最常用的nosql, 且支援sql語法。三者間在部分場景兩兩重疊。但是缺乏全面的可比性。就好比饅頭,蛋糕和餛飩。