Mongodb findAndModify 与 redis incr

标签 mongodb redis findandmodify

我想知道 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/

相关文章:

javascript - 我正在尝试使用 Ajax 捕获 facebook 数据并将其写入名为 test.txt 的文本文件

mongodb - 在 Mac 上尝试 mkdir/data/db 时出现只读文件系统

mongodb - Sitecore - WFFM 升级

node.js - node-redis 无法通过 twemproxy 连接到 redis 实例

node.js - 更新mongodb nodejs中文档的数组字段的整个子元素

Mongodb findAndModify原子性

mongodb - 使用 Go 检索 MongoDB 文档时出现问题

asynchronous - 来自 BookSleeve Redis 客户端的缓存异步错误

cookies - Cookie 和 Redis session 存储有什么区别?

database - 如何将新对象添加到mongo中的现有数据