我想知道 Mongodb findAndmodify 与 redisincrement 命令在速度方面有多好。我知道 Mongodb findAndModify 会对文档执行读/写锁定,但如果我有 100 个线程尝试同时写入,我想知道 redis 是否是一个更可取的选择。
最佳答案
有许多参数可以改变这种比较的结果。
Mongodb 将在数据库级别(而不是文档级别)执行读/写锁。 Redis 是一个单线程服务器,会将所有内容序列化。就并发粒度而言,它基本上是等效的。不过,Redis 实现效率更高,因为使用 Mongodb,最终会出现数百个线程争夺同一个锁。
您还需要考虑协议(protocol)级别发生的情况:Mongodb 协议(protocol)是不对称的,因此您甚至可以在不检查最后操作是否成功的情况下推送数据(即没有强制确认)。 Redis 协议(protocol)是纯粹的客户端/服务器,因此每个命令都会返回客户端应用程序必须读取的结果。不过,您可以管道命令。在协议(protocol)级别,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
我们可以看到,由于不对称协议(protocol),MongoDB 在一个连接上的效率非常高,但由于读写锁,这种效率随着连接数的增加而降低。 Redis 没有管道和一个连接,其客户端/服务器协议(protocol)严重拖慢了速度。但是,如果工作负载分布在更多连接上,或者使用管道,则等待确认的成本会被摊销,并且 Redis 可以获得比 MongoDB 更高的吞吐量(在这个特定的 0.02 美元基准上)。
关于Mongodb findAndModify 与 redis incr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580153/