【问题标题】:Architecture for Redis cache & Mongo for persistenceRedis 缓存和 Mongo 的持久性架构
【发布时间】:2012-06-28 10:56:47
【问题描述】:

设置:
想象一个“类似推特”的服务,用户提交一个帖子,然后被许多(数百、数千或更多)用户阅读。

我的问题是关于构建缓存和数据库以优化快速访问和多次读取的最佳方式,但仍保留历史数据,以便用户可以(如果他们愿意)看到较旧的帖子。这里的假设是 90% 的用户只会对新内容感兴趣,并且偶尔会访问旧内容。这里的另一个假设是我们想要针对 90% 进行优化,如果较旧的 10% 需要更长的时间来检索,也可以。

考虑到这一点,我的研究似乎强烈指向使用缓存的方向 90%,然后还将帖子存储在另一个更长期的持久系统中。所以到目前为止我的想法是使用 Redis 作为缓存。优点是 Redis 速度非常快,而且它内置了 pub/sub,非常适合向多人发布帖子。然后我正在考虑使用 MongoDB 作为更永久的数据存储来存储相同的帖子,这些帖子将在 Redis 过期时被访问。

问题:
1. 这个架构能站得住脚吗?有一个更好的方法吗?
2. 关于在 Redis 和 MongoDB 中存储帖子的机制,我在考虑让应用程序执行 2 次写入:第一次 - 写入 Redis,然后立即可供订阅者使用。 2nd - 成功存储到 Redis 后,立即写入 MongoDB。这是最好的方法吗?我应该让 Redis 将过期的帖子推送到 MongoDB 本身吗?想过这个,但是找不到太多直接从Redis推送到MongoDB的资料。

【问题讨论】:

  • Redis 不会推送到 MongoDb。你必须自己做。或者只是同时写信给两个地方(如你所建议的那样)。
  • 我总是先推送到更健壮的存储(在本例中为 MongoDB),或者像 Sergio 建议的那样,同时进行异步。永远不要反过来。
  • 我的问题是,您是只将帖子的 ID 存储在缓存中,还是将整个帖子对象列表存储在缓存中?

标签: node.js mongodb caching redis


【解决方案1】:

将 Redis 和 MongoDB 联系起来实际上是明智的:它们是优秀的团队成员。您可以在此处找到更多信息:

MongoDB with redis

一个关键点是您需要的弹性级别。 Redis 和 MongoDB 都可以配置为实现可接受的弹性级别,这些注意事项应在设计时讨论。此外,它可能会限制部署选项:如果您想要 Redis 和 MongoDB 的主/从复制,您至少需要 4 个盒子(Redis 和 MongoDB 不应部署在同一台机器上)。

现在,保留 Redis 用于队列、发布/订阅等可能会更简单一些……并且仅将用户数据存储在 MongoDB 中。基本原理是您不必为具有不同范例的两个商店设计相似的数据访问路径(这项工作的困难部分)。此外,MongoDB 具有内置的水平可扩展性(副本集、自动分片等),而 Redis 仅具有自己动手的可扩展性。

关于第二个问题,写信给两家商店是最简单的方法。没有将 Redis 活动复制到 MongoDB 的内置功能。不过,设计一个监听 Redis 队列(将发布活动)并写入 MongoDB 的守护进程并不难。

【讨论】:

  • 我很好奇,关于为什么 Redis 和 Mongo 不应该部署在同一台机器上的任何链接/背景?
  • 这是由于 MongoDB 将数据文件映射到内存中。因此,它使用虚拟内存机制来访问其结构设计为有利于局部性的数据(例如,btree 用于索引)。在 MongoDB 中,当内存放不下数据时,机器会进行交换,它就是为此而设计的。
  • 相反,Redis 是一个纯主存数据存储,基于面向内存的数据结构(哈希表、列表、跳过列表等),不强制执行任何类型的局部性.因为它是单线程的,所以当 Redis 内存被换出时,性能会受到很大影响。
  • 所以如果你把 MongoDB 和 Redis 放在同一个盒子上,而 MongoDB 数据不适合内存,MongoDB 会通过 OS 分页机制“窃取”内存给 Redis。结果是 Redis 的性能大幅下降。
  • 谢谢,很高兴知道。在 Mongo 和 Redis 数据完全适合 Ram 的盒子上,我认为这不是问题吗?
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2011-04-12
  • 2023-03-17
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多