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。
每种结构都有对应的底层实现和适用场景,用错结构会导致性能灾难,用对结构可以几乎零成本解决复杂业务问题。

posted @ 2025-12-05 13:49  中登程序猿  阅读(0)  评论(0)    收藏  举报