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

【Redis】 高级类型与布隆过滤器 原理+场景全解析

大家好,我是程序员二叉。


简介

本文详细讲解 Redis 四大高级功能:HyperLogLog、Bitmap、Geo、Stream,以及面试高频考点布隆过滤器。涵盖底层原理、使用场景、核心区别、实战要点,是后端进阶与面试必备干货。欢迎点赞收藏关注。


一、HyperLogLog:基数统计神器

1. 核心作用

只做一件事:统计一个集合中不重复元素的个数(基数统计)。
例如:统计网站 UV、独立访客数、每日活跃设备数。

2. 误差范围

  • 标准误差率:0.81%(极小误差)。
  • 内存占用:极小!每个 Key 最多占用12KB内存,无论统计 1000 条还是 10 亿条数据。

3. 优缺点

  • 优点:内存占用极低、速度极快、支持合并统计。
  • 缺点只能统计数量,不能获取原始数据,存在微小误差。

4. 核心命令

  • PFADD key element:添加元素
  • PFCOUNT key:统计基数

5. 适用场景

  • 页面UV(独立访客)统计
  • 日活、月活用户数(DAU/MAU)
  • 海量数据去重计数(不要求 100% 精确)

二、Bitmap 位图:二进制状态存储

1. 底层原理

  • 本质是一串连续的二进制数组(0 和 1),底层基于 String 实现。
  • 一个 bit 位代表一个状态,极大节省内存。
  • 1MB 内存 = 800 万 bit,可以记录 800 万个状态。

2. 核心命令

  • SETBIT key offset value:设置第 offset 位的值(0/1)
  • GETBIT key offset:获取状态
  • BITCOUNT key:统计有多少个 1

3. 经典场景:用户签到

  • Key 设计:sign:user:1001:202505
  • Offset:日期(1~31)
  • Value:1=已签到,0=未签到
  • 优势:一个用户一个月仅占用31 bit(约4字节)

4. 经典场景:统计活跃用户

  • Key 设计:active:20250501
  • Offset:用户 ID
  • 统计:BITCOUNT算出当日活跃人数。
  • 多日统计:BITOP做与/或运算,算出连续活跃天数。

三、Geo 地理位置:附近的人/店

1. 实现原理

  • 底层就是 ZSet(有序集合)
  • 使用GeoHash 算法将二维经纬度(经度、纬度)编码成一个分数 score。
  • 利用 ZSet 的排序特性,实现范围查找。

2. 核心命令

  • GEOADD key 经度 纬度 成员:添加位置
  • GEODIST key 成员1 成员2:计算距离
  • GEORADIUS key 经度 纬度 半径:查找附近元素

3. 适用场景

  • 附近的人、附近的门店
  • 外卖配送范围、网约车距离计算
  • 同城推荐

四、Stream:专业消息队列

1. 核心原理

Redis 5.0 专为消息队列设计的数据结构,支持:持久化、多消费者、消息回溯、堆积。

2. 核心概念

  1. 消息 ID(偏移量)

    • 格式:时间戳-序号(如 1712345678900-5)。
    • 全局唯一、单调递增,代表消息的偏移量(Offset)
    • 消费者通过 ID 确认消费位置,防止消息丢失。
  2. 消费组(Consumer Group)

    • 一个队列可以被多个消费组监听,各组互不影响
    • 同一组内消费者负载均衡,一条消息只会被组内一个消费者消费。
    • 内置待确认列表(pending),确保消息被成功处理。

3. 核心命令

  • XADD:生产消息
  • XREADGROUP:消费组消费
  • XACK:确认消息(标记已消费)

4. 优势

  • 消息持久化,重启不丢失。
  • 支持堆积,百万消息无压力。
  • 消费组 + 偏移量,实现可靠消息投递

五、Bitmap vs HyperLogLog 核心区别

特性BitmapHyperLogLog
存储内容存储具体状态(0/1)只存储统计算法,不存原始数据
精准度100% 精准有 0.81%误差
功能可查单个状态、统计总数只能查总数
内存取决于用户量(N bit)固定 12KB
典型场景签到、是否在线、状态标记UV、日活、去重计数

一句话总结

  • 需要查单个用户状态Bitmap
  • 只需要统计总人数且省内存HyperLogLog

六、布隆过滤器(Bloom Filter):缓存穿透杀手

1. 核心原理

  • 一个超大的二进制数组 + 多个哈希函数组成。
  • 添加元素时,通过多个 Hash 算法算出多个位置,把这些位置置为 1。
  • 查询元素时,检查这些位置是否全为 1

