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

【进阶篇】2.3 五分钟掌握Redis HyperLogLog 实战场景与性能调优

1. HyperLogLog 五分钟快速入门第一次接触HyperLogLog时我也被这个奇怪的名字吸引了注意力。这到底是什么神奇的数据结构简单来说它就是Redis提供的一个计数器但和我们熟悉的普通计数器完全不同。想象一下你要统计一个热门网站每天的独立访客数可能有上百万用户访问如果用传统方法记录每个用户ID内存消耗会非常惊人。而HyperLogLog的神奇之处在于无论来多少用户它永远只占用12KB内存我刚开始用的时候也半信半疑直到在一个日活300万的项目中实测发现它真的只用12KB就搞定了计数需求误差率还控制在1%以内。它的基本命令简单到令人发指# 添加元素 PFADD myloglog user1 user2 user3 # 获取估算值 PFCOUNT myloglog但要注意几个关键特性只能计数不能查询你无法知道某个用户是否已经存在自动去重重复添加同一个用户不会影响结果固定内存12KB封顶百万级数据和亿级数据占用空间相同2. 真实业务场景落地案例2.1 用户日活统计的实战优化去年我们团队接手一个社交APP的数据统计模块原系统用MySQL记录每个用户的每日访问数据量达到千万级后查询变得极其缓慢。改用HyperLogLog后性能提升了20倍。具体实现是这样的// Spring Boot中的典型实现 public void recordDailyLogin(String userId) { String today LocalDate.now().toString(); String key dau: today; redisTemplate.opsForHyperLogLog().add(key, userId); } public Long getDailyActiveUsers(String date) { String key dau: date; return redisTemplate.opsForHyperLogLog().size(key); }这里有个实用技巧键名设计采用dau:日期的格式既方便按日期统计又能用Redis的过期功能自动清理历史数据# 设置30天过期 EXPIRE dau:2023-08-01 25920002.2 广告曝光去重系统在广告投放系统中我们经常需要控制单个用户看到广告的次数。传统方案使用Set存储已曝光用户ID内存消耗随用户量线性增长。而改用HyperLogLog后内存占用变为恒定值。这里分享一个实际调优案例def record_ad_impression(ad_id, user_id): key fad:{ad_id}:impressions pipeline redis.pipeline() pipeline.pfadd(key, user_id) # 同时记录24小时内的曝光量 pipeline.expire(key, 86400) pipeline.execute()实测数据对比方案100万用户内存占用误差率QPSSet~80MB0%2kHLL12KB0.8%15k3. 性能调优深度解析3.1 误差控制的三重境界HyperLogLog的标准误差是0.81%但通过一些技巧可以进一步优化稀疏矩阵优化当计数较小时Redis会自动使用更紧凑的存储格式。我们做过测试在计数3000时实际误差会低于0.5%分片计数法把一个大Key拆分成多个小Key最后合并结果。比如# 分10个片 for i in {0..9} do PFADD myloglog:shard:$i ${user_id} done # 合并统计 PFCOUNT myloglog:shard:*这种方法可以将误差降到0.3%左右校准补偿建立误差对照表对特定区间的结果进行人工修正。我们在处理1亿数据时通过校准使最终误差稳定在0.2%以内3.2 海量数据下的特殊处理当处理十亿级数据时需要特别注意两个问题热点Key拆分某个HyperLogLog的写入QPS过高会导致Redis性能下降。我们的解决方案是采用二级分片第一层按用户ID哈希分片第二层按时间窗口分片每5分钟一个Key集群环境处理在Redis Cluster中多个HyperLogLog的合并操作(PFMERGE)必须保证所有Key在同一个slot。可以通过hash tag确保# 使用{}强制相同slot PFMERGE {myloglog}:all {myloglog}:part1 {myloglog}:part24. 高级技巧与避坑指南4.1 稀疏数据优化方案当数据量较小时HyperLogLog的实际内存占用可能比理论值更小。Redis内部会智能选择存储方式计数≤3000使用稀疏编码每个条目约6字节计数3000转为稠密编码固定12KB我们可以通过配置参数控制这个转换阈值# 设置稀疏编码最大元素数 CONFIG SET hll-sparse-max-bytes 100004.2 跨日统计的优雅实现很多业务需要同时查看当日和累计的UV数据。我们设计了一套高效方案public class UvCounter { // 记录当日数据 public void recordToday(String userId) { String todayKey uv: LocalDate.now(); redis.pfadd(todayKey, userId); } // 获取近7天UV public long getLast7DaysUv() { String[] keys IntStream.range(0, 7) .mapToObj(i - uv: LocalDate.now().minusDays(i)) .toArray(String[]::new); return redis.pfcount(keys); } // 持久化每日数据 Scheduled(cron 0 0 0 * * ?) public void archiveDailyData() { String yesterday LocalDate.now().minusDays(1).toString(); String archiveKey uv:archive: yesterday; redis.pfmerge(archiveKey, uv: yesterday); } }4.3 常见坑点排查清单误差突变当计数从稀疏转为稠密编码时误差可能突然增大。解决方案是预分配足够大的空间PFADD myloglog DUMMY_DATA PFREM myloglog DUMMY_DATA网络传输问题HyperLogLog结构在Redis集群间传输时可能出错。建议在跨机房场景下使用DUMP/RESTORE命令DUMP myloglog | redis-cli -h new_host -p 6379 -x RESTORE myloglog 0监控指标通过Redis命令可以获取内部状态# 查看内存使用 MEMORY USAGE myloglog # 获取内部编码类型 OBJECT ENCODING myloglog在最近的一次性能压测中我们对比了三种方案MySQL去重计数、Redis Set和HyperLogLog。结果令人震惊在统计1亿独立用户时HyperLogLog的内存消耗仅为其他方案的1/1000而查询速度快了50倍以上。当然这需要业务能够接受一定的误差范围。

