redis HLL的误报太多了

时间:2017-03-21 10:27:10

标签: perl redis hyperloglog

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";

1 个答案:

答案 0 :(得分:3)

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。应该有一些开源项目。