2. 优缺点

  • 优点:内存占用极小、查询速度 O(1)、判断存在性高效。
  • 缺点
    1. 有误判率:判断存在的,可能不存在(假阳性)。
    2. 无法删除:置 1 容易,清零难。

3. 误判问题

  • 一定会误判,但可以通过调大数组、增加 Hash 函数降低误判率。
  • 对策
    • 允许一定误判,容忍小概率错误。
    • 误判后请求数据库,数据库返回空则直接返回。

4. 核心使用场景

解决缓存穿透问题(大量查询不存在的数据,直接打穿到数据库)。

  1. 把数据库已存在的 ID提前放入布隆过滤器。
  2. 查询时先查过滤器:
    • 不存在 → 直接返回,不放行到数据库
    • 存在 → 再查缓存/数据库。

总结

  1. HyperLogLog:海量数据去重计数,省内存,有 0.81% 误差。
  2. Bitmap状态标记(签到/活跃),精准,存 0/1。
  3. Geo:基于ZSet + GeoHash,实现附近位置服务。
  4. Stream:专业MQ,靠偏移量定位,消费组负载均衡。
  5. 布隆过滤器:判断不存在绝对准确,防缓存穿透神器。
http://www.jsqmd.com/news/933828/

相关文章:

  • 从微软2013年十大技术博文看爆款内容创作法则与趋势洞察
  • KaOS分布式平台:智能建筑自动化的20年实践与优化
  • 降AIGC新时代来临!降AIGC工具终极测评与精准选型工具箱
  • 利用“并查集”快速判断当前边是否会构成环 → Kruskal算法
  • DataUp:轻量级开源工具,破解科研数据长尾困境
  • 告别环境配置烦恼:用VSCode插件一键搞定ESP32开发环境(IDF v5.2.1)
  • 128元线列阵分裂波束仿真工具:20kHz窄带下-15°~0°三角度主轴扫描与方向图生成
  • 构建支持跨平台统一清洗和向量化 大模型数据清洗中的去重与过滤机制 的高性能多模态数据框架系统
  • 告别电机乱抖!深入解析STC无刷电调PCB设计:为什么我的四层板比两层板稳定这么多?
  • 素数域中最小连续本原根对的存在性证明与高效搜索算法
  • ShaderGraph避坑指南:DDX/DDY导数节点与矩阵运算的常见误区与性能优化
  • 从Alto到云计算:查克·萨克的系统设计哲学与工程实践启示
  • 传感器介绍
  • 【LeetCode刷题日记】一篇搞懂回溯算法模板,附77.组合详解
  • 新手入门CTF MISC:从MoeCTF 2022真题手把手教你用010 Editor和zsteg
  • 2026新疆旅行社哪家靠谱口碑好?优质定制小包团旅行社优选推荐 - 栗子测评
  • 2026推荐新疆靠谱纯玩无购物旅行社:盘点新疆正规口碑好的优质旅行社 - 栗子测评
  • 从旋钮到菜单:EC11编码器在OLED屏幕交互中的实战应用(避坑指南)
  • .NET Gadgeteer:模块化硬件与C#托管代码的嵌入式快速原型开发平台
  • 钢琴左手弹什么?从低音谱号到实际演奏的保姆级指南(附常见误区纠正)
  • 2026年川西旅拍工作室推荐指南,综合口碑与服务分析,成都大咖视觉告诉你川西旅拍哪家好 - 栗子测评
  • TranslucentTB框架依赖终极解决方案:快速修复Microsoft.UI.Xaml缺失问题
  • SAP ABAP Web Service实战:从SE80到SOAMANAGER,手把手教你打通内外系统接口
  • 从Swagger文档到权限提升:一个真实API漏洞挖掘的完整复盘与避坑指南
  • 如何发起微信投票活动,小程序发起投票全步骤 - 投票小程序
  • 抖音内容批量下载全攻略:高效自动化工具助你轻松保存精彩瞬间
  • 告别TileMap!用Godot4.2手搓一个轻量级2D网格节点(附鼠标交互与高亮源码)
  • 2026年5月特氟龙高温胶带源头厂家推荐,加热圈/高温布/云母加热圈/特氟龙高温胶带,特氟龙高温胶带供应商怎么选择 - 品牌推荐师
  • 鸿蒙ArkTS实战:5分钟搞定阿里云通义千问API对接(附完整代码)
  • 51单片机红外遥控风扇仿真套件:Keil5源码+Proteus8.9双机收发演示+PWM调速与定时功能