MongoDB 与 Redis 与 Cassandra 的快速写入临时行存储解决方案

标签 mongodb cassandra redis nosql

我正在构建一个跟踪和验证广告展示次数和点击次数的系统。这意味着有很多插入命令(平均约 90 次/秒,峰值为 250 次)和一些读取操作,但重点是性能并使其超快。

该系统目前在 MongoDB 上,但从那时起我就被介绍给 Cassandra 和 Redis。选择这两种解决方案中的一种而不是留在 MongoDB 上会是个好主意吗?为什么或为什么不?

谢谢

最佳答案

对于这样的收获解决方案,我建议采用多阶段方法。 Redis 擅长实时通信。 Redis 被设计为内存中的键/值存储,并继承了作为内存数据库的一些非常好的优点:O(1) 列表操作。只要服务器上有 RAM 可用,Redis 就不会减慢推送到列表末尾的速度,这在您需要以如此高的速率插入项目时很好。不幸的是,Redis 无法处理大于您拥有的 RAM 量的数据集(它仅 写入 到磁盘,读取用于重新启动服务器或在系统崩溃的情况下)并且扩展必须由您的应用程序完成。 (一种常见的方法是在多个服务器上传播 key ,这是由一些 Redis 驱动程序实现的,尤其是那些用于 Ruby on Rails 的驱动程序。)Redis 还支持简单的发布/订阅消息传递,这有时也很有用。

在这种情况下,Redis 处于“第一阶段”。对于每种特定类型的事件,您在 Redis 中创建一个具有唯一名称的列表;例如我们有“页面查看”和“链接点击”。为简单起见,我们要确保每个列表中的数据具有相同的结构;点击的链接可能有用户 token 、链接名称和 URL,而查看的页面可能只有用户 token 和 URL。您首先关心的只是了解它发生的事实,以及推送您需要的任何绝对必要数据。

接下来,我们有一些简单的处理工作人员,通过要求它从列表末尾取出一个项目并将其移交给 Redis,将这些疯狂插入的信息从 Redis 手中夺走。工作人员可以进行正确归档数据所需的任何调整/重复数据删除/ID 查找,并将其移交给更永久的存储站点。尽可能多地启动这些工作人员,以保持 Redis 的内存负载可承受。你可以用任何你想要的方式(Node.js、C#、Java 等)编写 worker,只要它有一个 Redis 驱动程序(现在大多数 Web 语言都有)和一个用于你想要的存储(SQL、Mongo 等)。 )

MongoDB 擅长文档存储。与 Redis 不同,它能够处理大于 RAM 的数据库,并且它自己支持分片/复制。与基于 SQL 的选项相比,MongoDB 的一个优势是您不必拥有预先确定的架构,您可以随时随意更改数据的存储方式。

不过,我建议将 Redis 或 Mongo 用于保存数据以进行处理的“第一步”阶段,并使用传统的 SQL 设置(也许是 Postgres 或 MSSQL)来存储处理后的数据。跟踪客户行为对我来说听起来像是关系数据,因为您可能想要“向我展示查看此页面的每个人”或“此人在这一天查看了多少页面”或“哪一天的浏览者总数最多? ”。出于分析目的,您可能会想出更复杂的联接或查询,成熟的 SQL 解决方案可以为您完成大量此类过滤; NoSQL(特别是 Mongo 或 Redis)无法跨不同的数据集进行连接或复杂查询。

关于MongoDB 与 Redis 与 Cassandra 的快速写入临时行存储解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3010224/

相关文章:

node.js - Mongoose _id 在保存前受影响

javascript - promise -mongo : can't finalize promise

Cassandra 服务器抛出 java.lang.AssertionError : DecoratedKey(. ..) != DecoratedKey

c# - 希望优化 Redis 内存使用以缓存许多 JSON API 结果

java - 找不到类 org.springframework.data.mongodb.core.query.GeoCommand 的编解码器

mongodb - 如何使用 MongoDB 存储 ejabberd 消息?

java - 在同一服务的多个实例上操作数据库中的数据

cassandra - 选择与特定日期对应的 timeuuid 列

c# - ServiceStack Redis如何实现分页

ruby - EM :Connection (em-synchrony) 内的光纤