【问题标题】:MongoDB Cache or Not Cache using RedisMongoDB缓存或不缓存使用Redis
【发布时间】:2020-04-22 13:14:09
【问题描述】:

在我的项目中,主数据库是 mongodb,对于缓存,我有 redis。 现在对于较长且更复杂的查询,我使用 redis 来缓存它们显然更好。

但我想知道我是否应该缓存简单的查询,如按 id 查找,或按其他一些 mongodb 索引字段查找?使用 redis 进行这种索引查找是否有意义?

或者我应该不缓存这种查询,因为 mongodb 内部已经有很好的缓存机制?

查找 mongodb 索引字段更快还是查找 redis 更快?

【问题讨论】:

    标签: mongodb caching redis mongodb-query spring-data-redis


    【解决方案1】:
    1. 在 Redis 中查找肯定更快(因为 Redis 的键值特性)。

    2. MongoDB 无法缓存查询结果

    MongoDB 是一个数据库,无法为您缓存查询结果,因为数据可能随时更改。 所以管理缓存是开发者的责任

    而且 MongoDB 也有一些很好的内部机制来使用 RAM 以获得更好的性能。 (查看this问题了解更多信息)

    1. 数据库查询昂贵

    当您在 MongoDB 中执行查询时,将有许多进程来查找数据,即使是简单的查询。但是 Redis 可以非常非常快地找到密钥。所以很明显,你必须使用 Redis 来保存东西,而 MongoDB 只用于永久存储和查询

    我的建议:

    建议将任何高使用率大量查询的结果缓存在 Redis、Memcached 或其他键值对内存存储中。 (每天在 Database/MongoDB 中查找一千次简单的帖子是没有意义的。这只是在浪费资源。缓存系统的首要任务是保持高使用率的数据更接近)

    另外注意你必须有一个好的“cache invalidation”机制来更新Redis中的缓存数据。

    我建议使用write-through技术将模型和数据保存在 Redis 中。

    我希望这会有所帮助。

    【讨论】:

    • 即使是索引查找,也可以通过 id 查找文档?我认为 mongodb 也有一些 LRU 缓存..
    • 基于这个答案:***.com/a/17534847/8712494。我认为,如果您确定查询的结果将从 RAM 中提供,那么就没有必要将它们保存在 Redis 中。但这只是简单的查找(使用 id),在其他情况下(当查询较长时)我个人会将它们存储在 Redis 中(即使数据库足够快,我更喜欢不使用数据库,并保持轻便) @user1955934
    • 只有一分钟的非常短的缓存是个好主意吗?最坏的情况是你每小时调用 60 次 db 吗?
    • 没关系,3秒也能找到。您应该计算查询总数并查看更大的图景。例如,缓存 1000 个查询,您称它们为每个 100/h,每小时将节省约 99900 个 Mongo 查询。 @user1955934