Redis 是一个基于内存的高性能键值存储系统,支持多种数据结构,每种数据结构在底层实现、性能特点、使用场景上都有差异。本文将详细介绍 Redis 支持的数据结构 及其 特点。
1. String(字符串)
简介
- 最基本的数据类型,二进制安全。
- 既可以是字符串,也可以是数字(整型/浮点型)。
- 最大长度:512 MB。
常用命令
命令 | 说明 |
---|
SET key value | 设置值 |
GET key | 获取值 |
INCR key | 值加 1(数字) |
DECR key | 值减 1(数字) |
APPEND key value | 追加内容 |
MGET key1 key2 ... | 批量获取 |
底层实现
- SDS(Simple Dynamic String):可动态扩容,避免缓冲区溢出。
- 支持整数值直接存储为
int
类型(节省空间)。
特点
- 操作简单,性能高(O(1))。
- 适合存储:缓存对象、计数器、分布式锁、短字符串。
2. List(列表)
简介
- 有序、可重复的字符串序列。
- 双端操作(从左、右两端 push/pop)。
- 最大元素数:2^32 - 1。
常用命令
命令 | 说明 |
---|
LPUSH key value1 [value2...] | 从左插入 |
RPUSH key value1 [value2...] | 从右插入 |
LPOP key | 从左弹出 |
RPOP key | 从右弹出 |
LRANGE key start stop | 获取范围内元素 |
BLPOP key timeout | 阻塞弹出 |
底层实现
- 早期:ziplist(压缩列表)或 linkedlist(双向链表)。
- Redis 3.2+:统一用 quicklist(压缩列表 + 链表结合)。
特点
- 按插入顺序排序,适合消息队列、任务队列。
- 插入和弹出为 O(1),随机访问为 O(n)。
3. Hash(哈希表)
简介
- 键值对集合,适合存储对象(类似
Map
)。 - 最大 field 数量:2^32 - 1。
常用命令
命令 | 说明 |
---|
HSET key field value | 设置字段值 |
HGET key field | 获取字段值 |
HMGET key field1 field2 | 批量获取 |
HDEL key field | 删除字段 |
HGETALL key | 获取所有字段和值 |
底层实现
- ziplist(压缩列表):当 field 数少且 value 短。
- hashtable(哈希表):元素较多时。
特点
- 适合存储结构化数据(如用户信息)。
- 内存利用率高,操作复杂度 O(1)。
4. Set(集合)
简介
- 无序、不重复的字符串集合。
- 最大元素数:2^32 - 1。
常用命令
命令 | 说明 |
---|
SADD key member1 [member2...] | 添加成员 |
SREM key member | 移除成员 |
SMEMBERS key | 获取所有成员 |
SISMEMBER key member | 判断成员是否存在 |
SUNION key1 key2 | 并集 |
SINTER key1 key2 | 交集 |
SDIFF key1 key2 | 差集 |
底层实现
- intset(整数集合):全是整数且数量少。
- hashtable(哈希表):存储大量字符串成员。
特点
- 自动去重,适合标签、好友关系。
- 集合运算(交、并、差)性能高。
5. Sorted Set(有序集合,ZSet)
简介
- 集合 + 分数(score),按分数排序。
- 成员唯一,score 可重复。
- 最大元素数:2^32 - 1。
常用命令
命令 | 说明 |
---|
ZADD key score member | 添加成员 |
ZREM key member | 删除成员 |
ZRANGE key start stop [WITHSCORES] | 按顺序获取成员 |
ZREVRANGE key start stop | 倒序获取 |
ZRANK key member | 获取排名(升序) |
ZREVRANK key member | 获取排名(降序) |
ZINCRBY key increment member | 增加分数 |
底层实现
- ziplist:元素少且数据短。
- skiplist(跳表)+ hashtable:支持高效排序和查找。
特点
- 适合排行榜、延时队列。
- 按分数范围查找 O(log n)。
6. Bitmap(位图)
简介
- 基于字符串的二进制位操作。
- 最大长度:512MB(约 2^32 位)。
常用命令
命令 | 说明 |
---|
SETBIT key offset value | 设置某个位 |
GETBIT key offset | 获取某个位 |
BITCOUNT key | 统计位为 1 的数量 |
BITOP op destkey key1 key2... | 位运算 |
特点
- 内存占用极小,适合布尔统计(签到、活跃用户)。
- 位操作 O(1)。
7. HyperLogLog
简介
- 基于概率的数据结构,用于基数统计(去重计数)。
- 占用固定内存:12KB。
- 误差:约 0.81%。
常用命令
命令 | 说明 |
---|
PFADD key element1 [element2...] | 添加元素 |
PFCOUNT key | 获取基数估算值 |
PFMERGE destkey key1 key2... | 合并计数 |
特点
- 适合统计 UV(独立访问用户)。
- 不能获取具体元素,只能估算数量。
8. Geospatial(地理位置)
简介
- 基于 ZSet 实现的地理位置信息存储。
- 支持位置添加、范围查询、距离计算。
常用命令
命令 | 说明 | |
---|
GEOADD key longitude latitude member | 添加位置 | |
GEODIST key member1 member2 [unit] | 距离计算 | |
`GEORADIUS key lon lat radius m | km` | 范围查询 |
GEOPOS key member | 获取经纬度 | |
特点
- 底层用 GeoHash 编码 + ZSet 存储。
- 适合附近的人/店铺功能。
9. Stream(流)
简介
- 类似消息队列,按时间顺序存储消息。
- 支持消费组,持久化。
常用命令
命令 | 说明 |
---|
XADD key * field value | 添加消息 |
XREAD COUNT n STREAMS key ID | 读取消息 |
XGROUP CREATE key groupname id | 创建消费组 |
XREADGROUP GROUP group consumer | 消费组读取 |
特点
- 适合日志流、事件流、实时数据处理。
- 消息持久化存储,支持多消费者。
10. 数据结构对比表
类型 | 有序性 | 可重复性 | 底层结构 | 典型应用 |
---|
String | 无 | 可重复 | SDS | 缓存、计数器 |
List | 有 | 可重复 | quicklist | 消息队列 |
Hash | 无 | field 唯一 | ziplist/hashtable | 对象存储 |
Set | 无 | 不可重复 | intset/hashtable | 标签、去重 |
ZSet | 按 score 排序 | 成员唯一 | skiplist+hashtable | 排行榜 |
Bitmap | 位索引 | N/A | bit array | 签到、活跃统计 |
HyperLogLog | N/A | N/A | HLL | UV 统计 |
Geo | 按位置排序 | 成员唯一 | GeoHash+ZSet | 附近的人 |
Stream | 按时间排序 | 可重复 | radix tree | 日志流 |