Mongo 作为循环缓冲区

问题描述

我正试图找出一种将 Mongo 用作循环缓冲区的方法。 目前使用 sql Lite 但性能方面不适合我们的情况。 需要满足的规格是: 集合必须每 x 秒清空一次。 当满足 y 个文档的限制时,集合必须自行清空。

通过 Mongo 文档,限制集合和更改事件似乎是一种方法

https://docs.mongodb.com/manual/core/capped-collections/

https://docs.mongodb.com/manual/reference/change-events/

在文档中指出:“上限集合的工作方式类似于循环缓冲区”

但是我不知道如何:

  1. 每 x 秒清空一次集合。 Mongo TTL 功能不可行,因为有上限的集合不支持 TTL。其他替代方案?
  2. 检索任何“已删除的文档”。 替换操作类型的更改事件似乎是一种方法。其他替代方法

有没有人试过使用 Mongo 作为循环缓冲区? 上面的-Capped Collections/Change Events- 是实现它的方法吗?

感谢您的回复

解决方法

来自https://en.wikipedia.org/wiki/Circular_buffer

循环缓冲区 [...] 是一种数据结构,它使用单个固定大小的缓冲区,就像端到端连接一样。

恐怕您引用的“上限集合的工作方式类似于循环缓冲区”正是使用了循环缓冲区的这个定义。

上限集合受文档大小和/或数量的限制。旧文件不是由计时器删除,而是由新文件删除。把它想象成新文件覆盖旧文件。

不幸的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确的。并且由于没有正式删除,因此变更流中没有删除事件。

简单来说,如果您需要检索从缓冲区驱逐的文档,您需要自己实现。

TTL 索引可能适合您,但它是有时间限制的,而不是大小限制。它将向变更流发出删除事件,但需要考虑以下三点:

  • 您需要保持 changestream 客户端运行以确保捕获所有事件。
  • TTL 索引过程是有成本的。 Mongodb 每分钟都会运行 TTL Monitor 线程来删除过时的文档。它消耗资源。不如 sqlite,但系统性能可能会下降,并且如果它忙于其他一些操作,文档可能不会在指定的时间后完全删除。

建议您自己控制和选择/删除文档。我知道您已经有一些使用 sqlite 的实现,因此只需将其调整为使用 mongodb。

db.collection.find({}).sort({_id:-1}).limit(1)

将返回给您最旧的文档。它使用默认索引并且应该表现良好。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...