Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb findAndModify vs redis incr_Mongodb_Redis_Findandmodify - Fatal编程技术网

Mongodb findAndModify vs redis incr

Mongodb findAndModify vs redis incr,mongodb,redis,findandmodify,Mongodb,Redis,Findandmodify,我想知道Mongodb FindModify与redis increment命令在速度方面有多好。我知道Mongodb findAndModify会对文档进行r/w锁定,但如果我有100个线程试图同时写入,我想知道redis是否是更可取的选项。有许多参数可以改变这种比较的结果 Mongodb将在数据库级别(而不是文档)执行r/w锁定。Redis是一个单线程服务器,将序列化所有内容。就并发的粒度而言,它基本上是等价的。不过,Redis实现更高效,因为使用Mongodb,最终会有数百个线程在同一个锁

我想知道Mongodb FindModify与redis increment命令在速度方面有多好。我知道Mongodb findAndModify会对文档进行r/w锁定,但如果我有100个线程试图同时写入,我想知道redis是否是更可取的选项。

有许多参数可以改变这种比较的结果

Mongodb将在数据库级别(而不是文档)执行r/w锁定。Redis是一个单线程服务器,将序列化所有内容。就并发的粒度而言,它基本上是等价的。不过,Redis实现更高效,因为使用Mongodb,最终会有数百个线程在同一个锁上竞争

您还需要考虑在协议级别上发生的事情:MangGDB协议是不对称的,因此您有可能在不检查最后一个操作是否成功的情况下推送数据(即没有强制ACK)。Redis协议纯粹是客户机/服务器协议,因此每个命令都返回客户机应用程序必须读取的结果。不过,您可以使用管道命令。在协议级别,Mongodb可以让您比Redis更快地推送数据(考虑到纯性能,无需任何命令确认)

它还取决于持久性选项:Mongodb日志化是可选的,Redis仅附加文件配置也是可选的。根据每个商店的配置方式,您将获得截然不同的结果。MongoDB或Redis集群中的主/从复制也会改变结果

这可能取决于其他环境因素,如用于编译MongoDB或Redis的编译器、内核版本等

这就是为什么您应该在自己的环境中运行自己的基准测试

运行快速而肮脏的基准测试是很容易的(但没有那么多代表性,所以结果必须谨慎对待)

对于Mongodb,来自mongo shell:

 > 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基准上)。

我没有使用Redis,但是……为什么不改为使用MongoDBs$inc命令呢?测试它(然后在某个地方写博客:))。这里有太多的方面需要考虑堆栈溢出。硬件、开发人员、管理、维护、要求/需求。感谢您的回复。。。我想知道是否有人已经做了。。。我会试试看:)