比如说,在Redis中缓存猫鼬文档是否有可能,可能是为了实现带有基于超时的缓存刷新机制的写或直接缓存?
P.S.:我对猫鼬-红-缓存很熟悉,但我猜它只支持精益查询,这在这里不太符合要求。(但我可能错了)。
发布于 2013-08-29 19:59:13
当猫鼬对象包装一个MongoDB文档时,您没有理由不能调用
JSON.stringify(mongooseObject.toJSON())它将返回一个表示MongoDB文档的字符串。(toJSON)然后,您可以在redis中存储结果的键/值。
它开始变得更复杂的地方是,您需要首先重写普通的save和update功能,以保存对redis存储的任何修改,而不是对数据库的修改。虽然是可行的,但Mongoose并不是为此而设计的,您可能会更成功地使用本地mongodb驱动程序并以这种方式管理通用文档交互。您需要独立处理许多非常方便的操作符(例如,$push,它将为数组添加一个值)。
然而,真正的问题是,如果所有数据都没有存储在MongoDB中(即使是这样,您仍然绕过缓存层),您就无法使用查询引擎或聚合框架,从而失去了MongoDB的几乎所有功能。而且,如果您没有使用这些功能,那么MongoDB可能不是满足您的需求的最佳选择(您可以考虑使用类似于CouchDB的功能)。
虽然我可以看到在高性能的MongoDB系统中使用缓存层的潜在价值,但是写回式缓存的复杂性可能比它的价值更复杂(而且不一定是安全的)。
当然,写取缓存会更简单(尽管您有两个数据存储的复杂性,并且如果要信任缓存和DB,确保始终提交写操作)。
(顺便说一句,我不知道您实际上是如何管理超时的,因为我认为redis删除了与键相关的值,如果为它们分配了终生/超时时间?如果您正在进行回写,我不想将数据丢失到redis缓存中。
发布于 2022-08-28 18:46:25
在Redis中,您只能缓存原始的JSON,但是要缓存整个Mongoose.Documents对象,您可以使用my库来处理内存中的Redis和mongoose文档中的缓存结果。如果出现一些相关的更改,它还具有基于事件的逻辑来清除两个缓存。
https://stackoverflow.com/questions/18518201
复制相似问题