我想知道Mongodb findAndmodify和redis增量命令在速度方面有多好。我知道Mongodb findAndModify会对文档进行读写锁定,但是如果我有100个线程同时尝试写,我想知道redis是不是更好的选择。
发布于 2013-07-12 02:22:19
有许多参数可以改变这种比较的结果。
Mongodb将在数据库级别(而不是文档)进行读/写锁定。Redis是一个单线程服务器,它将序列化所有内容。就并发的粒度而言,它基本上是等效的。Redis的实现效率更高,因为使用Mongodb,最终会有数百个线程在同一个锁上竞争。
你还需要考虑在协议层发生了什么: Mongodb协议是不对称的,所以你有可能在不检查最后一次操作是否成功的情况下推送数据(即没有强制确认)。Redis协议是纯粹的客户端/服务器,所以每个命令都返回一个客户端应用程序必须读取的结果。不过,您可以对命令进行流水线操作。在协议层面,Mongodb可以让你比Redis更快地推送数据(考虑到纯性能,没有任何命令确认)。
它还取决于persistency选项: 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对于一个连接是非常有效的,但由于读/写锁定,这种效率随着连接数量的增加而降低。Redis没有管道,只有一个连接,它的客户端/服务器协议严重减慢了速度。但是,如果工作负载分布在更多的连接上,或者如果使用流水线,则等待确认的成本将被摊销,并且Redis可以实现比MongoDB更高的吞吐量(在这个0.02美元的基准测试中)。
https://stackoverflow.com/questions/17580153
复制相似问题