【发布时间】:2012-06-21 03:49:56
【问题描述】:
大家好,提前致谢。 我是 NoSQL 游戏的新手,但我目前的工作地点要求我对一些大数据进行设置比较。
我们的系统有客户标签集和目标标签集。
标签是一个 8 位数字。
一个客户标签集最多可以有 300 个标签,但平均有 100 个标签
一个目标标签集最多可能有 300 个标签,但平均有 40 个标签。
预计算不是一种选择,因为我们正在为 10 亿用户的潜在客户群进行拍摄。
(这些标签是分层的,所以有一个标签意味着你也有它的父标签和祖先标签。暂时把这些信息放在一边。)
当客户访问我们的网站时,我们需要尽快将他们的标签集与一百万个目标标签集相交。客户集必须包含要匹配的目标集的所有元素。
我一直在探索我的选择,Redis 中设置的交集似乎是理想的。然而,我在互联网上的拖钓并没有透露需要多少内存才能容纳一百万个标签集。我意识到交叉路口会很快,但这是 Redis 的可行解决方案。
我意识到这是蛮力和低效的。我还想用这个问题来获得有关过去处理此类问题的方法的建议。如前所述,标签存储在树中。我也开始将 Mongodb 视为一种可能的解决方案。
再次感谢
【问题讨论】:
-
这是典型的存储/内存使用与处理时间的两难选择,不是吗?您可以计算标签更新的结果标签集、存储它并更快地提供它,或者在真正需要数据时进行动态计算。如果标签更新不常见,您可以考虑选择第一个选项,或者考虑使用集群数据库选项(例如,Clustrix)
-
谢谢。我应该指定的。我们目前预先计算,但如果我们作为一家公司取得成功,我们可能会寻找十亿潜在客户。我将审查 Clusterix
-
Mongodb 不提供集合交集。如果你有一些 RAM(比如 100+ GB),你可以在 redis 中存储相当多的键 :)
-
正如其他人所提到的,MongoDB 在快速交叉方面没有什么特别之处。 Redis 有很好的集合支持,但是对于快速交叉点没有什么特别的,例如 bitset 交叉点等。例如,查看 Lucene/Solr 的快速实现(您可以将其用作参考)。内存方面:1 百万标签是 1 百万比特,+ 一次包含 1 百万标签的哈希图。所以这应该是可行的:)。 +
-
Redis 具有高效的 intset 数据结构,多个集合的智能交集算法,如果需要可以使用 BITOP 命令操作位集 (redis.io/commands/bitop)
标签: mongodb redis bigdata nosql