redis HLL 误报太多
redis HLL too many false positives
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
用于计算唯一项目。它可以用很少的内存来计算大量的项目。但是,返回的基数不是精确的,而是近似于 standard error
.
0.81% 是 standard error
,不是误报。对于您的实例,您可以调用 PFCOUNT HLL
来获取您放入 HyperLogLog
中的唯一项目的近似数量。返回的数字应在 [10000 * (1 - 0.81%), 10000 * (1 + 0.81%)]
.
范围内
PFADD
returns 1 如果估计的基数在执行命令后发生变化。它returns 0,否则。与false positive
.
无关
看来你需要的是一个Bloom Filter,它可以告诉你一个项目是否已经存在于数据集中,并带有误报。当然,您可以使用 Redis 实现 Bloom Filter
。应该有一些开源项目。
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
用于计算唯一项目。它可以用很少的内存来计算大量的项目。但是,返回的基数不是精确的,而是近似于 standard error
.
0.81% 是 standard error
,不是误报。对于您的实例,您可以调用 PFCOUNT HLL
来获取您放入 HyperLogLog
中的唯一项目的近似数量。返回的数字应在 [10000 * (1 - 0.81%), 10000 * (1 + 0.81%)]
.
PFADD
returns 1 如果估计的基数在执行命令后发生变化。它returns 0,否则。与false positive
.
看来你需要的是一个Bloom Filter,它可以告诉你一个项目是否已经存在于数据集中,并带有误报。当然,您可以使用 Redis 实现 Bloom Filter
。应该有一些开源项目。