规范
我有一个保存记录集合的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界面和一个很棒的编辑器。