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

Redis概率算法:HyperLogLog数学原理与高效基数统计实践

Redis概率算法:HyperLogLog数学原理与高效基数统计实践

【免费下载链接】redisRedis 是一个高性能的键值对数据库,通常用作数据库、缓存和消息代理。* 缓存数据,减轻数据库压力;会话存储;发布订阅模式。* 特点:支持多种数据结构,如字符串、列表、集合、散列、有序集等;支持持久化存储;基于内存,性能高。项目地址: https://gitcode.com/GitHub_Trending/re/redis

Redis 是一个高性能的键值对数据库,通常用作数据库、缓存和消息代理。其中,HyperLogLog 是 Redis 提供的一种概率算法,能够以极小的内存占用实现海量数据的基数统计,广泛应用于用户访问量统计、独立访客计数等场景。

什么是基数统计?

基数统计即计算集合中不重复元素的个数。例如统计网站的独立访客数(UV)、某个关键词的独立搜索次数等。传统方法需要存储所有元素并去重,当数据量达到百万甚至亿级时,内存消耗会变得非常巨大。

HyperLogLog 算法通过概率统计的方式,仅需约 12KB 内存就能估算接近 2^64 个元素的基数,且误差率控制在 0.81% 左右,完美解决了内存与精度的平衡问题。

HyperLogLog 的数学原理

核心思想:伯努利试验与极大似然估计

HyperLogLog 基于伯努利试验的概率特性:假设我们对一个随机数生成器进行多次独立试验,记录每次试验中首次出现连续 k 个 0 后跟着一个 1 的结果。通过观察这些结果的最大值,就能估算出试验的总次数。

