2

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

4

1 回答 1

3

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

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

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

它还取决于持久性选项:Mongodb 日志化是可选的,Redis 的 append-only-file 配置也是如此。根据每个商店的配置方式,您将获得截然不同的结果。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 美元基准上)。

于 2013-07-11T18:22:18.813 回答