redis HLL 误报太多

Ram*_*Ram 1 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";
Run Code Online (Sandbox Code Playgroud)

for*_*ack 5

HyperLogLog用于计算唯一项。它可以用很少的内存来计算大量的项目。但是,返回的基数不是精确的,而是近似于 a 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实现 a 。应该有一些开源项目。