关于redis:redis-十redis之HyperLogLog

1次阅读

共计 1602 个字符,预计需要花费 5 分钟才能阅读完成。

redis 系列文章:
https://liudongdong.top/categ…
本篇起源:
https://liudongdong.top/archi…
公众号:雨中散步撒哈拉
备注:欢送关注公众号,一起学习,共同进步!

一、HyperLogLog 基数统计

HyperLogLog,上面简称为 HLL,它是 LogLog 算法的升级版,作用是可能提供不准确的去重计数。存在以下的特点:

  1. 代码实现较难。
  2. 可能应用极少的内存来统计巨量的数据,在 Redis 中实现的 HyperLogLog,只须要 12K 内存就能统计 2^64 个数据。
  3. 计数存在肯定的误差,误差率整体较低。标准误差为 0.81%。
  4. 误差能够被设置辅助计算因子进行升高。

略微对编程中的根底数据类型内存占用有理解的同学,应该会对其只须要 12K 内存就能统计 2^64 个数据而感到诧异。为什么这样说呢,上面咱们举下例子:

取 Java 语言来说,个别 long 占用 8 字节,而一字节有 8 位,即:1 byte = 8 bit,即 long 数据类型最大能够示意的数是:2^63-1。对应下面的 2^64 个数,假如此时有 2^63- 1 这么多个数,从 0 ~ 2^63-1,依照 long 以及 1k = 1024 字节的规定来计算内存总数,就是:((2^63-1) * 8/1024)K,这是很宏大的一个数,存储空间远远超过 12K。而 HyperLogLog 却能够用 12K 就能统计完。

1. pfadd 元素增加

将除了第一个参数以外的参数存储到以第一个参数为变量名的 HyperLogLog 构造中.

这个命令的一个副作用是它可能会更改这个 HyperLogLog 的外部来反映在每增加一个惟一的对象时预计的基数(汇合的基数).

如果一个 HyperLogLog 的预计的近似基数在执行命令过程中发了变动,PFADD 返回 1,否则返回 0,如果指定的 key 不存在,这个命令会主动创立一个空的 HyperLogLog 构造(指定长度和编码的字符串).

如果在调用该命令时仅提供变量名而不指定元素也是能够的,如果这个变量名存在,则不会有任何操作,如果不存在,则会创立一个数据结构(返回 1).

理解更多 HyperLogLog 数据结构,请查阅 PFCOUNT 命令页面.

返回值
integer-reply

如果 HyperLogLog 的外部被批改了, 那么返回 1, 否则返回 0 .

实例

127.0.0.1:6379> pfadd hll one two three four
(integer) 1
127.0.0.1:6379> pfadd hll five sex
(integer) 1
127.0.0.1:6379>

2. pfcount 元素统计(不反复统计)

Hyperloglog 是用来做基数统计的数据类型

假如有如下一个数据集 {1, 3, 5, 7, 9, 5},那么这个数据集的基数就是 {1, 3, 7, 9},基数即是值一个数据集中的不反复元素

返回值
integer-reply:

PFADD 增加的惟一元素的近似数量.

实例

127.0.0.1:6379> pfcount hll
(integer) 6

3. PFMERGE 元素合并

PFMERGE destkey sourcekey [sourcekey ...]
将多个 HyperLogLog 合并(merge)为一个 HyperLogLog,合并后的 HyperLogLog 的基数靠近于所有输出 HyperLogLog 的可见汇合(observed set)的并集.

合并得出的 HyperLogLog 会被贮存在指标变量(第一个参数)外面,如果该键并不存在,那么命令在执行之前,会先为该键创立一个空的.

返回值
simple-string-reply: 这个命令只会返回 OK.

127.0.0.1:6379> pfadd hll2 1 2 3 4
(integer) 1
127.0.0.1:6379> pfmerge hll3 hll hll2
OK
127.0.0.1:6379> pfcount hll3
(integer) 10
127.0.0.1:6379>
正文完
 0