# Redis 中常见的数据类型有哪些?
7 min read
Table of Contents
Redis 中常见的数据类型有哪些?
Redis 常见数据类型详解
【核心定义】
Redis 是一个基于内存的键值存储系统,它提供了多种数据结构类型,使得开发者能够超越简单的字符串操作,实现更复杂的数据模型和高效的操作。
【关键要点】
-
String(字符串)
- 本质:二进制安全的字符串,最大512MB
- 特性:可存储文本、数字、序列化对象;支持原子递增/递减操作
- 应用场景:缓存、计数器、分布式锁
-
Hash(哈希)
- 本质:键值对集合,类似编程语言中的Map
- 特性:适合存储对象;支持字段级操作,节省网络开销
- 应用场景:用户信息、商品详情等对象存储
-
List(列表)
- 本质:双向链表结构
- 特性:按插入顺序排序;支持两端插入/弹出;可做阻塞队列
- 应用场景:消息队列、最新消息列表、粉丝列表
-
Set(集合)
- 本质:无序且元素唯一的集合
- 特性:支持交集、并集、差集运算;快速判断元素是否存在
- 应用场景:共同好友、标签系统、抽奖去重
-
Sorted Set(有序集合)
- 本质:带权重的Set,每个元素关联一个分数
- 特性:按分数排序;支持范围查询;元素唯一但分数可重复
- 应用场景:排行榜、延迟队列、带权重的任务调度
-
Bitmaps(位图)
- 本质:基于String的位操作
- 特性:节省空间;支持位运算
- 应用场景:用户签到、活跃用户统计
-
HyperLogLog
- 本质:概率性数据结构
- 特性:固定12KB内存,可估算超大集合基数;误差率约0.81%
- 应用场景:UV统计、大规模去重计数
-
Geospatial(地理空间)
- 本质:基于Sorted Set的地理位置存储
- 特性:存储经纬度;支持距离计算、范围查询
- 应用场景:附近的人、地理位置服务
-
Stream(流)
- 本质:Redis 5.0引入的日志数据结构
- 特性:支持消息持久化、消费者组、消息回溯
- 应用场景:消息队列、事件溯源
【深度推导/细节】
1. 底层实现机制
- String:采用SDS(Simple Dynamic String)实现,相比C字符串具有O(1)长度获取、二进制安全、自动扩容等优势
- Hash:小数据量使用ziplist(压缩列表),大数据量使用hashtable
- List:早期版本使用ziplist或linkedlist,3.2版本后统一使用quicklist(ziplist的链表)
- Set:整数集合使用intset,其他使用hashtable
- Sorted Set:小数据量使用ziplist,大数据量使用skiplist+dict组合
2. 内存优化策略
- 编码转换阈值:
- Hash:元素数≤512且所有值≤64字节时使用ziplist
- List:元素数≤512且所有值≤64字节时使用ziplist
- Set:元素都是整数且数量≤512时使用intset
- Sorted Set:元素数≤128且所有值≤64字节时使用ziplist
3. 性能考量
- 时间复杂度:
- 大多数操作O(1):String的GET/SET、Hash的HGET/HSET
- 范围操作O(N):List的LRANGE、Sorted Set的ZRANGE
- 集合运算O(N):Set的SINTER、SUNION
【关联/对比】
Redis数据类型 vs 传统数据库
| 特性 | Redis数据类型 | 传统数据库表 |
|---|---|---|
| 查询方式 | 基于键或特定结构操作 | SQL查询 |
| 关联关系 | 无内置关联,需应用层处理 | 外键关联 |
| 事务支持 | 简单事务(MULTI/EXEC) | ACID事务 |
| 持久化 | 可选(RDB/AOF) | 强制持久化 |
Redis内部数据结构对比
| 数据类型 | 底层实现 | 适用场景 |
|---|---|---|
| String | SDS | 简单键值、计数器 |
| Hash | ziplist/hashtable | 对象存储、字段频繁更新 |
| List | quicklist | 队列、栈、时间线 |
| Set | intset/hashtable | 去重、集合运算 |
| Sorted Set | ziplist/skiplist+dict | 排行榜、范围查询 |
『面试官追问』
常见追问问题:
-
Redis的String类型为什么能存储多种格式的数据?
- Redis的String是二进制安全的,不关心内容格式,可以存储JSON、序列化对象、数字等
-
List和Stream在消息队列场景下如何选择?
- List适合简单队列,Stream适合需要消息持久化、消费者组、消息确认的复杂场景
-
HyperLogLog的误差率0.81%是怎么来的?
- 基于概率算法,使用16384个6位寄存器,标准误差为1.04/√m,其中m=16384
-
Sorted Set的跳表实现原理是什么?
- 多层索引结构,查询时间复杂度O(logN),空间复杂度O(N),支持快速范围查询
-
Redis 6.0新增了哪些数据类型特性?
- 无新增数据类型,但增强了现有类型的命令和性能
版本演进差异:
- Redis 3.2:引入quicklist优化List性能
- Redis 4.0:优化内存回收,支持模块化
- Redis 5.0:引入Stream类型
- Redis 6.0:多线程I/O,客户端缓存
- Redis 7.0:Function API,多部分AOF
选择建议:
- 缓存简单数据:String
- 存储对象:Hash
- 队列/栈:List
- 去重/集合运算:Set
- 排行榜/范围查询:Sorted Set
- 地理位置:Geospatial
- 消息队列:Stream
- 基数统计:HyperLogLog
每种数据类型都有其特定的应用场景和性能特征,正确选择数据类型是优化Redis性能的关键。