我正在构建一个跟踪和验证广告展示次数和点击次数的系统。这意味着有很多插入命令(平均每秒约 90 个,峰值为 250 个)和一些读取操作,但重点是性能并使其速度极快。
该系统目前使用 MongoDB,但从那时起我就开始使用 Cassandra 和 Redis。采用这两种解决方案之一而不是继续使用 MongoDB 是一个好主意吗?为什么或者为什么不?
谢谢
对于这样的收获解决方案,我建议采用多阶段方法。 Redis 擅长实时通讯。 Redis 被设计为内存中键/值存储,并继承了内存数据库的一些非常好的优点:O(1) 列表操作。只要服务器上有可用的 RAM,Redis 就不会减慢推送到列表末尾的速度,这在您需要以如此极端的速率插入项目时非常有用。不幸的是,Redis 无法处理大于您拥有的 RAM 量的数据集(它只能writes到磁盘,读取用于重新启动服务器或系统崩溃的情况)并且扩展必须通过以下方式完成you and 你的申请。 (一种常见的方法是将密钥分布在众多服务器上,这是由一些 Redis 驱动程序实现的,尤其是 Ruby on Rails 的驱动程序。)Redis 还支持简单的发布/订阅消息传递,这有时也很有用。
在这种情况下,Redis 是“第一阶段”。对于每种特定类型的事件,您在 Redis 中创建一个具有唯一名称的列表;例如,我们有“查看页面”和“点击链接”。为简单起见,我们希望确保每个列表中的数据具有相同的结构;单击的链接可能具有用户令牌、链接名称和 URL,而查看的页面可能仅具有用户令牌和 URL。你首先关心的是了解事情发生的事实等等绝对有必要您需要的数据已推送。
接下来,我们有一些简单的处理工作人员,通过要求 Redis 从列表末尾取出一个项目并将其移交给 Redis,将这些疯狂插入的信息从 Redis 手中夺走。工作人员可以进行正确归档数据所需的任何调整/重复数据删除/ID 查找,并将其移交给更永久的存储站点。根据需要启动尽可能多的工作线程,以保持 Redis 的内存负载可以承受。您可以用任何您想要的语言(Node.js、C#、Java 等)编写工作程序,只要它有一个 Redis 驱动程序(现在大多数 Web 语言都有)和一个用于您所需存储的驱动程序(SQL、Mongo 等)。 )
MongoDB 擅长文档存储。与 Redis 不同的是,它能够处理大于 RAM 的数据库,并且它自己支持分片/复制。与基于 SQL 的选项相比,MongoDB 的优势在于您不必拥有预定的架构,您可以随时根据需要随意更改数据存储方式。
不过,我建议使用 Redis 或 Mongo 作为保存数据进行处理的“第一步”阶段,并使用传统的 SQL 设置(也许是 Postgres 或 MSSQL)来存储处理后的数据。对我来说,跟踪客户行为听起来像是关系数据,因为您可能想要“向我显示查看此页面的每个人”或“此人在这一天查看了多少页”或“哪一天的查看者总数最多? ”。您可能会出于分析目的而提出更复杂的连接或查询,成熟的 SQL 解决方案可以为您完成大量此类过滤工作; NoSQL(特别是 Mongo 或 Redis)无法跨不同数据集进行联接或复杂查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)