Redis的数据结构特点和应用场景及优缺点
🚀 Redis 核心数据结构(结构特点 + 应用场景 + 优缺点)
Redis 本质是 数据结构服务器,所有性能和场景都是围绕这些结构展开的。
1️⃣ String(字符串)
👉 本质特点
- 底层结构为 SDS(Simple Dynamic String)
- 预分配、惰性空间释放
- 最大 512MB
- 可以存文本、数字、二进制(如图片、序列化对象)
👉 场景
- 缓存对象(序列化 JSON)
- 计数器(INCR、INCRBY)
- 分布式锁(setnx + EX + thread_id)
- Token / Session 缓存
👉 优点
- 操作 O(1),极快
- 内存开销低
👉 缺点
- 结构简单
- 大量小 key-value 会造成 key 过多
2️⃣ Hash(哈希)
👉 特点
- 类似 key-value 的小字典
- 适合存对象(如用户对象、商品对象)
底层:
- 小哈希:ziplist/zipmap(连续内存)
- 大哈希:hashtable(真正的哈希表)
👉 场景
- 用户信息
- 商品 SKU
- 动态字段容器(值不固定)
👉 优点
- 字段更新不会整体序列化
- 比 JSON 更节省空间
👉 缺点
- 哈希表扩容会导致瞬时阻塞(rehash)
- 大 Hash 的性能不如 String
3️⃣ List(列表)
👉 特点
- 双向链表 or ziplist(新版本用 quicklist)
- 有序,可从两端 push/pop
👉 场景
- 消息队列(lpush + brpop)
- 发布延迟处理任务
- 时间线(社交动态)
👉 优点
- 两端操作 O(1)
- 支持阻塞式操作(brpop)
👉 缺点
- 中间元素操作成本 O(n)
- 大量 list 会产生内存碎片
4️⃣ Set(无序集合)
👉 特点
- 底层为 hashtable 或 intset
- 自动去重
👉 场景
- 共同好友、共同爱好(交集)
- 黑名单
- 抽奖系统(随机取人)
👉 优点
- 去重成本为 O(1)
- 支持交并差集
👉 缺点
- 交集/差集时间复杂度偏高
- 大集合操作容易阻塞线程
5️⃣ Sorted Set(有序集合)
👉 特点
- 底层:跳表(skiplist) + hash
- 有序、可按 score 排序
- 支持范围查找
👉 场景
- 排行榜(经典应用)
- 消息 feed(按时间排序)
- 带权重的数据存储
👉 优点
- 范围查找超级强(topN)
- 有序队列首选结构
👉 缺点
- 内存消耗较大(跳表结构)
- 写入比普通结构慢(log n)
6️⃣ Bitmap(位图)
👉 特点
- 位级操作
- 极省内存(1 亿个用户的签到 = 12MB)
👉 场景
- 用户签到
- 布隆过滤器底层(bitmap)
- 活跃统计
👉 优点
- 空间利用率极高
- 天然 O(1) 读写
👉 缺点
- key 较大不容易管理
- 只能按 bit 操作,不适合复杂逻辑
7️⃣ HyperLogLog(基数统计)
👉 特点
- 只记录"数量",不记录内容
- 极低内存,每个 HLL 固定 12KB
👉 场景
- 独立访客 UV 统计
- 去重计数大数据(亿级)
👉 优点
- 内存使用极小
- 精度误差 <1%
👉 缺点
- 只能统计数量,无法反查
- 有概率误差
8️⃣ Stream(消息流)
👉 特点
- Redis 5 新结构
- 支持消费组
- 消息持久化到内存+磁盘(RDB/AOF)
👉 场景
- MQ 替代方案
- 日志收集
- 微服务事件总线
👉 优点
- 支持消费组
- 自动分段,消费 offset
👉 缺点
- 不如 Kafka 强大
- 大量消息时会占用内存
9️⃣ GEO(地理位置)
👉 特点
- 基于 Sorted Set
- 使用 geohash 存储位置
👉 场景
- 附近的人
- 店铺搜索
- 地图服务定位
👉 优点
- 距离查询简单高效
👉 缺点
- 精度有限
- 不适合高精度定位服务
🎯 整体总结表(面试高频)
| 数据结构 | 特点 | 典型场景 | 优点 | 缺点 |
|---|---|---|---|---|
| String | SDS、简单 | 缓存、计数器、Session | 快 O(1) | 太简单 |
| Hash | 字段容器 | 用户对象 | 局部更新 | rehash 阻塞 |
| List | 双向链表 | 队列、消息队列 | 操作 O(1) | 中间操作慢 |
| Set | 去重集合 | 标签、黑名单 | 交并差集 | 大集合耗费 CPU |
| Sorted Set | 跳表 | 排行榜、排序 | 有序查询强 | 内存高 |
| Bitmap | 位操作 | 签到、用户活跃 | 省内存 | 逻辑简单 |
| HLL | 去重计数 | UV | 超省内存 | 无法反查 |
| Stream | 消息队列 | 事件流 | 支持消费组 | 性能不如 Kafka |
| GEO | geohash | 附近的人 | 地理查询 | 精度一般 |
如果你要拿这个去面试
你可以这样装逼回答:
Redis 不是传统 KV,而是一个“内存数据结构服务器”。
它的优势不只是快,而是为不同业务场景提供高效的数据结构:
Hash 适合对象、SortedSet 适合排序排行榜、Bitmap 用于位级统计、Stream 可以做轻量 MQ。
每种结构都有对应的底层实现和适用场景,用错结构会导致性能灾难,用对结构可以几乎零成本解决复杂业务问题。
浙公网安备 33010602011771号