2013-07-10 130 views
2

我想知道在速度方面Mongodb findAndmodify vs redis increment命令有多好。我知道Mongodb findAndModify會對文檔做一個r/w鎖定,但是如果我有100個線程試圖同時寫入,那麼是否想知道redis是一個更可取的選項。Mongodb findAndModify vs redis incr

+1

我沒有集結使用redis,但是......爲什麼不使用MongoDBs $ inc命令呢? – Sammaye

+1

測試它(然後在某個地方博客:))。這裏需要考慮StackOverflow的方面太多。硬件,開發人員,管理,維護,需求/需求。 – WiredPrairie

+0

感謝您的回覆...想知道是否有人已經做到了...我會試一試:) –

回答

2

有許多參數可以改變這種比較的結果。

Mongodb將在數據庫級別(而不是文檔)執行r/w鎖定。 Redis是一個單線程服務器,並將序列化所有內容。就併發性的粒度而言,它將大部分是等同的。儘管Redis實現更高效,因爲在Mongodb中,最終會有數百個線程在同一個鎖上競爭。

您還需要考慮在協議級別發生了什麼:Mongodb協議是不對稱的,因此您可以在不檢查最後一次操作是否成功(即沒有強制確認)的情況下推送數據。 Redis協議純粹是客戶端/服務器,因此每個命令都會返回客戶端應用程序必須讀取的結果。你可以通過管道命令。在協議級別,Mongodb可以允許您比Redis更快地推送數據(考慮純粹的性能,不需要任何命令確認)。

它也取決於持久性選項:Mongodb日記是可選的,所以Redis附加文件配置也是如此。根據每個商店的配置情況,您將會得到完全不同的結果。 MongoDB或Redis集羣中的主/從複製也會改變結果...

它可能取決於其他環境因素,例如用於編譯MongoDB或Redis的編譯器,內核版本等...

這就是爲什麼你應該在自己的環境中運行自己的基準。

運行快速和骯髒的基準很容易(但沒有太多的代表性,所以結果必須採取一粒鹽)。

隨着MongoDB中,從蒙戈外殼:

> db.toto.save({_id:1, val:0 }) 
> ops = [ { op: "update", ns:db.toto, query:{_id:1}, update:{ $inc : { val:1 } } } ] ; 
> res = benchRun({ parallel: number_of_connections, seconds: 20, ops:ops, host:"localhost:7380" }); 

隨着Redis的:

$ redis-benchmark -q -n 100000 -t incr -c number_of_connections -P pipelining_factor 

這裏是我剛剛收集了我的箱子一些數字:

MongoDB 1 connection     64613 updates/s 
MongoDB 50 connections     53825 updates/s 
Redis  1 connection no pipelining 29437 updates/s 
Redis 50 connections no pipelining 101626 updates/s 
Redis 50 connections pipelining=50 442477 updates/s 

我們可以由於不對稱協議,看到MongoDB對於一個連接是非常有效的,但是這種效率隨着由於r/w鎖定導致的連接數量。 Redis沒有流水線和一個連接,因其客戶端/服務器協議嚴重減慢。但是,如果工作負載分散在更多連接上,或者使用流水線操作,等待確認的成本將攤銷,並且Redis可以獲得比MongoDB更高的吞吐量(在此特定的0.02美元基準上)。