Redis 不仅仅是一个“缓存数据库”,它还内置了多种高效、实用的高级数据结构,能够以极低的资源开销解决特定领域的复杂问题。本文将介绍三种经典结构:HyperLogLog(基数统计)、Bitmap(位图) 和 GEO(地理空间),并结合实际场景说明它们的独特价值。
1. HyperLogLog:亿级 UV 统计的“内存刺客”
📌 核心特点
- 固定内存消耗:无论存储 1 个还是 10 亿个元素,仅占用约 12 KB 内存。
- 高吞吐写入:
PFADD操作时间复杂度为 O(1)。 - 可接受误差:标准误差率约为 0.81%,适用于对精度要求不苛刻的统计场景。
🔧 基本命令
PFADD uv:20251115 user1 user2 user3 # 添加用户
PFCOUNT uv:20251115 # 获取估算 UV 数
PFMERGE uv:20251115 uv:20251114 # 合并两天数据
✅ 典型使用场景
- 网站/APP 日活(DAU)、月活(MAU)统计
- 广告曝光去重计数
- 大规模事件流中的唯一 ID 估算
💡 为什么不用 Set?
若用 Set 存储 1 亿用户 ID(每个 ID 8 字节),需约 800 MB 内存;而 HyperLogLog 仅需 12 KB —— 节省 99.99% 内存!
2. Bitmap:用“位”节省空间的极致优化
📌 核心特点
- 底层为 String,但按位操作,空间效率极高。
- 支持位运算(AND/OR/XOR/NOT),可用于多维度分析。
- 最大偏移量限制:
offset ≤ 2^32 - 1(约 42.9 亿位,即 512 MB)。
🔧 基本命令
SETBIT sign:202511:uid1001 14 1 # 用户 uid1001 在 11月15日(第14天)签到
GETBIT sign:202511:uid1001 14 # 查询是否签到
BITCOUNT sign:202511:uid1001 # 统计当月签到天数
✅ 典型使用场景
- 用户签到系统(365 天仅需 46 字节)
- 活跃度分析(如连续登录检测)
- 布隆过滤器(Bloom Filter)基础实现
- 权限位图(如 32 个功能权限用 4 字节表示)
💡 技巧:通过
BITOP合并多个用户签到记录,可快速计算“连续7天签到用户数”。
3. GEO:轻量级地理位置服务
📌 核心特点
- 基于 Sorted Set(ZSet) 实现,使用 GeoHash 编码经纬度。
- 支持 距离计算、范围查询、附近的人 等操作。
- 精度:约 0.6 米(对应 GeoHash 的 52 位编码)。
🔧 基本命令
GEOADD cities 116.40 39.90 beijing # 添加北京坐标
GEOADD cities 121.47 31.23 shanghai # 添加上海
GEODIST cities beijing shanghai km # 计算两城距离(单位:km)
GEORADIUS cities 116.40 39.90 100 km # 查找北京 100km 内城市
✅ 典型使用场景
- “附近门店/司机/用户”推荐
- 地理围栏(Geo-fencing)告警
- 物流路径预判或区域统计
⚠️ 注意:GEO 不支持直接删除单个元素(需通过
ZREM操作底层 ZSet),也不支持复杂地理拓扑(如多边形区域),复杂场景建议结合 PostgreSQL + PostGIS。
总结:如何选择?
| 需求 | 推荐结构 | 关键优势 |
|---|---|---|
| 亿级 UV 统计 | HyperLogLog | 极低内存 + 高吞吐 |
| 用户签到 / 权限位 | Bitmap | 空间极致压缩 + 位运算 |
| 附近的人 / 距离计算 | GEO | 开箱即用的地理查询 |
这些结构的共同特点是:用巧妙的算法设计,在有限资源下解决特定问题。它们不是“万能钥匙”,但在合适场景下,能让你的系统更轻、更快、更省。
📚 延伸阅读
- Redis 官方文档:Data Types
- 《Redis 设计与实现》—— 黄健宏
- GeoHash 算法原理:https://en.wikipedia.org/wiki/Geohash

被折叠的 条评论
为什么被折叠?



