【发布时间】:2012-07-11 13:56:42
【问题描述】:
背景/意图:
因此,我将从头开始创建一个事件跟踪器,并对如何执行此操作有一些想法,但我不确定处理数据库方面的最佳方法。我感兴趣的一件事是允许这些事件完全动态,但同时允许报告关系事件计数器。
例如,按操作系统划分的所有国家/地区。期望的效果是:
- 美国事件数
- iOS - 美国发生的事件数
- Android - 美国发生的事件数
- CA # 事件
- iOS - 在 CA 中发生的事件数
- Android - 在 CA 中发生的事件数
- 等
我的意图是能够像这样接受这些事件名称:
/?country=US&os=iOS&device=iPhone&color=blue&carrier=Sprint&city=orlando&state=FL&randomParam=123&randomParam2=456&randomParam3=789
这意味着为了对上述情况执行关系计数器,我可能会为每个请求增加 100 多个计数器。
假设每天会有 10+ 百万个上述请求。
我希望在跟踪事件名称方面保持完全动态,并且我还希望以这样一种方式进行,即对数据的查找保持超快。因此,我一直在考虑为此使用 redis 或 mongodb。
问题:
在保持字段动态的同时,还有比计数器更好的方法吗?
如果所有这些都在一个文档中(结构像一棵树),那么使用 mongodb 中的 $inc 运算符在一个操作中同时增加 100 多个计数器是否可行且不慢?这样做的好处是我可以在一个查询中快速检索一个“活动”的所有统计信息。
这是否更适合 redis 并为事件的所有适用计数器执行 zincrby?
谢谢
【问题讨论】:
-
你需要它有多“动态”?即什么延迟?另一种方法是为每个事件存储一个文档,然后定期使用 map-reduce 来汇总数据。这种方法还允许您在事后更改您报告的内容(例如,为“奥兰多”添加自定义报告)。
-
由于这更多地用于营销信息,因此尽快提供它是理想的。我认为计数器可能很适合的另一个原因。