本文档风哥主要介绍Redis HyperLogLog类型的基数统计实战,包括HyperLogLog类型概念、HyperLogLog操作命令、HyperLogLog使用场景、HyperLogLog规划、内存使用、准确性考虑、基础操作、高级操作、统计操作、过期操作以及实战案例等内容,风哥教程参考Redis官方文档Data types guide等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 HyperLogLog类型概念
Redis HyperLogLog是一种用于统计基数(不重复元素数量)的数据结构,它使用概率算法来估计集合的基数。HyperLogLog类型的特点:
- 空间效率高:无论集合大小如何,都只需要约12KB的内存
- 时间效率高:添加元素和统计基数的时间复杂度都是O(1)
- 精度可控:标准误差约为0.81%
- 易于使用:提供了简单的操作命令
1.2 HyperLogLog操作命令
## 1. 基础命令
– PFADD:添加元素到HyperLogLog
– PFCOUNT:统计HyperLogLog的基数
– PFMERGE:合并多个HyperLogLog
## 2. 过期命令
– EXPIRE:设置HyperLogLog的过期时间
– TTL:查看HyperLogLog的剩余过期时间
– PERSIST:移除HyperLogLog的过期时间
1.3 HyperLogLog使用场景
HyperLogLog类型的使用场景:
- 独立访客统计:统计网站的独立访客数量
- 页面浏览量统计:统计页面的独立浏览量
- 用户活跃度统计:统计活跃用户数量
- 活动参与人数统计:统计活动的参与人数
- 商品浏览量统计:统计商品的独立浏览量
- 搜索关键词统计:统计独立搜索关键词数量
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 HyperLogLog规划
生产环境HyperLogLog规划:
- HyperLogLog命名规范:使用业务前缀+统计类型的方式,如page:uv
- 时间粒度:根据业务需求设计合理的时间粒度,如日、周、月
- 数据保留:根据业务需求设置合理的数据保留时间
- 过期时间:根据数据生命周期设置合理的过期时间
2.2 内存使用
- 无论集合大小如何,HyperLogLog只需要约12KB的内存
- 适合统计大规模数据集的基数
- 内存使用与集合大小无关,只与精度有关
- 相比Set类型,HyperLogLog在统计大规模数据集时内存使用要小得多
2.3 准确性考虑
## 1. 误差范围
– HyperLogLog的标准误差约为0.81%
– 对于大多数业务场景,这个误差是可以接受的
– 随着集合大小的增加,误差不会显著增大
## 2. 适用场景
– 适合需要统计大规模数据集基数的场景
– 适合对精度要求不是特别高的场景
– 不适合需要精确统计的场景
## 3. 精度与内存
– 标准HyperLogLog使用约12KB内存,误差约0.81%
– 可以通过调整内存使用来提高精度,但会增加内存消耗
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 基础操作
## 1. 添加元素到HyperLogLog
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240101 1001 1002 1003 1004 1005
# 输出示例
(integer) 1
## 2. 统计HyperLogLog的基数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240101
# 输出示例
(integer) 5
## 3. 添加更多元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240101 1006 1007 1008
# 输出示例
(integer) 1
## 4. 重新统计基数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240101
# 输出示例
(integer) 8
## 5. 添加重复元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240101 1001 1002 1003
# 输出示例
(integer) 0
## 6. 统计重复元素后的基数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240101
# 输出示例
(integer) 8
3.2 高级操作
## 1. 合并多个HyperLogLog
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240101 1001 1002 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240102 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240103 1005 1006 1007
# 合并到新的HyperLogLog
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:202401week page:uv:20240101 page:uv:20240102 page:uv:20240103
# 输出示例
OK
## 2. 统计合并后的基数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:202401week
# 输出示例
(integer) 7
## 3. 分别统计每天的基数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240101
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240102
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:20240103
# 输出示例
(integer) 3
(integer) 3
(integer) 3
3.3 统计操作
## 1. 统计不同时间粒度的独立访客
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240101 1001 1002 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240102 1002 1003 1004
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240103 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240104 1004 1005 1006
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:20240105 1005 1006 1007
# 合并为周数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:202401week page:uv:20240101 page:uv:20240102 page:uv:20240103 page:uv:20240104 page:uv:20240105
# 统计周独立访客
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:202401week
# 输出示例
(integer) 7
## 2. 统计多个页面的独立访客
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:home 1001 1002 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:product 1002 1003 1004
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:about 1003 1004 1005
# 合并为全站数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:site page:uv:home page:uv:product page:uv:about
# 统计全站独立访客
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:site
# 输出示例
(integer) 5
3.4 过期操作
## 1. 设置HyperLogLog的过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:temp 1001 1002 1003
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire page:uv:temp 300
# 输出示例
(integer) 1
(integer) 1
## 2. 查看HyperLogLog的剩余过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl page:uv:temp
# 输出示例
(integer) 299
## 3. 移除HyperLogLog的过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 persist page:uv:temp
# 输出示例
(integer) 1
## 4. 为每天的HyperLogLog设置过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire page:uv:20240101 604800
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire page:uv:20240102 604800
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire page:uv:20240103 604800
# 输出示例
(integer) 1
(integer) 1
(integer) 1
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 独立访客统计
## 1. 记录每天的独立访客
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd site:uv:20240101 1001 1002 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd site:uv:20240102 1002 1003 1004 1005 1006
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd site:uv:20240103 1003 1004 1005 1006 1007
## 2. 统计每天的独立访客数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount site:uv:20240101
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount site:uv:20240102
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount site:uv:20240103
# 输出示例
(integer) 5
(integer) 5
(integer) 5
## 3. 统计3天的总独立访客数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge site:uv:20240101-03 site:uv:20240101 site:uv:20240102 site:uv:20240103
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount site:uv:20240101-03
# 输出示例
(integer) 7
## 4. 设置过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire site:uv:20240101 604800
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire site:uv:20240102 604800
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire site:uv:20240103 604800
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire site:uv:20240101-03 2592000
# 输出示例
(integer) 1
(integer) 1
(integer) 1
(integer) 1
4.2 页面浏览量统计
## 1. 记录每个页面的独立浏览量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:home 1001 1002 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:product 1002 1003 1004 1005 1006 1007
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:cart 1003 1004 1005 1006 1007 1008
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd page:uv:checkout 1004 1005 1006 1007 1008 1009
## 2. 统计每个页面的独立浏览量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:home
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:product
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:cart
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:checkout
# 输出示例
(integer) 5
(integer) 6
(integer) 6
(integer) 6
## 3. 统计全站的独立浏览量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:site page:uv:home page:uv:product page:uv:cart page:uv:checkout
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:site
# 输出示例
(integer) 9
## 4. 分析用户浏览路径
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:path1 page:uv:home page:uv:product
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:path1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge page:uv:path2 page:uv:product page:uv:cart
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount page:uv:path2
# 输出示例
(integer) 7
(integer) 6
4.3 用户活跃度统计
## 1. 记录每天的活跃用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd user:active:20240101 1001 1002 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd user:active:20240102 1002 1003 1004 1005 1006
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd user:active:20240103 1003 1004 1005 1006 1007
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd user:active:20240104 1004 1005 1006 1007 1008
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd user:active:20240105 1005 1006 1007 1008 1009
## 2. 统计每天的活跃用户数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:20240101
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:20240102
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:20240103
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:20240104
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:20240105
# 输出示例
(integer) 5
(integer) 5
(integer) 5
(integer) 5
(integer) 5
## 3. 统计周活跃用户数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge user:active:202401week user:active:20240101 user:active:20240102 user:active:20240103 user:active:20240104 user:active:20240105
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:202401week
# 输出示例
(integer) 9
## 4. 统计月活跃用户数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge user:active:202401month user:active:202401week
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount user:active:202401month
# 输出示例
(integer) 9
4.4 活动参与人数统计
## 1. 记录活动参与用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd event:participants:20240101 1001 1002 1003 1004 1005
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd event:participants:20240101 1006 1007 1008 1009 1010
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd event:participants:20240101 1011 1012 1013 1014 1015
## 2. 统计活动参与人数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount event:participants:20240101
# 输出示例
(integer) 15
## 3. 记录多个活动的参与人数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd event:participants:20240102 1005 1006 1007 1008 1009 1010 1011 1012
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfadd event:participants:20240103 1010 1011 1012 1013 1014 1015 1016 1017
## 4. 统计每个活动的参与人数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount event:participants:20240101
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount event:participants:20240102
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount event:participants:20240103
# 输出示例
(integer) 15
(integer) 8
(integer) 8
## 5. 统计总参与人数
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfmerge event:participants:total event:participants:20240101 event:participants:20240102 event:participants:20240103
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 pfcount event:participants:total
# 输出示例
(integer) 17
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis HyperLogLog基数统计实战最佳实践:
- 命名规范:使用业务前缀+统计类型的方式,如page:uv,学习交流加群风哥微信: itpux-com
- 时间粒度:根据业务需求设计合理的时间粒度,如日、周、月
- 合理设置过期时间:根据数据生命周期设置合适的过期时间
- 合并操作:使用PFMERGE合并多个HyperLogLog,实现跨时间、跨维度的统计
- 监控内存使用:HyperLogLog内存使用固定,无需过多关注
- 精度考虑:了解HyperLogLog的误差范围,确保符合业务需求
5.2 常见问题
- 精度问题:HyperLogLog有0.81%的标准误差,对于大多数业务场景是可以接受的
- 内存使用:HyperLogLog内存使用固定,约12KB,适合大规模数据集
- 过期时间:合理设置过期时间,避免数据过期导致业务问题
- 合并操作:合并多个HyperLogLog时,注意数据的时间范围和业务含义
- 元素大小:HyperLogLog对元素大小不敏感,适合存储任意大小的元素
5.3 优化技巧
## 1. 设计优化
– 使用简短的HyperLogLog名称
– 合理设计时间粒度,如日、周、月
– 为不同的业务场景设计不同的HyperLogLog
– 考虑数据的生命周期,设置合理的过期时间
## 2. 操作优化
– 使用PFADD批量添加元素
– 使用PFMERGE合并多个HyperLogLog
– 避免频繁的PFCOUNT操作
– 使用管道批量执行操作
## 3. 性能优化
– 监控HyperLogLog的使用情况
– 合理规划数据保留时间
– 优化合并操作的执行时间
– 避免在高峰期执行大量的合并操作
## 4. 内存优化
– 利用HyperLogLog的空间优势,存储大规模数据集的基数
– 合理设置过期时间,自动清理过期数据
– 选择合适的内存淘汰策略
## 5. 监控优化
– 监控HyperLogLog的数量和大小
– 监控PFCOUNT和PFMERGE操作的执行时间
– 设置合理的告警机制
– 定期分析HyperLogLog的使用情况
通过本文档的学习,您应该掌握了Redis HyperLogLog类型的基数统计实战,能够在生产环境中合理使用HyperLogLog类型实现独立访客统计、页面浏览量统计、用户活跃度统计、活动参与人数统计等功能。在实际应用中,需要根据具体业务场景选择合适的操作命令和HyperLogLog设计,确保系统的可靠性和性能。
风哥提示:Redis HyperLogLog是一种非常节省内存的数据结构,适合统计大规模数据集的基数,如独立访客、活跃用户等。在实际应用中,需要根据业务需求合理设计HyperLogLog结构和操作策略。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
