一尘不染

redis HLL误报过多

redis

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

阅读 456

收藏
2020-06-20

共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
,它可以告诉您数据集中是否存在某个项目,且误判为假。Bloom Filter当然,您可以使用Redis 来实现。为此,应该有一些开源项目。

2020-06-20