Mongo 作为循环缓冲区
Mongo as circular buffer
我正在尝试找出一种将 Mongo 用作循环缓冲区的方法。
目前使用 SQL Lite 但性能方面不适合我们的情况。
需要满足的规范是:
该集合必须每 x 秒清空一次。
当达到 y 个文档的限制时,集合必须自行清空。
通过 Mongo 文档,上限集合和更改事件似乎是一个可行的方法。
https://docs.mongodb.com/manual/core/capped-collections/
https://docs.mongodb.com/manual/reference/change-events/
在文档中指出:“Capped collections 的工作方式类似于循环缓冲区”
但是我不确定如何:
- 每 x 秒清空一次集合。
Mongo TTL 功能不可行,因为上限 collections.Other 替代方案不支持 TTL?
- 检索任何“已删除的文档”。
更换操作类型的更改事件似乎是 aproach.Other 替代方案?
有没有人试过使用Mongo作为循环缓冲区?
上面的 -Capped Collections/Change 事件 - 是实现它的方法吗?
感谢您的回复。
来自https://en.wikipedia.org/wiki/Circular_buffer:
a circular buffer [...] is a data structure that uses a single, fixed-size buffer as if it were connected end-to-end.
恐怕您引用的“Capped collections work in a way similar to circular buffers”正是使用了循环缓冲区的这个定义。
上限集合的大小上限为 and/or 个文档。旧文档不会被计时器删除,而会被新文档删除。把它想象成新文件覆盖旧文件。
遗憾的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确地。并且由于没有正式删除,所以变更流中没有删除事件。
简单来说,如果您需要检索从缓冲区中逐出的文档,您需要自己实现。
TTL 索引可能适合您,但它有时间限制,不受大小限制。它将向变更流发出删除事件,但需要考虑以下三点:
- 您将需要维护 changestream 客户端 运行 确保您捕获所有事件。
- TTL索引过程自带成本。每分钟 Mongodb 运行 TTL 监视器线程以删除过时的文档。它消耗资源。不如 sqlite 那么多,但系统性能可能会降低,并且如果它忙于其他操作,则可能不会在指定的时间后准确删除文档。
最好自己控制并 select/delete 记录。我知道您已经有一些使用 sqlite 的实现,所以只需将其调整为使用 mongodb 即可。
db.collection.find({}).sort({_id:-1}).limit(1)
请问return你最老的文档。它使用默认索引并且应该表现良好。
我正在尝试找出一种将 Mongo 用作循环缓冲区的方法。 目前使用 SQL Lite 但性能方面不适合我们的情况。 需要满足的规范是: 该集合必须每 x 秒清空一次。 当达到 y 个文档的限制时,集合必须自行清空。
通过 Mongo 文档,上限集合和更改事件似乎是一个可行的方法。
https://docs.mongodb.com/manual/core/capped-collections/
https://docs.mongodb.com/manual/reference/change-events/
在文档中指出:“Capped collections 的工作方式类似于循环缓冲区”
但是我不确定如何:
- 每 x 秒清空一次集合。 Mongo TTL 功能不可行,因为上限 collections.Other 替代方案不支持 TTL?
- 检索任何“已删除的文档”。 更换操作类型的更改事件似乎是 aproach.Other 替代方案?
有没有人试过使用Mongo作为循环缓冲区? 上面的 -Capped Collections/Change 事件 - 是实现它的方法吗?
感谢您的回复。
来自https://en.wikipedia.org/wiki/Circular_buffer:
a circular buffer [...] is a data structure that uses a single, fixed-size buffer as if it were connected end-to-end.
恐怕您引用的“Capped collections work in a way similar to circular buffers”正是使用了循环缓冲区的这个定义。
上限集合的大小上限为 and/or 个文档。旧文档不会被计时器删除,而会被新文档删除。把它想象成新文件覆盖旧文件。
遗憾的是,此功能无法从集合 https://docs.mongodb.com/manual/core/capped-collections/#document-deletion 中删除文档。既不是通过 TTL 也不是明确地。并且由于没有正式删除,所以变更流中没有删除事件。
简单来说,如果您需要检索从缓冲区中逐出的文档,您需要自己实现。
TTL 索引可能适合您,但它有时间限制,不受大小限制。它将向变更流发出删除事件,但需要考虑以下三点:
- 您将需要维护 changestream 客户端 运行 确保您捕获所有事件。
- TTL索引过程自带成本。每分钟 Mongodb 运行 TTL 监视器线程以删除过时的文档。它消耗资源。不如 sqlite 那么多,但系统性能可能会降低,并且如果它忙于其他操作,则可能不会在指定的时间后准确删除文档。
最好自己控制并 select/delete 记录。我知道您已经有一些使用 sqlite 的实现,所以只需将其调整为使用 mongodb 即可。
db.collection.find({}).sort({_id:-1}).limit(1)
请问return你最老的文档。它使用默认索引并且应该表现良好。