在实际应用中:

  1. 将每个元素通过哈希函数映射为 64 位随机数
  2. 记录每个哈希值二进制表示中前导零的最大个数(记为k
  3. 基数估算公式:E = α * m² / Σ(2^(-k))
    • α是修正系数(Redis 中取值0.7213475204444817
    • m是寄存器数量(Redis 中使用 16384 个寄存器)

Redis 中的实现优化

Redis 对标准 HyperLogLog 算法做了多项优化:

  • 双模式存储:低基数时使用稀疏模式(Run-Length Encoding)节省空间,高基数时自动转为密集模式
  • 64位哈希:采用 MurmurHash64A 哈希函数,避免 32 位哈希的精度限制
  • 动态缓存:计算结果会缓存,避免重复计算

核心实现代码位于 src/hyperloglog.c,其中定义了两种存储结构:

struct hllhdr { char magic[4]; /* "HYLL" 魔术字 */ uint8_t encoding; /* HLL_DENSE 或 HLL_SPARSE */ uint8_t notused[3]; uint8_t card[8]; /* 缓存的基数估算值 */ uint8_t registers[]; /* 寄存器数组 */ };

Redis HyperLogLog 的使用方法

基本命令

  1. 添加元素PFADD key element [element ...]

    PFADD unique_visitors alice bob charlie
  2. 估算基数PFCOUNT key [key ...]

    PFCOUNT unique_visitors # 返回估算的独立用户数
  3. 合并多个 HyperLogLogPFMERGE destkey sourcekey [sourcekey ...]

    PFMERGE all_visitors unique_visitors_2023 unique_visitors_2024

内存占用对比

数据规模传统集合(Set)HyperLogLog
100万~160MB~12KB
1亿~1.6GB~12KB

实际应用场景

1. 网站UV统计

# 记录每个访问用户 PFADD daily_uv user1 user2 user3 ... # 获取当日UV PFCOUNT daily_uv

2. 搜索关键词去重

# 记录搜索关键词 PFADD search_terms "redis" "hyperloglog" "algorithm" # 获取独立关键词数量 PFCOUNT search_terms

3. 大数据量去重计数

当需要统计千万级甚至亿级数据的独立元素个数时,HyperLogLog 是最优选择。例如电商平台的商品浏览记录去重、广告曝光量统计等。

算法局限性与注意事项

  1. 概率估算:结果是近似值,误差约 0.81%,不适合需要精确计数的场景
  2. 无法获取具体元素:只能得到基数统计结果,无法获取原始元素
  3. 内存占用固定:无论数据量多少,均占用约 12KB 内存

总结

HyperLogLog 算法为 Redis 提供了高效的基数统计能力,通过巧妙的数学原理和工程优化,在仅使用 12KB 内存的情况下,就能处理接近 2^64 个元素的去重计数问题。这使得 Redis 在海量数据统计场景中表现出色,成为缓存、计数系统的理想选择。

掌握 HyperLogLog 的原理和使用方法,能帮助开发者在处理大数据量去重问题时,在内存占用和计算效率之间找到完美平衡。如需深入了解实现细节,可以查阅 Redis 源码中的 src/hyperloglog.c 文件。

【免费下载链接】redisRedis 是一个高性能的键值对数据库,通常用作数据库、缓存和消息代理。* 缓存数据,减轻数据库压力;会话存储;发布订阅模式。* 特点:支持多种数据结构,如字符串、列表、集合、散列、有序集等;支持持久化存储;基于内存,性能高。项目地址: https://gitcode.com/GitHub_Trending/re/redis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/510229/

相关文章:

  • 用Nunchaku FLUX.1 CustomV3做社交配图:快速生成小红书/朋友圈爆款图片
  • GLM-4-9B-Chat-1M在网络安全领域的应用:日志分析与威胁检测
  • 企业官网和电商平台的本质区别是什么?
  • Phi-3-vision-128k-instruct Java开发环境搭建:从JDK17到IDEA一站式配置
  • PyTorch 2.8 强化学习镜像:5分钟搞定Gym+Stable-Baselines3环境,告别依赖地狱
  • 告别Input.GetTouch!Unity Input System实现移动端手势交互(单指旋转+双指缩放)
  • 2026年口碑好的usb转dc电源线工厂推荐:纯铜芯dc电源线实力工厂怎么选 - 品牌宣传支持者
  • 零门槛实战:Teable开源协作平台本地化部署全攻略
  • 如何通过Deep Lake实现AI模型可解释性:存储训练数据与预测结果关联分析指南
  • Skills横空出世!AI开发进入“知识优先”时代,让AI真正“像专家一样工作”!
  • 如何用AI实现专业级歌声转换?3大核心步骤+5个避坑指南
  • AI 少儿英语 APP的开发
  • python基础学习笔记第七章——文件操作
  • 终极指南:如何用Jekyll Now打造一致的品牌配色方案
  • Dify工作流实战:如何用Qwen-Image插件打造个性化AI绘画工具(附提示词优化技巧)
  • Silero Models深度解析:如何用一行代码实现高质量语音合成与识别
  • 解决scikit-image中SSIM计算报错:win_size和channel_axis参数的正确用法
  • GCC 12+高阶防护配置全解析,深度解读-mllvm + 自定义Pass链如何让IDA Pro 8.3静态分析成功率暴跌至17%
  • GME-Qwen2-VL-2B-Instruct效果体验:AI编程助手如何理解代码截图并给出建议
  • 微信小程序分页优化实战:z-paging下拉刷新+上拉加载的5个性能提升技巧
  • Lychee-Rerank-MM实操手册:A/B测试框架集成与重排序效果归因分析
  • 无人机集群编队避障实战:Stress Matrix在仿射变换控制中的关键作用与避坑指南
  • 别再让ChatGPT瞎写了!8个拿来即用的SCI论文润色提示词(附避坑指南)
  • gazebo 中通过ppo 进行机械臂轨迹规划
  • Qwen2.5-VL-7B-Instruct快速上手:Streamlit轻量界面+对话历史管理教程
  • 文脉定序系统与卷积神经网络结合:多模态信息重排序初探
  • 终极Rails Girls Guides Web性能优化指南:提升Core Web Vitals的7个实用技巧
  • 代码产出“暴涨3倍”后,噩梦开始:凌晨2点线上出Bug,却没一个人能解释
  • Silero-Models与容器编排:构建现代化语音AI服务网格的终极指南
  • 【OpenClaw 全面解析:从零到精通】第008篇:龙虾如何思考——OpenClaw Agent 智能体循环机制深度解析