Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一次递增数百个计数器,redis还是mongodb?_Mongodb_Redis_Schema - Fatal编程技术网

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

一次递增数百个计数器,redis还是mongodb?,mongodb,redis,schema,Mongodb,Redis,Schema,背景/意图: 因此,我将从头开始创建一个事件跟踪器,并对如何做到这一点有一些想法,但我不确定处理数据库方面的事情的最佳方式。我感兴趣的一件事是允许这些事件完全动态,但同时允许报告关系事件计数器 例如,按操作系统划分的所有国家。预期的效果是: 美国事件 iOS——发生在美国的事件 安卓系统——发生在美国的事件 事件的数量 iOS-#CA中发生的事件 Android-#CA中发生的事件 等等 我的目的是能够接受以下事件名称: /?country=US&os=iOS&devic

背景/意图:

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

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

  • 美国事件
    • iOS——发生在美国的事件
    • 安卓系统——发生在美国的事件
  • 事件的数量
    • 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多个计数器

    假设每天有1000多万以上的请求

    我希望在跟踪事件名称方面保持完全的动态性,并且我还希望以这样一种方式进行跟踪,即对数据的查找保持超级快速。因此,我一直在考虑为此使用redis或mongodb

    问题:

  • 有没有更好的方法在保持字段动态的同时执行此操作

  • 如果这是一个完整的文档(结构类似于树),那么在mongodb中使用$inc操作符在一个操作中同时增加100多个计数器是否可行且不慢?这样做的好处是,我可以在一个查询中快速检索一个“活动”的所有统计信息

  • 这是否更适合redis和为事件的所有适用计数器执行zincrby


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

    我对MongoDB有一些不好的经验,我发现当您对它进行大量写入时,它可能会非常棘手

    您可以查看更多信息,不要忘了阅读“MongoDB使用1个BFGL(大f***ing全局锁)”的部分(在2.x版中可能已经改进了-我没有检查它)

    另一方面,我对Redis有着很好的体验,我使用它进行了大量的读/写操作,效果非常好。
    您可以在此处找到有关我如何使用Redis的更多信息(以了解并发读/写的数量):

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

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

    并且能够在redis端以每秒150000-200000的速度处理一个进程,这对于您描述的场景来说已经足够了。这个密钥结构允许我根据时间窗口获取数据。我还为密钥添加了一个expire,以避免编写数据库清理过程。然后,我有了一个cronjob,可以使用前面提到的关键模式的变体将统计数据“汇总”到每小时、每天和每周。我提出这些想法,因为它们是您可以利用Redis的内置功能使报告方面更简单的方法。还有其他方法可以做到这一点,但这种模式似乎运作良好

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


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

    如果您不需要原子功能,我宁愿使用
    管道
    而不是
    多个

    您需要它有多“动态”?i、 什么延迟?另一种方法是为每个事件存储一个文档,然后定期使用map reduce汇总数据。这种方法还允许您在事后更改报告内容(例如,为“奥兰多”添加自定义报告)。因为这更多是为了营销信息,所以最好尽快提供。另一个原因是我认为计数器可能是一个很好的适合。谢谢,在玩了多点后,我想我可能会走这条路。感谢链接。我经常使用redis,非常喜欢它,所以我可能会选择它。吸引我来到mongodb的是一个潜在的前景,即在一份文件中包含“活动”的所有内容,但BFGL在这方面令人沮丧。虽然我不清楚这是否只会影响整个集合的写入,还是会影响集合中的内容。我会进一步调查的!谢谢你的观点和建议。我实际上也在考虑用类似的方式来做。我的意图