MongoDB缓存计数器



我正在为一个使用MongoDB作为' DB-Engine '的网站上的产品编写访问计数器。

这里说Mongo把经常访问的东西保存在内存中,并且有一个集成的内存缓存引擎。

那么我是否可以依赖这个集成的缓存系统并在每次访问时简单地设置计数器,或者在高流量环境中还需要另一个缓存层?

这是两个不同的东西。MongoDB使用一个简单的分页内存管理系统,通过设计,将内存映射磁盘空间中访问最多的部分保留在内存中。

因此,对于经常请求但不经常更改的计数器,这将对您最有帮助。不幸的是,对于网站计数器来说,这两件事是相互排斥的。因为增加计数器通常不会导致MongoDB将持有计数器的文档移动到磁盘上,所以读缓存仍然是相当有效的。

主要的问题是你的写量,基本上每次访问增加一次并不是很划算。我建议一个策略,你的计数器web应用缓存传入访问,每X次访问或每Y秒推送计数器更新,以先到的为准。这里你的主要目标是减少每秒写,所以你肯定不希望每个计数器访问一个db写。

虽然我从来没有在你描述的那种系统上工作过,我将做以下操作(假设我正确阅读了你的问题,并且你确实只是想为每次访问增加计数器)。

  • 使用$inc操作符自动执行递增,或者使用upserts和修饰符来创建文档结构,如果它还没有存在的话
  • 使用适当的Write Concern来加速更新,如果这样做是安全的(例如,如果Write Concern为NONE,你对update的调用将立即返回,你只需要信任Mongo将其持久化到磁盘)。当然,这是否安全取决于用例。如果你正在计算数百万次点击,那么一次失败的点击可能不是问题。
  • 如果您存储的数据规模确实很大,请考虑使用分片对写入进行分区

最新更新