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 |
日志流 |