HyperLogLog,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是[1,2,3,4,5,6,7],总共有7个数; 就是去重之后的数据; HyperLogLog就是用来做去重
HyperLogLog ,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是 [1,2,3,4,5,6,7],总共有7个数; 就是去重之后的数据; HyperLogLog 就是用来做去重复统计的; bitmap 在做统计时,虽然使用的是 bit 来做记录,已经很节省空间了; 但是在随着数据量快速增长的情况下,bitmap 也是很占内存空间的; 而 HyperLogLog 就不同了,HyperLogLog 的每个 key 只占用 12kb 的内存, 就可以统计 2的64 次方个基数; 而且不会随着数据量的增多而变大,就是固定的 12kb; 这是因为 HyperLogLog 每次只会根据添加的数据去计算基数,而不保存添加的数据本身; 但这也造成了一个问题,就是 HyperLogLog 基数统计的准确率不是100%,会有 0.81% 的误差; 但对于亿级数据的统计,这点误差似乎可以忽略不计; 同样的,bitmap 记录数据本身,它的计算是精确的; 所有,也可以说 HyperLogLog 是一种概率计算,但是误差是很小的。 这是reidis作者写的关于HyperLogLog的文章 HyperLogLog 的使用也非常简单,就3个操作api 添加元素
重复数据不会被保存,返回的是0
合并得出的不会被储存,使用之后就会被删掉
pfmerge 合并多个key后,会生成一条 result 数据 然后再对 result 做 pfcount 操作
这时候拿到的值就是 上面3个key 计算出来的基数。 HyperLogLog 在 spring 里的使用也非常简单, pfadd 对应的是 .add() 操作; pfcount 对应的是 .size() 操作; pfmerge 对应的是 .union() 操作; 下面是使用的 Demo
|
2021-04-08
2021-10-03
2021-07-26
2019-10-11
2022-08-27