mongodb - 一次增加数百个计数器,redis 还是 mongodb?

标签 mongodb redis schema

背景/意图:

因此,我将从头开始创建一个事件跟踪器,并对如何执行此操作有一些想法,但我不确定继续处理数据库方面的最佳方法。我感兴趣做的一件事是允许这些事件完全动态,但同时允许报告关系事件计数器。

例如,按操作系统分割的所有国家/地区。期望的效果是:

  1. 美国事件数量
    • iOS - 在美国发生的事件数量
    • Android - 美国发生的事件数量
  2. CA 事件数量
    • iOS - CA 中发生的事件数量
    • Android - CA 中发生的事件数量
  3. 等等

我的目的是能够接受这些事件名称,如下所示:

/?country=US&os=iOS&device=iPhone&color=blue&carrier=Sprint&city=orlando&state=FL&randomParam=123&randomParam2=456&randomParam3=789

这意味着为了执行类似上述的关系计数器,我可能会为每个请求增加 100 多个计数器。

假设每天会有 10+ 百万个上述请求。

我希望在跟踪的事件名称方面保持完全动态,并且我还希望以一种使数据查找保持超快的方式来实现。因此,我一直在考虑使用 redis 或 mongodb 来实现此目的。

问题:

  1. 有没有更好的方法来做到这一点,然后在保持字段动态的同时进行计数器?

  2. 假设这一切都在一个文档中(结构像一棵树),那么使用 mongodb 中的 $inc 运算符在一个操作中同时递增 100 多个计数器是否可行且不慢?这样做的好处是我可以在单个查询中快速检索一个“营销事件”的所有统计信息。

  3. 这是否更适合 Redis 并为事件的所有适用计数器执行 Zincrby?

谢谢

最佳答案

根据您的关键结构的布局方式,我建议对 zincr 命令进行管道化。您有一个简单的“提交”触发器 - 请求。如果您要迭代参数和锌每个键,那么在请求结束时传递执行命令将会非常快。我已经实现了一个像你描述的那样的系统,既是 cgi 又是 Django 应用程序。我按照以下方式建立了一个关键结构:

YYYY-MM-DD:HH:MM -> 排序集

并且能够使用单个进程在 Redis 端处理每秒 150000-200000 个增量的数据,这对于您所描述的场景来说应该足够了。这个关键结构使我能够根据时间窗口抓取数据。我还为键添加了过期时间,以避免编写数据库清理过程。然后,我有一个 cronjob,它将使用上述关键模式的变体执行设置操作,将统计数据“汇总”为每小时、每天和每周。我提出这些想法是因为它们是您可以利用 Redis 内置功能来简化报告方面的方法。还有其他方法可以做到这一点,但这种模式似乎效果很好。

正如 eyossi 所指出的,对于进行并发写入和读取的系统来说,全局锁可能是一个真正的问题。如果您将其编写为实时系统,那么并发性很可能是一个问题。如果它是“end if day”日志解析系统,那么它不太可能触发争用,除非您在输入时运行解析器或报告的多个实例。关于在 Redis 中保持快速读取,我会考虑设置一个从属主实例的只读 Redis 实例。如果您将其放在运行报告的服务器上并将报告进程指向它,那么生成报告应该非常快。

根据您的可用内存、数据集大小以及是否在 Redis 实例中存储任何其他类型的数据,您可能会考虑运行 32 位 Redis 服务器以降低内存使用量。 32b 实例应该能够在一小块内存中保存大量此类数据,但如果运行普通的 64 位 Redis 不会占用太多内存,请随意使用它。一如既往地测试您自己的使用模式来验证

关于mongodb - 一次增加数百个计数器,redis 还是 mongodb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441293/

相关文章:

ruby-on-rails - 使用 Capistrano 部署时 Hiredis 失败

mysql - mysql数据库中的标志字段

database - 真实世界的 MySQL/Postgres 数据库模式示例和分析工具

javascript - 无法找到/或实现正确的 mongoDb 方法来查找和更新子文档

mongodb - 无法创建 mongodb 数据库

java - 连接 mongolab 上 mongoDB 中的端口

mongodb - 如何使用elemMatch匹配嵌套数组

ruby-on-rails - 在这种情况下使用 Redis 合适吗?

javascript - Session Node.js + Passport.js + Redis,通过user.id存储 session

java - 是否可以使用 JAXB 从模式映射到 java.util.Map?