Redis缓存的架构和Mongo的持久性

Rya*_*gle 42 caching mongodb redis node.js

设置:
想象一下'twitter like'服务,用户提交帖子,然后由许多(数百,数千或更多)用户阅读.

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

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

问题:
1.这种架构是否有水?有一个更好的方法吗?
2.关于在Redis和MongoDB中存储帖子的机制,我正在考虑让应用程序执行2次写入:第1次 - 写入Redis,然后立即可供订阅者使用.第二个 - 成功存储到Redis后,立即写入MongoDB.这是最好的方法吗?我应该让Redis将过期的帖子推送到MongoDB本身吗?我想到了这一点,但是我找不到很多关于直接从Redis推送到MongoDB的信息.

Did*_*zia 36

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

带redis的MongoDB

一个关键点是您需要的弹性级别.可以将Redis和MongoDB配置为达到可接受的弹性级别,并且应该在设计时讨论这些注意事项.此外,它可能会对部署选项施加约束:如果您想要Redis和MongoDB的主/从复制,则至少需要4个框(Redis和MongoDB不应部署在同一台机器上).

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

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

  • 因此,如果你将MongoDB和Redis放在同一个盒子上并且MongoDB数据不适合内存,MongoDB将通过操作系统分页机制"窃取"内存给Redis.结果是Redis的性能大幅下降. (19认同)
  • 这是因为MongoDB将数据文件映射到内存中.因此,它使用虚拟内存机制来访问其结构被设计为有利于局部性的数据(例如,btree用于索引).对于MongoDB,当数据不适合内存时,机器将进行交换,并且它是为此而设计的. (10认同)
  • 相反,Redis是一个纯主内存数据存储,基于面向内存的数据结构(哈希表,列表,跳过列表等),它们不强制执行任何类型的位置.因为它是单线程的,所以当Redis内存被换出时,性能会受到极大影响. (10认同)
  • 谢谢,很高兴知道.在Mongo和Redis数据完全适合Ram的盒子上我认为这不是问题吗? (3认同)