【问题标题】:redis HLL too many false positivesredis HLL 误报太多
【发布时间】:2017-03-21 10:27:09
【问题描述】:

Hyperlog 日志是一种概率算法 根据 redis HLL 文档,我们可能会得到 0.81% 的错误,但我会得到 17-20% 的错误

我认为有问题.. 这是我的简单 perl 测试脚本。有没有错误

#!/usr/bin/perl -w                                                                                                                                                       
use Redis;
my $redis = Redis->new(server=>'192.168.50.166:6379') or die;
my $fp=0;
my $HLL="HLL";

$redis->del($HLL);
foreach my $i (1..10000) {
  my $s1 = $redis->pfadd($HLL,$i);
  if($s1 == 0){ 
    print "False positive on $i\n";
    $fp++;
  }
}
print "count of false positives $fp\n";

【问题讨论】:

  • hyperloglog 不是关于计算独特的事物,而您一遍又一遍地计算相同的事物吗?

标签: perl redis hyperloglog


【解决方案1】:

HyperLogLog 用于计数唯一项目。它可以用很少的内存计算大量的项目。但是,返回的基数并不精确,而是近似为 standard error。

0.81% 是standard error,而不是误报。对于您的实例,您可以调用 PFCOUNT HLL 以获取您放入 HyperLogLog 的唯一项目的大致数量。返回的数字应在[10000 * (1 - 0.81%), 10000 * (1 + 0.81%)] 的范围内。

PFADD 如果在执行命令后估计的基数发生了变化,则返回 1。否则返回 0。与false positive无关。

看来您需要的是一个Bloom Filter,它可以告诉您数据集中是否已经存在某个项目,并带有误报。当然,您可以使用 Redis 实现 Bloom Filter。并且应该有一些开源项目。

【讨论】:

  • 是的,我需要一个布隆过滤器,但作为服务器。因为我有多个
  • 是的,我需要一个布隆过滤器,但作为服务器。因为我有来自不同服务器的多个应用程序。他们都需要检查集合中是否存在特定元素。这必须非常有效,并且集合将持续 2-3 个月是否有现成的布隆过滤器服务器我可以使用
  • @Ram 正如我提到的,您可以使用 Redis 作为后端服务器来实现布隆过滤器。你可以用谷歌搜索开源项目。此外,使用 lua 脚本和 GETBIT 和 SETBIT 命令自行实现并不难。
  • 我一直在研究 redislabs 的实现,杜鹃过滤器似乎比布隆过滤器更好地进行存在检查。我的问题:在内存中使用过滤器是持久数据存储的好主意。应用程序需要,如果向特定用户发送通信,则不得在 90 天内向他发送同一类别
  • @Ram Redis 支持持久化。您可以使用RDB、AOF 或两者将数据写入磁盘,尽管如果 Redis 意外关闭,持久性可能会丢失一些数据。我认为您可以容忍一些错误,因为您使用的是布隆过滤器或布谷鸟过滤器。所以这不会是一个问题。有关 Redis 持久性的详细信息,请查看文档。
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多