这是否是将MongoDB和Redis结合使用的好场景?

3
我正在使用Node.js开发一个具有许多实时功能的网站。其中一个特性是,用户可以在某个频道上发布内容,并且这将立即被推送给正在观看同一频道的所有人。
我试图找出最好的解决方法。 MongoDB的数据结构非常适合我的需求,但Redis Pub/Sub功能似乎非常适合这个问题。
因此,我想在MongoDB中存储完整的数据集,并在Redis中添加引用,以将其推送到必要的频道。然后这些频道的订阅者客户端可以从MongoDB数据库中读取完整数据。
这个方案有意义吗?还是我错过了什么?
谢谢!

1
这是一个永恒的哲学问题:为了解决我的问题,我应该使用0、1或更多种方法/工具/技术。如果你的数据是面向文档的,并且你需要它,MongoDB是一个候选。如果你想要快速性能-Redis是一个不错的选择。我相信有很多方法可以只使用这两个中的一个来实现你所描述的一切,或者同时使用两个,或者都不用,或者使用其他技术。 - Itamar Haber
1个回答

3

这很有道理。您可以直接使用Redis或通过socket.io API使用Redis,并使用MongoDB进行持久化数据。

唯一需要注意的是,Redis的发布/订阅不提供任何排队功能。Redis不缓存通知,它们直接从发布者套接字传递到订阅者套接字,在同一事件循环迭代中。这很快,但如果订阅者关闭其连接,则在重新建立连接之前可能会丢失一些项目。交付完全没有保证。

然而,断开连接后重新连接的订阅者可以使用MongoDB数据获取它所错过的项目(如果需要)。


我会在MongoDB数据库中镜像信息,并使用Redis实现实时体验。如果发生页面重新加载,应用程序将从MongoDB中提取数据。我认为,我可以不使用Redis,而是使用Socket.IO功能广播到特定频道并将所有内容存储在MongoDB中。 Redis中的数据将在一段时间后过期,因此如果发生写入,则会广播数据并将其存储在MongoDB中。这样我就不需要Redis了。但我担心这并不真正可扩展,因为我将依赖于一个Node.js进程(我是对的吗?)。或者在这种情况下Redis是否多余? - Ole Spaarmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接