如果我们统计不重复数据的数量,比如统计独立UV,我们会有如下方案:
原始方案:set
存储每个用户的id(字符串)
改进方案:bitmaps
存储每个用户状态(bit)
全新的方案:HyperLogLog
基数
首先我们来认识一下基数
{1,3,5,7,5,7,8} 基数集{1,3,5,7,8} 基数:5
Hyperloglog类型的基本操作
- 添加数据
pfadd key element [element...]
- 统计数据
pfcount key [key...]
- 合并数据
pfmerge destkey sourcekey [sourcekey...]
操作如下:
h11为key,随便起,001,002代表用户id,或者可以放ip地址、人名等都可以
相关说明
- 用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
- 核心是基数估算算法,最终数值存在一定误差
- 误差范围:基数估计得结果是一个带有0.81%标准错误的近似值
- 耗空间极小,每个hyperloglog key占用了12k的内存用于标记基数
- pfadd命令不是一次性分配12k内存使用,会随着基数的增加内存逐渐增大
- pfmerge命令合并后占用的存储空间为12k,无论合并之前数据是多少
一般使用场景
统计注册 IP 数
统计每日访问 IP 数
统计页面实时 UV 数
统计在线用户数
统计用户每天搜索不同词条的个数