猫鼬(或类似的 ODM)内存记录注册表?



规范

我有一个保存记录集合的MongoDB,为了简单起见,我们称它们为operations。其中一些operations正在运行,正在运行的都包含一系列实时到达的events

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

A. 现状

看到事件快速连续到达(高达每秒数千),在每个传入事件上.save()记录(在本例中,我使用 Mongoose 作为对象映射器)似乎不是最佳的。当前的情况是我正在限制.save()调用,每 2 秒只执行一次。因此,每当operation正在进行时,点播列表在实时流上始终落后 0 到 2 秒。

建议的优化

我正在考虑实现一种内存中的"注册表",其中包含对所有正在运行operations的引用(达到内存限制几乎不是问题,因为在可预见的未来,并发运行的操作不会超过 10 个)。

每当请求到达时,将首先在"注册表"中搜索记录,如果找到,将从那里提供最新版本。如果没有,它实际上会查询数据库。


TLDR:实时事件和按需事件之间的差距 由于调用model.save()受到限制,建议的优化是对特定的记录子集使用内存中存储。

问题

这是一个有效的优化,还是我错过了猫鼬的重点,也许忽略了其他更可行/相关的解决方案?

Redis如果您还没有考虑过,我建议您看看 Redis,您可以使用 Redis 在记录保存在 MongoDB 中后保存记录并从 Redis 中检索(如果可用),如果不查询 MongoDB 并再次保存到 Redis 中。

或者可以同时使用卡桑德拉?

正如Vipin Dubey所建议的那样,您可以使用Redis缓存查询。它是通常用于缓存目的的内存中数据存储。

我推荐缓存模块。它很好地集成了Mongoose缓存概念,通过存储MongoDB查询(你想要的查询),并在运行相同的查询时从缓存中获取它们。因此,您将减少对数据库的调用。

Redis 还具有用于可视化当前值的各种界面。我个人推荐Redsmin,因为它提供了一个跨平台的Web界面和一个很棒的编辑器。

最新更新