当前位置: 首页 > article >正文

【实战篇】三分钟掌握Redis HyperLogLog 在亿级流量下的UV统计

1. 为什么我们需要HyperLogLog想象一下你运营着一个日活千万的电商平台每天有海量用户浏览商品。老板突然问昨天有多少独立用户访问了我们的APP 如果你用传统方法比如用Redis的Set存储每个用户的ID那么存储1亿用户需要多少内存呢按照每个用户ID平均20字节计算至少需要2GB内存而使用HyperLogLog只需要12KB就能搞定误差还不到1%。我在实际项目中就遇到过这个场景。当时我们的用户增长团队需要实时查看各个渠道的UV数据最初使用Set结构存储结果Redis内存直接爆了。后来改用HyperLogLog不仅内存占用降到了原来的1/1000查询速度还快了好几倍。2. HyperLogLog的核心原理2.1 从抛硬币理解基数估计HyperLogLog的数学原理其实很有趣。我们可以用一个简单的抛硬币实验来理解连续抛硬币直到出现正面记录抛掷次数k。比如第一次就出现正面k1第三次才出现正面k3这个k值越大说明我们抛的次数越多。HyperLogLog就是利用这个原理通过哈希函数把每个用户ID转换成类似抛硬币的序列然后统计最大的k值来估算基数。2.2 Redis的具体实现Redis的HyperLogLog做了两个关键优化分桶机制使用16384(2^14)个桶把数据分散到不同桶中统计调和平均对各个桶的值进行调和平均减少极端值的影响具体存储结构非常节省空间每个桶只用6bit存储最大可以存63总共占用内存16384 * 6 / 8 12KB3. 亿级UV统计实战方案3.1 键设计的最佳实践在日活千万的场景下我推荐这样设计Redis键uv:{日期}:{业务线}:{渠道}例如uv:20230815:mobile:wechat微信渠道移动端UVuv:20230815:pc:directPC端直接访问UV这样的设计有三大优势支持按天统计和历史数据对比可以细分业务线分析方便做渠道效果评估3.2 处理数据倾斜问题在实际使用中我发现某些热门商品或频道的UV会特别高导致统计误差增大。我的解决方案是对特别热门的业务单独设置HyperLogLog键使用PFMERGE命令定期合并数据设置过期时间自动清理历史数据# 合并三天的数据 PFMERGE uv:3days:mobile uv:20230813:mobile uv:20230814:mobile uv:20230815:mobile3.3 误差分析与结果解读HyperLogLog的标准误差是0.81%但在实际使用中要注意当基数较小时相对误差可能较大合并多个HyperLogLog时误差会累积建议基数大于10000时使用效果最好我在项目中会这样处理误差对精确度要求高的场景配合使用采样计算校准在展示数据时注明约字如UV约1,245,000重要决策数据会进行二次验证4. 性能对比HyperLogLog vs Set4.1 内存占用实测我用1000万用户数据做了对比测试数据结构内存占用误差率Set200MB0%HyperLogLog12KB0.81%可以看到内存节省了99.99%这对于内存成本敏感的业务简直是福音。4.2 吞吐量对比在同样配置的Redis实例上操作类型Set QPSHyperLogLog QPS添加元素8,00015,000查询基数10,00050,000HyperLogLog的查询性能优势特别明显非常适合实时统计场景。5. 高级应用场景5.1 用户留存率计算利用PFMERGE可以巧妙计算留存率# 计算次日留存 PFADD day1 user1 user2 user3 PFADD day2 user2 user3 user4 PFMERGE temp day1 day2 PFCOUNT temp # 总用户数 PFCOUNT day1 # 首日用户数 PFCOUNT day2 # 次日用户数留存率 (首日用户数 次日用户数 - 总用户数)/首日用户数5.2 跨维度统计分析我们可以组合多个HyperLogLog来做交叉分析# 计算使用iPhone的微信用户数 PFMERGE iphone_wechat_users wechat_users iphone_users PFCOUNT iphone_wechat_users6. 踩坑经验分享在使用HyperLogLog的过程中我遇到过几个典型问题热点key问题某个频道的UV突然暴涨导致统计不准解决方案对超高频访问拆分子key时间窗口问题需要统计最近30分钟UV解决方案每分钟一个key用PFMERGE合并最近30个数据迁移问题HyperLogLog不支持RDB压缩解决方案迁移时改用AOF格式客户端兼容问题某些语言的Redis客户端不支持HyperLogLog解决方案使用原生命令或者升级客户端7. 生产环境调优建议根据我的经验在亿级流量下使用HyperLogLog要注意Redis配置优化# 适当增大内存限制 config set maxmemory 4gb # 设置合理的淘汰策略 config set maxmemory-policy allkeys-lru监控指标关注PFADD/PFCOUNT的耗时监控HyperLogLog内存增长情况设置基数异常波动告警数据持久化# 每小时保存一次 config set save 3600 1集群方案对不同的业务线使用不同的Redis实例考虑使用Redis Cluster分散压力

相关文章:

【实战篇】三分钟掌握Redis HyperLogLog 在亿级流量下的UV统计

