Redis 五大核心数据结构知识点梳理

目录

一、String(字符串):最基础的键值存储

[1. 核心定义](#1. 核心定义)

[2. 底层实现](#2. 底层实现)

[3. 关键特性](#3. 关键特性)

[4. 核心命令](#4. 核心命令)

[5. 典型应用](#5. 典型应用)

二、Hash(哈希):键值对的集合

[1. 核心定义](#1. 核心定义)

[2. 底层实现](#2. 底层实现)

[3. 关键特性](#3. 关键特性)

[4. 核心命令](#4. 核心命令)

[5. 典型应用](#5. 典型应用)

三、List(列表):有序的字符串序列

[1. 核心定义](#1. 核心定义)

[2. 底层实现](#2. 底层实现)

[3. 关键特性](#3. 关键特性)

[4. 核心命令](#4. 核心命令)

[5. 典型应用](#5. 典型应用)

四、Set(集合):无序的唯一字符串集合

[1. 核心定义](#1. 核心定义)

[2. 底层实现](#2. 底层实现)

[3. 关键特性](#3. 关键特性)

[4. 核心命令](#4. 核心命令)

[5. 典型应用](#5. 典型应用)

[五、Sorted Set(有序集合):按分数排序的唯一集合](#五、Sorted Set(有序集合):按分数排序的唯一集合)

[1. 核心定义](#1. 核心定义)

[2. 底层实现](#2. 底层实现)

[3. 关键特性](#3. 关键特性)

[4. 核心命令](#4. 核心命令)

[5. 典型应用](#5. 典型应用)

总结:五大数据结构核心差异表


Redis 五种核心数据结构(String、Hash、List、Set、Sorted Set)是其高性能特性的核心载体,覆盖从简单缓存到复杂业务场景的需求。以下从核心定义、底层实现、关键特性、核心命令、典型应用五个维度,进行结构化知识点梳理,便于快速理解与记忆。

一、String(字符串):最基础的键值存储

1. 核心定义

  • Redis 最基础的数据结构,对外表现为"键-值"对,值支持字符串、整数(64位有符号)、浮点数、二进制数据(如图片流)。
  • 是构建复杂功能的"原子单元",其他数据结构的元素本质也多为 String 类型。

2. 底层实现

依赖 SDS(Simple Dynamic String,动态字符串) 结构,解决 C 语言原生字符串缺陷,编码随值的类型/长度动态切换:

|----------|---------------------------|------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| int | 值为 64 位有符号整数 | 直接存整数,支持 INCR/DECR 原子操作,内存占用最小 |
| embstr | 字符串长度 ≤ 44 字节(Redis 6.0+) | 键对象与 SDS 数据同块内存,减少碎片 |
| raw | 字符串长度 > 44 字节 | 键与 SDS 分开存储,支持动态扩容,适合长字符串 |

3. 关键特性

  • 操作性能:所有操作(增删改查)均为 O(1) 时间复杂度。
  • 功能扩展:支持整数原子增减、字符串拼接/截取、二进制安全存储。

4. 核心命令

|-----------------------------|------------------|--------------------------------|
| 命令 | 功能 | 示例 |
| SET key value [EX 秒] [NX] | 设置键值(可选过期/不存在才设) | SET user:name Alice EX 3600 |
| GET key | 获取值 | GET user:name |
| INCR/DECR key | 整数原子加/减 1 | INCR user:age |
| APPEND key value | 字符串拼接 | APPEND user:info " gender:女" |

5. 典型应用

  • 缓存热点数据(如商品详情、用户信息);
  • 计数器(文章阅读量、接口调用次数);
  • 分布式锁(基于 SET NX EX 实现);
  • Session 存储(分布式系统跨服务共享)。

二、Hash(哈希):键值对的集合

1. 核心定义

  • 二级结构:"键-(字段 field - 值 value)",一个 Hash 键可包含多个 field-value 对,适合存储多属性的复杂对象

2. 底层实现

随"字段数量"和"字段值大小"动态切换编码,平衡内存与性能:

|------------------|--------------------------------|--------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| ziplist(压缩列表) | 字段数 ≤ 512(默认)+ 字段值 ≤ 64 字节(默认) | 连续内存存储,无指针开销,内存利用率极高 |
| hashtable(哈希表) | 字段数 > 512 或字段值 > 64 字节 | 数组+链表解决哈希冲突,支持 O(1) 快速查询 |

3. 关键特性

  • 操作粒度:可单独操作某个 field(增删改查),无需修改整个 Hash;
  • 性能:单个 field 操作 O(1),遍历所有 field 操作 O(n)(n 为字段数)。

4. 核心命令

|------------------------|---------------------|-----------------------------------|
| 命令 | 功能 | 示例 |
| HSET key field value | 设置 field-value 对 | HSET user:100 name Alice age 25 |
| HGET key field | 获取指定 field 的值 | HGET user:100 name |
| HMGET key f1 f2 | 批量获取 field 值 | HMGET user:100 name age |
| HKEYS/HVALS key | 获取所有 field/所有 value | HKEYS user:100 |
| HDEL key field | 删除指定 field | HDEL user:100 age |

5. 典型应用

  • 存储对象属性(如用户信息、商品规格);
  • 购物车(用户 ID 为 Hash 键,商品 ID 为 field,数量为 value);
  • 配置管理(存储系统/服务的多维度配置项)。

三、List(列表):有序的字符串序列

1. 核心定义

  • 有序、可重复的字符串集合,支持从头部(left)、尾部(right) 高效插入/删除,底层基于双向链表思想实现。

2. 底层实现

Redis 3.2+ 统一使用 quicklist(快速列表) ,替代早期的 ziplist + linkedlist

  • 结构:多个 ziplist(压缩列表)用双向链表连接,每个 ziplist 存多个元素;
  • 优势:兼顾 ziplist 的内存紧凑性和双向链表的两端操作高效性;
  • 关键配置:list-max-ziplist-size(单个 ziplist 最大大小)、list-compress-depth(两端节点压缩深度)。

3. 关键特性

  • 有序性:按元素插入顺序排列,支持索引访问(但中间索引操作 O(n));
  • 性能:头部/尾部插入/删除 O(1),中间元素操作 O(n)。

4. 核心命令

|------------------------|------------------------|-------------------------------|
| 命令 | 功能 | 示例 |
| LPUSH/RPUSH key val | 头部/尾部插入元素 | LPUSH msg:queue "hello" |
| LPOP/RPOP key | 头部/尾部删除元素 | RPOP msg:queue |
| LRANGE key start end | 获取 [start, end] 区间元素 | LRANGE msg:queue 0 -1(所有元素) |
| LLEN key | 获取列表长度 | LLEN msg:queue |

5. 典型应用

  • 消息队列(基于 LPUSH + RPOP 实现简单 FIFO 队列);
  • 最新列表(如"最新文章""最近评论",LPUSH 新增 + LRANGE 取前 N);
  • 栈(基于 LPUSH + LPOP 实现 LIFO 栈)。

四、Set(集合):无序的唯一字符串集合

1. 核心定义

  • 无序、元素唯一的字符串集合,支持交集、并集、差集等集合运算,适合"去重"和"关系计算"。

2. 底层实现

随元素类型和数量动态切换编码:

|------------------|-------------------------|------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| intset(整数集合) | 所有元素为整数 + 元素数 ≤ 512(默认) | 紧凑存储,支持整数自动升级(16位→32位→64位),无哈希开销 |
| hashtable(哈希表) | 元素含非整数或元素数 > 512 | 以元素为键、值为 NULL,利用哈希表唯一性去重,O(1) 操作 |

3. 关键特性

  • 唯一性:自动去重,重复插入元素会被忽略;
  • 集合运算:支持交集(SINTER)、并集(SUNION)、差集(SDIFF);
  • 性能:插入/删除/判断元素存在 O(1),集合运算 O(n)(n 为元素总数)。

4. 核心命令

|-----------------------------|----------|-----------------------------------|
| 命令 | 功能 | 示例 |
| SADD key member | 添加元素 | SADD user:100:tags sports music |
| SMEMBERS key | 获取所有元素 | SMEMBERS user:100:tags |
| SISMEMBER key member | 判断元素是否存在 | SISMEMBER user:100:tags sports |
| SINTER/SUNION/SDIFF k1 k2 | 交集/并集/差集 | SINTER user1:tags user2:tags |
| SREM key member | 删除元素 | SREM user:100:tags music |

5. 典型应用

  • 数据去重(如用户点赞的文章 ID、去重的日志 ID);
  • 关系计算(社交场景的"共同好友""好友推荐");
  • 标签系统(商品标签、用户兴趣标签,支持多标签筛选)。

五、Sorted Set(有序集合):按分数排序的唯一集合

1. 核心定义

  • 在 Set"元素唯一"的基础上,为每个元素分配分数(score),按分数自动排序,支持按分数范围/排名查询,是 Redis 功能最强大的结构之一。

2. 底层实现

随元素数量和元素大小动态切换编码:

|------------------------|---------------------------------|---------------------------------------------------------------------------------------|
| 编码类型 | 适用场景 | 核心优势 |
| ziplist(压缩列表) | 元素数 ≤ 128(默认)+ 元素长度 ≤ 64 字节(默认) | 按"member→score"交替存储,分数升序,内存紧凑 |
| skiplist + hashtable | 元素数 > 128 或元素长度 > 64 字节 | - 跳表(skiplist):按 score 排序,O(log n) 范围/排名查询; - 哈希表:映射 member→score,O(1) 查改 score,保证唯一性 |

3. 关键特性

  • 有序性:按 score 升序排列,支持降序查询(ZREVRANGE);
  • 排名功能:可获取元素的排名(ZRANK/ZREVRANK),或按排名取元素;
  • 性能:插入/删除/查改 score 均为 O(log n)。

4. 核心命令

|---------------------------------------|---------------|-----------------------------------|
| 命令 | 功能 | 示例 |
| ZADD key score member | 添加元素(指定分数) | ZADD rank:score 95 Alice 88 Bob |
| ZRANGE/ZREVRANGE k s e [WITHSCORES] | 升序/降序取元素(带分数) | ZREVRANGE rank:score 0 0(第一名) |
| ZSCORE key member | 获取元素分数 | ZSCORE rank:score Alice |
| ZRANK/ZREVRANK key member | 升序/降序排名 | ZREVRANK rank:score Alice |
| ZRANGEBYSCORE k min max | 按分数范围取元素 | ZRANGEBYSCORE rank:score 80 90 |

5. 典型应用

  • 排行榜系统(游戏积分、文章阅读量、商品销量 Top N);
  • 优先级队列(任务优先级为 score,高分数任务优先执行);
  • 范围统计(用户积分等级划分、按时间范围筛选数据)。

总结:五大数据结构核心差异表

|------------|---------|-----|-----|-----------|----------------------|
| 数据结构 | 核心特点 | 有序性 | 唯一性 | 核心优势场景 | 操作复杂度(核心操作) |
| String | 单键值、多类型 | - | - | 缓存、计数、锁 | O(1) |
| Hash | 二级键值对 | - | - | 存储对象、购物车 | O(1)(单 field) |
| List | 双向序列 | 插入序 | 不保证 | 消息队列、最新列表 | O(1)(头尾)、O(n)(中间) |
| Set | 无序列合 | 无 | 保证 | 去重、关系计算 | O(1)(增删查)、O(n)(集合运算) |
| Sorted Set | 分数排序 | 分数序 | 保证 | 排行榜、优先级队列 | O(log n)(增删查排) |

相关推荐
yuriy.wang3 小时前
Spring IOC源码篇五 核心方法obtainFreshBeanFactory.doLoadBeanDefinitions
java·后端·spring
咖啡教室5 小时前
程序员应该掌握的网络命令telnet、ping和curl
运维·后端
你的人类朋友5 小时前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡5 小时前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
hong_zc5 小时前
redis之缓存
数据库·redis·缓存
李昊哲小课6 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈6 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区6 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔6 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端