redismemcache和mongodb各自的優點是什么?
謝邀
redis、memcahce 比較相似,但與 mongodb 完全不同,幾乎沒有可比性。
總的來說 redis/memcache 是基于內存的,講究的是性能,多用作緩存層,比如說存放session。而 mongodb 是面向文檔的,存儲的是類似JSON的非結構化數據,查詢起來非常方便,開發效率高,比較類似傳統SQL關系型https://www.b5b6.com/shujuku/。
普遍認為redis性能明顯好于MemoryCache。所以這里主要比較 Redis 和 Mongodb。
體積
Redis是一個基于內存的鍵值https://www.b5b6.com/shujuku/,它由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每次改動都會寫入https://www.b5b6.com/shujuku/文件。
數據表
Redis沒有嚴格意義上的表,習慣上一般采用 schema:key 形式做為鍵值,其中
schema: 可理解為傳統https://www.b5b6.com/shujuku/中的表名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對象。
需要借助一系列的復雜操作才能進行數據查詢,這一點比較接近https://www.b5b6.com/shujuku/的底層。
比如我們有三條學生記錄,存放著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