我想知道Mongodb findAndmodify vs redis increment命令在速度方面有多好。我知道Mongodb findAndModify会对文档进行一次r / w锁定,但是如果我有100个线程试图同时写入,那就想知道redis是否是一个更优选的选项。
答案 0 :(得分:2)
有许多参数可以改变这种比较的结果。
Mongodb将在数据库级别(而不是文档)执行r / w锁定。 Redis是一个单线程服务器,它将序列化所有内容。就并发性的粒度而言,它将大部分是等价的。 Redis实现更有效,因为使用Mongodb,你最终会有数百个线程在同一个锁上竞争。
您还需要考虑在协议级别发生的事情:Mongodb协议是不对称的,因此您可以在不检查上一次操作是否成功的情况下推送数据(即没有强制性的确认)。 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美元基准测试中)。