MongoDB缓存计数器

时间:2011-08-30 09:06:29

标签: caching mongodb counter

我正在为使用MongoDB作为其“数据库引擎”的网站上的产品编写访问计数器。

Here它说Mongo将经常访问的内容保存在内存中,并且具有集成的内存缓存引擎。

那么我可以继续使用这个集成的缓存系统,并在每次访问时笨拙地设置计数器,还是在高流量环境中还需要另一个缓存层?

2 个答案:

答案 0 :(得分:5)

他们是两个独立的东西。 MongoDB使用一个简单的分页内存管理系统,根据设计,它可以将内存映射磁盘空间中访问最多的部分保存在内存中。

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

主要问题是你的写作,基本上每次访问增加不会非常划算。我建议采用一种策略,即您的计数器webapp缓存来访,并且每次X次访问或每Y秒推送计数器更新,以先到者为准。这里的主要目标是减少每秒的写入次数,因此您绝对不希望每次计数器访问都进行数据库写入。

答案 1 :(得分:2)

虽然 我从未使用过你所描述的那种系统 ,但我会做以下事情(假设我已经正确地阅读了你的问题而你确实只是想要为每次访问增加计数器。)

  • 使用$inc运算符以原子方式执行增量,或使用upserts with modifiers创建文档结构(如果尚未存在)
  • 使用适当的写入关注来加速更新,如果这样做是安全的(即写入关注点为NONE,您的更新调用将立即返回,您只需要信任Mongo将其保留到磁盘)。当然这是否安全取决于用例。如果您计算数百万次点击,则1次失败可能不是问题。
  • 如果您存储的数据规模非常大,请考虑使用分片来分区写入