【问题标题】:Bloom Filter of MongoDB ids in Redis and GoRedis 和 Go 中 MongoDB id 的布隆过滤器
【发布时间】:2014-04-02 00:31:45
【问题描述】:

我正在处理文章建议。他们有很多。想想 YouTube 视频建议。为了避免再次推荐文章,我想记住特定用户已经看过哪些文章。我有很多用户,我也想避免无限增长的历史数据库。

每篇文章都有MongoDB ObjectId。我使用 Redis 和 Go 语言。

我认为布隆过滤器可以解决这个问题,因为在这种情况下误报是可以的。我想避免误报,但这不是 100% 强制性的。

我不知道在这个领域有任何合理的替代布隆过滤器的方法。我应该吗?

我在 Go 中找不到用于 Redis 的 Bloom Filter 的任何实现。有人可以建议我这是最好的选择吗,我该如何编写自己的或者是否有任何现有的实现?

【问题讨论】:

标签: go redis bloom-filter


【解决方案1】:

对于任何偶然发现这篇文章的人,如果您在这种情况下使用 Redis,那么您可能想要使用它的HyperLogLog feature; Antirez 详细地写了这篇文章here。无需弄清楚如何在 Redis 中制作布隆过滤器,它内置了同样出色的功能(它还可以告诉您大约插入了多少项)。

【讨论】:

  • Redis 没有提供用于查询项目是否已插入到 hyperloglog 中的命令,这是有充分理由的——hyperloglog 根本不适合这样做!对于相同的空间,它们的准确率远低于 Bloom 过滤器。 Hyperloglogs 有利于“计数不同”,但这不是这个问题的意义所在。
  • @hobbs,如果我错了,请随时纠正我,但不能使用 PFADD 命令的结果来判断特定项目(在这种情况下是 youtube 视频)是否已放在hyperloglog 中?返回值指示执行命令后近似基数是否发生变化。如果基数没有改变,则可以安全地假设该项目已添加到集合中。
  • 1.这不允许在不添加的情况下进行探测。 2. hyperloglog 不是为这种技术设计的。你是对的,添加一个已经添加的项目不会改变 HLL 的状态,但是添加一个新项目 also 通常不会改变状态(概率随着添加的项目增加)。如果您使用临时副本来处理第 1 点,我知道您如何可以那样使用它,但我认为由于第 2 点,误报性能会非常糟糕。布隆过滤器更好。
  • 自此发布以来的 2 年中,Redis 现在似乎已通过 modules 支持此功能。
【解决方案2】:

正如@jumand 提到的,Redis 有一个名为 RedisBloom 的模块,它提供了 Bloom Filter、Cuckoo Filter、Count-Min Sketch 和 TopK 服务。

http://redisbloom.io

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多