1. 为什么我们需要HyperLogLog? 想象一下你运营着一个日活千万的电商平台,每天有海量用户浏览商品。老板突然问:"昨天有多少独立用户访问了我们的APP?" 如果你用传统方法,比如用Redis的Set存储每个用户的ID&…...

扫描PDF OCR后目录乱成一团?手把手教你用正则表达式在EditPad里批量整理

扫描PDF OCR后目录乱码修复实战:用正则表达式重构层级结构 当你费尽周折完成扫描版PDF的OCR识别后,最令人崩溃的莫过于发现自动生成的目录变成了一锅乱炖——数字"1"被识别成小写字母"l",章节编号与标题分离,…...

Spring Boot 4.0 Agent-Ready架构不是噱头:实测插件加载耗时<17ms、内存开销<0.8%,但93%开发者仍用错--你中招了吗?

第一章:Spring Boot 4.0 Agent-Ready 架构插件下载与安装概览Spring Boot 4.0 引入了原生支持 Java Agent 的运行时架构,使可观测性、安全增强与无侵入式性能分析成为开箱即用的能力。Agent-Ready 并非独立组件,而是内建于启动器(…...

Matlab 2016 Simulink仿真:统一电能质量变换器(UPQC)的ip-iq检测与...

统一电能质量变换器(UPQC)Matlab/simulink仿真,ip-iq检测,电压电流补偿,软件版本matlab2016最近在实验室折腾统一电能质量变换器(UPQC)的仿真,发现Matlab2016的Simulink真是个好东西…...

STM32F4串口接收ATGM336H GPS数据,手把手教你解析NMEA协议并转换经纬度格式

STM32F4与ATGM336H GPS模块实战:从硬件连接到NMEA协议解析 当你第一次拿到ATGM336H GPS模块和STM32F4开发板时,可能会对如何获取准确的经纬度数据感到困惑。本文将带你从硬件连接到软件解析,一步步实现GPS数据的完整处理流程。不同于简单的数…...

别光画点线了!用OpenGL+OpenCV把绘图结果保存成图片文件

从OpenGL绘图到图像文件:高效保存渲染结果的实战指南 在计算机图形学项目中,我们经常需要将OpenGL实时渲染的图形保存为标准的图像文件。无论是为了生成演示材料、制作实验报告,还是为了后续的图像处理分析,掌握这一技能都至关重要…...

在Petalinux里像操作内存一样控制FPGA逻辑:ZYNQ7020 AXI_EMC Linux驱动开发指南

在Petalinux中实现用户空间直接操控FPGA逻辑:ZYNQ7020 AXI_EMC开发实战 当我们需要在ZYNQ平台上实现PS与PL的高效交互时,传统的内核驱动开发模式往往会成为性能瓶颈。想象一下这样的场景:你的FPGA逻辑需要实时响应来自Linux应用层的控制信号&…...

从棋盘格到3D坐标:一文搞懂相机内参/外参/畸变参数在Ubuntu+ROS下的标定原理与实战

从棋盘格到3D坐标:深度解析相机标定参数体系与ROS实战应用 当我们需要让机器"看见"并理解三维世界时,相机标定就像是为机器视觉系统配上一副精准的眼镜。想象一下,当你戴上度数不匹配的眼镜时,世界会变得扭曲模糊——未…...

ExplorerPatcher终极指南:5分钟让Windows 11重获经典操作体验

ExplorerPatcher终极指南:5分钟让Windows 11重获经典操作体验 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 如果你对Windows 11的…...

Node.js + Angular + WebSocket:FUXA企业级工业可视化监控系统架构设计

Node.js Angular WebSocket:FUXA企业级工业可视化监控系统架构设计 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA FUXA是一款基于Web的开源SCADA/HMI系统&…...

重构设计协作工作流:智能矢量格式转换引擎的完整技术解析

重构设计协作工作流:智能矢量格式转换引擎的完整技术解析 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 设计文件格式转换的技术…...

DistroAV终极指南:5步构建专业级网络视频传输系统

DistroAV终极指南:5步构建专业级网络视频传输系统 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV(原OBS-NDI)是专为OBS Stud…...

从富士康到华强北:一文看懂EMS电子制造服务如何重塑你的产品供应链

从富士康到华强北:EMS如何重构智能硬件供应链的底层逻辑 当一款智能手表从设计图纸变成消费者手腕上的产品,中间究竟经历了多少隐形环节?我曾亲眼见证深圳一家创业团队的首批IoT设备交付:原计划6个月的开发周期,因为元…...

如何快速掌握Discord隐藏频道查看技巧:ShowHiddenChannels完整指南

如何快速掌握Discord隐藏频道查看技巧:ShowHiddenChannels完整指南 【免费下载链接】return-ShowHiddenChannels A BetterDiscord plugin which displays all hidden channels and allows users to view information about them. 项目地址: https://gitcode.com/g…...

Kubernetes Pod安全实战:别再让容器用root乱跑了,手把手教你配置SecurityContext的runAsUser

Kubernetes安全实践:彻底告别容器root权限的5种防御策略 凌晨三点,某电商平台的数据库突然被清空。调查发现,攻击者通过一个以root权限运行的Redis容器,利用挂载的宿主目录权限漏洞植入了挖矿程序。这不是虚构情节——2022年CNCF安…...

有限状态机(FSM)原理与应用实例解析

1. 有限状态机基础概念解析有限状态机(Finite State Machine,FSM)是描述离散动态系统的数学模型,它通过有限的状态集合和状态之间的转移来刻画系统行为。想象一下自动售货机的工作原理——它根据投币金额和用户选择,在…...

手把手教你用华为/华三交换机配置M-LAG(含Peer-Link与Keepalive避坑指南)

华为/华三交换机M-LAG实战配置与排错全指南 在数据中心和园区网络的高可用架构设计中,M-LAG(Multichassis Link Aggregation Group)技术已经成为构建双活系统的首选方案。不同于传统的堆叠技术,M-LAG实现了真正的跨设备链路聚合&a…...

HCPL-0453,高速、高CMR工业级数字光耦

简介今天我要向大家介绍的是 ABroadcom 的光耦——HCPL-0453。它是一款采用8引脚小外形(SO-8)封装的工业级、高共模抑制(CMR)高速数字光耦。它被设计用于在输入和输出之间提供最大程度的交流与直流电气隔离,能够在 0C …...

Visual C++运行库终极指南:一键解决Windows软件依赖难题

Visual C运行库终极指南:一键解决Windows软件依赖难题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 当您打开期待已久的游戏或专业软件时&#xff…...

d2dx:重塑经典暗黑2的现代游戏体验革新

d2dx:重塑经典暗黑2的现代游戏体验革新 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 在数字游戏遗产的复兴浪潮…...

如何用VoiceFixer一键修复受损语音?AI音频修复完全指南

如何用VoiceFixer一键修复受损语音?AI音频修复完全指南 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer VoiceFixer是一款基于深度学习的通用语音修复工具,专为处理各类音频质量…...

Win10/Win11 永久关闭 Windows 更新|不弹窗、不强制升级,官方亲测方法

Windows 自动更新常常在办公、游戏、网课等关键时候突然弹窗,甚至强制重启,不仅打断工作流,还可能因更新导致驱动冲突、软件闪退、系统卡顿。很多用户想彻底关闭更新,却苦于系统设置只能临时暂停,网上的方法要么无效&a…...

如何在OBS Studio中实现专业级NDI网络视频传输:DistroAV完全指南

如何在OBS Studio中实现专业级NDI网络视频传输:DistroAV完全指南 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi DistroAV(原名OBS-NDI&#xff0…...

告别U盘拷贝!一根网线搞定开发板文件传输:Ubuntu 22.04下TFTP服务器保姆级搭建与避坑指南

嵌入式开发者的文件传输革命:Ubuntu 22.04下TFTP服务器深度配置指南 在嵌入式开发的世界里,时间就是生命线。当你在调试一个需要反复修改的程序时,每次都要拔下U盘、拷贝文件、再插回开发板的繁琐流程,不仅打断了你的思路&#xf…...

Mac Mouse Fix终极实战指南:从普通鼠标到专业级触控板体验

Mac Mouse Fix终极实战指南:从普通鼠标到专业级触控板体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款革命…...

从‘毛玻璃’到‘小钢珠’:揭秘PCB铜箔粗糙度建模的认知升级与Huray方程前世今生

从‘毛玻璃’到‘小钢珠’:PCB铜箔粗糙度建模的认知革命 在高速电路设计中,信号完整性的维护犹如在风暴中保持灯塔的稳定发光。当我们把信号传输速度推向GHz级别时,PCB铜箔表面那些肉眼不可见的微观起伏,突然变成了吞噬信号能量的…...

基于Pixhawk 6C的模块化无人机数据采集平台设计与实现

1. 项目概述:基于Pixhawk 6C的模块化无人机数据采集平台 这个项目源于我多年对小型无人机自主控制系统的探索。从早期的Erle Robotics时代开始,我就被机载计算和自主飞行的可能性深深吸引。如今,通过Pixhawk 6C飞控、M10 GPS模块和915MHz数传…...

Flutter桌面端:解锁原生渲染性能的Native窗口融合方案

1. 为什么需要Native窗口融合方案? 用Flutter开发桌面端应用时,视频渲染一直是个头疼的问题。我做过不少Flutter视频项目,最开始用Texture方案,发现性能总差那么一口气;后来改用CustomPainter,结果格式兼容…...

如何用Qwerty Learner打造高效双语键盘肌肉记忆系统

如何用Qwerty Learner打造高效双语键盘肌肉记忆系统 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gitcode.com/GitH…...

信号处理中的自相关函数与功率谱分析

1. 信号分析的双重视角:时域与频域表征在信号处理领域,我们通常通过两种互补的方式来描述信号特性:时域表征和频域表征。时域表征直接展示信号幅度随时间的变化,而频域表征则揭示信号能量在不同频率上的分布。对于确定性信号&…...