背景/意图:
因此,我将从头开始创建一个事件跟踪器,并对如何执行此操作有一些想法,但我不确定继续使用数据库方面的最佳方法。我感兴趣的一件事是允许这些事件完全动态,但同时允许报告关系事件计数器。
例如,所有按操作系统细分的国家/地区。期望的效果是:
我的意图是能够接受这样的事件名称:
/?country=US&os=iOS&device=iPhone&color=blue&carrier=Sprint&city=orlando&state=FL&randomParam=123&randomParam2=456&randomParam3=789
这意味着为了对上述内容做关系计数器,我可能会为每个请求增加100多个计数器。
假设每天将有超过上百万的请求。
我希望在跟踪的事件名称方面保持完全动态,我也希望以这样的方式进行,即对数据的查找仍然非常快。因此,我一直在研究使用redis或mongodb。
问题:
有没有更好的方法可以做到这一点,然后在保持字段动态的同时进行计数?
如果这一切都在一个文档中(结构像树),那么在一次操作中使用mongodb中的$ inc运算符可以同时增加100多个计数器是否可行且不慢?这方面的好处是,我可以在一个查询中快速检索一个“广告系列”的所有统计信息。
这会更适合redis并为活动的所有适用柜台做一个锌合金吗?
由于
答案 0 :(得分:2)
根据键结构的布局方式,我建议使用锌管命令。你有一个简单的“提交”触发器 - 请求。如果你要迭代你的参数并对每个键进行遍历,那么在请求结束时传递执行命令它会非常快。我已经实现了像你描述的cgi和Django应用程序这样的系统。我按照以下方式设置了一个关键结构:
YYYY-MM-DD:HH:MM - >排序集
并且能够在redis一侧处理类似于150000-200000每秒增量的东西,只需一个过程,这对于您描述的场景应该是足够的。这个关键结构允许我根据时间窗口获取数据。我还为密钥添加了一个过期,以避免编写db清理过程。然后我有了一个cronjob,可以使用上述关键模式的变体进行设置操作,以每小时,每天和每周“汇总”统计数据。我提出了这些想法,因为它们可以利用Redis的内置功能使报告方面更简单。还有其他方法可以做到,但这种模式似乎运作良好。
正如eyossi所指出的,对于执行并发写入和读取的系统,全局锁定可能是一个真正的问题。如果你把它写成一个实时系统,并发可能是一个问题。如果它是“end if if day”日志解析系统,那么除非您在输入时运行解析器或报告的多个实例,否则它不可能触发争用。关于保持快速读取在Redis中,我会考虑设置一个只读的redis实例,而不是主要实例。如果将其放在运行报告的服务器上并将报告过程指向它,则生成报告应该非常快。
根据您的可用内存,数据集大小以及是否在redis实例中存储任何其他类型的数据,您可能会考虑运行32位redis服务器以降低内存使用率。一个32b实例应该能够将大量这类数据保存在一小块内存中,但如果运行正常的64位Redis并没有占用太多内存,请随意使用它。一如既往地测试自己的使用模式以验证
答案 1 :(得分:0)
在redis中,您可以使用multi
同时递增多个键。
答案 2 :(得分:0)
我对MongoDB有一些不好的经历,我发现当你有大量的写入时它真的很棘手......
你可以查看this link以获取更多信息,不要忘记阅读“MongoDB使用1个BFGL(大型全局锁定)”的部分(可能已在第2版中进行了改进) .x - 我没有检查它)
另一方面,我对Redis
有很好的体验,我使用它进行大量的读/写操作,效果很好。
您可以在此处找到有关我如何使用Redis
(以了解并发读/写量)的更多信息:http://engineering.picscout.com/2011/11/redis-as-messaging-framework.html
答案 3 :(得分:0)
如果您不需要原子特征,我宁愿使用pipeline
而不是multi
。