1. HyperLogLog 基础概念解析
1.1 什么是HyperLogLog
HyperLogLog是一种概率数据结构,用于估算集合的基数(即集合中不同元素的数量)。它由Philippe Flajolet等人在2007年提出,特别适合处理海量数据的去重计数问题。在Redis中,HyperLogLog通过PFADD、PFCOUNT和PFMERGE三个命令实现。
注意:HyperLogLog不是Redis独有的技术,但Redis的实现是目前应用最广泛的方案之一。
1.2 核心优势:空间效率
与传统SET结构相比,HyperLogLog最大的优势在于其极低的内存消耗。统计1亿个不重复元素时:
- SET结构:每个元素存储原始值,假设每个元素占20字节,总内存消耗约2GB
- HyperLogLog:固定使用12KB内存,与元素数量无关
这种空间效率的提升来自于其概率算法的本质——它不存储元素本身,而是通过数学方法估算基数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Redis中的HyperLogLog实现
2.1 基本命令解析
2.1.1 PFADD命令
php复制$redis->pfadd('uv', $userId);
功能:将一个或多个元素添加到HyperLogLog结构中。如果元素已经存在,则不会重复记录。
底层原理:
- 对元素进行哈希运算,得到64位哈希值
- 使用前14位确定要更新的寄存器(共16384个寄存器)
- 计算剩余50位中前导零的数量+1,更新对应寄存器值
2.1.2 PFCOUNT命令
php复制$uv = $redis->pfcount('uv');
功能:返回HyperLogLog的基数估算值。可以同时统计多个HyperLogLog的并集基数。
计算原理:
- 对所有寄存器值进行调和平均数计算
- 应用修正因子调整结果
- 最终得到基数估算值
2.2 内存结构详解
Redis的HyperLogLog实现使用16384个6位寄存器,总内存占用为:
16384 registers × 6 bits = 98304 bits = 12288 bytes ≈ 12KB
这种固定大小的结构意味着:
- 无论统计1千还是1亿个元素,内存占用不
