Mongoose(或类似的ODM)内存中的loggingregistry?

规范

我有一个拥有一系列logging的MongoDB,为简单起见,我们称它们为operations 。 其中一些operations正在运行,而每个正在运行的操作都包含一系列实时到达的events

我通过socket.io实时发布这些事件,并提供一个旨在提供最新事件列表的API端点。

目前的情况

看到事件快速到来(高达每秒数千次),在logging(在这种情况下,我使用Mongoose作为对象映射器)对每个传入事件来说似乎.save()是最理想的。 目前的情况是我.save().save()调用只能每2秒执行一次。 正因为如此,每当operation正在进行时,按需列表总是在实时stream的后面0到2秒之间的任何地方。

build议的优化

我正在考虑实现一个内存“registry”,这些registry对所有正在运行的operations都有引用(在可预见的未来将会有不超过10个同时运行的操作,所以不要担心内存限制。

每当请求到达时,“registry”将首先被searchlogging,如果find,最新版本将从那里被提供。 如果没有,它实际上会查询数据库。


tldr:由于调用model.save()调用,实时和按需事件之间的差距,所提出的优化是对logging的特定子集使用内存中存储。

这个问题

这是一个有效的优化,还是我错过了Mongoose的观点,也许忽略了其他更可行的解决scheme?

Redis如果你还没有考虑Redis的话,我build议你去看看Redis,你可以使用Redis保存在MongoDB中的logging,如果没有查询MongoDB,可以从Redis中检索(如果可用),并保存到redis中。

或者可以用Cassandra来达到这个目的?

正如Vipin Dubeybuild议的那样,您可以使用Rediscaching查询。 这是一个通常用于高速caching目的的内存数据存储。

我推荐cachegoose模块。 它很好地集成了Mongoosecaching概念,通过存储MongoDB查询(你想要的),并在运行相同的查询时从caching中获取它们。 因此,你将有更less的电话到你的数据库。

Redis也有各种界面来显示您的当前值。 我个人推荐Redsmin,因为它提供了一个真棒编辑器的跨平台Web界面。