相关文章:

【进阶篇】2.3 五分钟掌握Redis HyperLogLog 实战场景与性能调优

1. HyperLogLog 五分钟快速入门 第一次接触HyperLogLog时,我也被这个奇怪的名字吸引了注意力。这到底是什么神奇的数据结构?简单来说,它就是Redis提供的一个"计数器",但和我们熟悉的普通计数器完全不同。想象一下&#…...

Vue Router 嵌套路由的“斜杠”法则与路径设计避坑指南

Vue Router 嵌套路由的“斜杠”法则与路径设计避坑指南 在构建现代化的单页面应用(SPA)时,Vue Router 是事实上的路由标准。它强大而灵活,但其中一个细节——嵌套路由中路径(path)前的斜杠(/&am…...

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 你是不是也和我一样&…...

终极指南:如何使用League Akari英雄联盟工具实现游戏体验全面优化

终极指南:如何使用League Akari英雄联盟工具实现游戏体验全面优化 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 您是否厌倦了在英…...

从科幻小说到产品设计:如何用‘What-If’思维模型,提前5年预判技术趋势

科幻思维解码:用未来叙事重构产品创新逻辑 当科幻遇见产品:一场跨越时空的思维实验 1982年上映的《银翼杀手》描绘了2019年的洛杉矶街头全息广告与仿生人共存的世界,这个曾被视作天方夜谭的设定,如今在增强现实技术和人形机器人领…...

CCMusic可复现性保障:Dockerfile+requirements.txt+config.yaml三件套详解

CCMusic可复现性保障:Dockerfilerequirements.txtconfig.yaml三件套详解 1. 项目概述 CCMusic Audio Genre Classification Dashboard是一个基于Streamlit和PyTorch构建的高级音频分析平台。这个项目的独特之处在于它不采用传统的音频特征提取方法,而是…...

专业指南:如何快速重置Navicat Premium的macOS试用期

专业指南:如何快速重置Navicat Premium的macOS试用期 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 对于数据库开…...

别再用默认对齐了!C语言__attribute__((packed/aligned))实战避坑,手把手教你优化嵌入式内存布局

别再用默认对齐了!C语言__attribute__((packed/aligned))实战避坑指南 在嵌入式开发中,内存资源往往捉襟见肘。一个结构体多占几个字节,可能就意味着系统无法运行。但你是否知道,编译器默认的对齐规则可能正在悄悄浪费你宝贵的内存…...

企业级跨平台UI开发实战:深度解析Semi.Avalonia主题库的设计哲学与技术实现

企业级跨平台UI开发实战:深度解析Semi.Avalonia主题库的设计哲学与技术实现 【免费下载链接】Semi.Avalonia Avalonia theme inspired by Semi Design 项目地址: https://gitcode.com/gh_mirrors/se/Semi.Avalonia 在当今多平台应用开发的时代,开…...

如何快速使用RPGMakerDecrypter:解密RPG Maker加密资源的完整指南

如何快速使用RPGMakerDecrypter:解密RPG Maker加密资源的完整指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_m…...

告别官方Demo!用ESP32-CAM+Arduino IDE打造稳定人脸识别门禁(含SD卡存储避坑指南)

ESP32-CAM人脸识别门禁实战:从Flash崩溃到SD卡稳定存储的完整方案 当你在深夜调试ESP32-CAM人脸识别项目时,突然发现辛苦录入的20组人脸数据在重启后全部消失——这种崩溃体验我太熟悉了。官方Demo的Flash存储方案就像个定时炸弹,而本文将带你…...

差评管理不是伪需求:餐饮店最容易被忽视的一笔小生意

我是小杨,9年 Java 后端。 主业写系统,副业专门研究普通人今天就能开干的赚钱项目。 这个专栏只做一件事: 把一个赚钱思路,拆到你今天就能开始。 没有空话,只有4样东西: 我的判断 落地步骤 真实数据 踩坑记录 差评管理不是伪需求:餐饮店最容易被忽视的一笔小生意** 评…...

如何一键同步网易云音乐到Discord?完整免费教程指南

如何一键同步网易云音乐到Discord?完整免费教程指南 【免费下载链接】NetEase-Cloud-Music-DiscordRPC 在Discord上显示网抑云/QQ音乐. Enables Discord Rich Presence For Netease Cloud Music/Tencent QQ Music. 项目地址: https://gitcode.com/gh_mirrors/ne/…...

级联双二阶IIR滤波器设计与实现详解

1. 从零理解级联双二阶IIR滤波器设计在数字信号处理领域,IIR(无限脉冲响应)滤波器因其高效的频率选择特性而广受欢迎。但高阶IIR滤波器直接实现时,系数量化误差会导致严重的稳定性问题。级联双二阶(Biquad)…...

别再手动改参数了!Simulink模型参数初始化的3种高效方法(附InitFcn回调函数实战)

别再手动改参数了!Simulink模型参数初始化的3种高效方法(附InitFcn回调函数实战) 在复杂的Simulink模型开发中,参数初始化往往是工程师们最头疼的环节之一。想象一下这样的场景:你正在调试一个包含数十个滤波器的通信系…...

Nginx反向代理SSE长连接:配置优化与性能调优实战

1. 为什么需要Nginx反向代理SSE长连接 最近在做一个实时数据监控项目时,遇到了一个棘手的问题:当有大量客户端同时连接SSE服务时,后端服务器直接崩溃了。这让我意识到,像SSE这样的长连接服务,如果没有合适的代理层做缓…...

3分钟搞定B站视频下载:BiliDownloader终极免费解决方案

3分钟搞定B站视频下载:BiliDownloader终极免费解决方案 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 还在为无法下载B站视频而烦恼…...

AS2785 AC输入50-260V或DC输入20-450V 电流10mA,输出2.7V/3.3V/5V

1、方案名称:AS2785 AC输入50-260V或DC输入20-450V 电流10mA,输出2.7V/3.3V/5V2、品牌:紫源微(Zymicro)3、描述:AS2785是一款高性能线性稳压器,提供高达450V DC的非常宽的工作输入电压范围&…...

Bebas Neue字体终极指南:从快速安装到专业应用

Bebas Neue字体终极指南:从快速安装到专业应用 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue Bebas Neue字体是全球最受欢迎的几何无衬线字体之一,这款开源字体以其简洁现代的设计语言和…...

跨平台资源下载神器:5分钟掌握多平台内容批量获取技巧

跨平台资源下载神器:5分钟掌握多平台内容批量获取技巧 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容…...

原神模型导入终极指南:GIMI工具完整使用教程

原神模型导入终极指南:GIMI工具完整使用教程 【免费下载链接】GI-Model-Importer Tools and instructions for importing custom models into a certain anime game 项目地址: https://gitcode.com/gh_mirrors/gi/GI-Model-Importer 想要为《原神》角色打造独…...

解锁C语言中的多返回值技巧

在C语言编程中,常常会遇到需要从函数中返回多个值的情况。虽然C语言不直接支持多返回值,但我们可以通过一些技巧来实现这一目的。本文将详细探讨如何在C语言中返回多个值,并通过实例说明。 一、背景介绍 在C语言中,函数默认只能返回一个值。这对于需要处理多个结果的情况…...

ANSYS Workbench新手避坑:用BEAM188单元模拟工字钢悬臂梁,从建模到后处理完整流程

ANSYS Workbench新手避坑:用BEAM188单元模拟工字钢悬臂梁,从建模到后处理完整流程 工字钢悬臂梁在工程实践中极为常见,从建筑阳台到机械臂设计,这种结构几乎无处不在。对于刚接触有限元分析的工程师或学生来说,如何在A…...

避开Fluent计算崩溃:用这3种网格划分策略彻底解决floating error问题

避开Fluent计算崩溃:3种网格划分策略彻底解决floating error问题 在CFD仿真工程师的日常工作中,没有什么比看到"floating point error"这个报错更令人沮丧的了。这个看似简单的错误提示背后,往往隐藏着复杂的数值计算问题。根据我们…...

Jetson Nano上MediaPipe GPU加速实战:从编译到部署,让你的AI应用帧率翻倍

Jetson Nano上MediaPipe GPU加速实战:从编译到部署,让你的AI应用帧率翻倍 在嵌入式AI领域,Jetson Nano凭借其出色的GPU性能成为众多开发者的首选平台。然而,当我们将Google的MediaPipe框架部署到这块开发板上时,默认的…...

【豆包从入门到精通共10篇】007、多模态应用:图像理解与生成能力探索

007、多模态应用:图像理解与生成能力探索 从一次深夜调试说起 上周三凌晨两点,我被测试组的紧急电话叫醒:“你们那个图像描述接口,传了张电路板照片,返回的结果是‘一只猫在玩毛线球’。” 我瞬间清醒——这问题可太致命了。我们的模型在标准数据集上准确率明明有92%,怎…...

别再死记OSPF网络类型了!通过一个跨网段实验,彻底搞懂P2P和Broadcast的区别

从实验视角拆解OSPF网络类型:P2P与Broadcast的本质差异 在准备CCNA/CCNP认证的过程中,OSPF网络类型总是一个让人头疼的知识点。许多学习者习惯性地死记硬背各种类型的特性,却很少思考它们在实际网络中的行为差异。今天,我们将通过…...

Navicat重置试用期终极指南:3种方法彻底解决14天限制

Navicat重置试用期终极指南:3种方法彻底解决14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navic…...

数字信号处理:FIR与IIR滤波器原理与应用指南

1. 离散时间滤波器基础概念离散时间滤波器是数字信号处理系统的核心构建模块,它将输入序列通过数学运算转换为输出序列。从数学角度看,线性时不变(LTI)滤波器可以完全由常系数差分方程描述。这类系统具有两个关键特性:线性性:系统…...

如何在Linux上构建专业的Jellyfin媒体播放中心?

如何在Linux上构建专业的Jellyfin媒体播放中心? 【免费下载链接】tsukimi A simple third-party Jellyfin client for Linux 项目地址: https://gitcode.com/gh_mirrors/ts/tsukimi Tsukimi是一款专为Linux系统设计的第三方Jellyfin客户端,采用GT…...