1.04 / sqrt(16384) = 1.04 / 128 = 0.008125
所以这个计数的估算,是一个带有 0.81% 标准偏差的近似值 。
HyperLogLog 算法原理参考这两篇,写的很清晰:https://zhuanlan.zhihu.com/p/77289303http://www.javashuo.com/article/p-mmwxrmjm-ga.html
3 HyperLogLog所支持的能力HyperLogLog数据结构的命令有三个:PFADD、PFCOUNT、PFMERGE
3.1 PFADD 添加计数Redis Pfadd 命令将所有元素添加到 HyperLogLog 数据结构中 。
语法如下:
redis > PFADD key element [element ...]
下面举例了网站统计模块添加IP的两种情况
/* 对访问百度网站(key=baidu:ip_address)的IP进行添加 */redis> PFADD baidu:ip_address "192.168.0.1" "192.168.0.2" "192.168.0.3"(integer) 1/* 如果IP已经存在,则进行忽略,不对估计数量进行更新 */redis> PFADD baidu:ip_address "192.168.0.3"(integer) 0# IP已经存在
3.2 PFCOUNT 统计数量Redis Pfcount 命令返回给定 HyperLogLog 的基数的估算值 。语法如下:
redis > PFCOUNT key [key ...]
下面估算了访问IP的基数的值,返回 1034546。
redis> PFCOUNT baidu:ip_address(integer) 1034546
3.3 PFMERGE 合并统计Redis PFMERGE 命令将多个 HyperLogLog 合并为一个 HyperLogLog,合并后的 HyperLogLog 的基数估算值是对给定 HyperLogLog 进行并集计算得出的 。所以有重复的会被统计成一条数据 。合并得出的 HyperLogLog 会被储存在 destkey 键里面,如果该键并不存在,那么命令在执行之前,会先为该键创建一个空的 HyperLogLog。语法如下:
redis > PFMERGE destkey sourcekey [sourcekey ...]
下面演示了合并和统计的过程:
/* 统计百度 baidu:ip_address 访问IP */redis> PFADD baidu:ip_address "192.168.0.1" "192.168.0.2" "192.168.0.3"(integer) 1 /* 统计淘宝 taobao:ip_address 访问IP */redis> PFADD taobao:ip_address "192.168.0.3" "192.168.0.4" "192.168.0.5"(integer) 1/* 合并且去重之后放在 total:ip_address*/redis> PFMERGE total:ip_address baidu:ip_address taobao:ip_addressOK/* 结果为5 */redis> PFCOUNT total:ip_address(integer) 5
4 总结基数计数是用于统计一个集合中不重复的元素个数,好比平常需求场景有,统计页面的UV或者统计在线的用户数、注册IP数等 。HyperLogLog 主要基于Redis能力下的基数统计 。HyperLogLog的主要使用场景包括:
- 统计单日一个页面的访问量(PV),单次访问就算一次 。
- 统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次 。
- 多个key的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV 。
经验总结扩展阅读
- 1 Dive into TensorFlow系列-静态图运行原理
- 【k8s连载系列】2. k8s整体架构
- 深唇口红排行榜10强 显色度超好,深唇和黄皮必入系列
- 33 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取WebSocket数据包
- 华为mate40e参数_华为mate40e参数配置
- 从0到1搭建redis6.0.7续更~
- zk系列三:zookeeper实战之分布式锁实现
- 英雄联盟LOL钢铁瓦尔基里系列皮肤原画预览
- 从0到1搭建redis6.0.7
- Redisson源码解读-公平锁