1. 首页 > Redis教程 > 正文

Redis教程FG017-Redis HyperLogLog基数统计实战

本文档风哥主要介绍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操作命令

# 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 优化技巧

风哥提示:Redis HyperLogLog是一种非常节省内存的数据结构,适合统计大规模数据集的基数,如独立访客、活跃用户等。在实际应用中,需要根据业务需求合理设计HyperLogLog结构和操作策略。

# 优化技巧

## 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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息