2

背景/意图:

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

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

  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 吗?

谢谢

4

4 回答 4

2

根据您的关键结构的布局方式,我建议对zincr 命令进行流水线操作。你有一个简单的“提交”触发器——请求。如果你要迭代你的参数和 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 不会占用太多内存,请随意使用它。一如既往地测试您自己的使用模式以验证

于 2012-07-12T16:25:38.753 回答
0

在 redis 中,您可以使用multi同时增加多个键。

于 2012-07-11T21:15:18.947 回答
0

我对 MongoDB 有过一些不好的体验,我发现当你有很多写入它时它可能真的很棘手......

您可以查看此链接以获取更多信息,并且不要忘记阅读“MongoDB 使用 1 BFGL (big f***ing global lock)”的部分(可能已经在 2.x 版本中改进 - 我没有检查它)

另一方面,我有很好的经验Redis,我用它来进行大量的读/写,而且效果很好。您可以在此处找到有关我如何使用的更多信息Redis(以了解并发读取/写入的数量):http: //engineering.picscout.com/2011/11/redis-as-messaging-framework.html

于 2012-07-11T22:29:43.300 回答
0

如果您不需要原子功能,我宁愿使用pipeline..multi

于 2012-10-23T07:23:17.503 回答