《Redis数据类型与持久化机制》
Redis 核心知识详解:数据类型与持久化机制
Redis 是目前企业开发中使用非常广泛的 高性能 Key-Value 数据库。
它最大的特点:
- 基于内存存储,读写速度极快
- 支持丰富的数据结构
- 支持数据持久化
- 支持分布式缓存场景
常见应用:
- 缓存
- 登录状态保存
- 分布式锁
- 消息队列
- 排行榜
- 限流
- 计数器
本文主要介绍:
- Redis 常用数据类型
- String 类型
- Hash 类型
- List 类型
- Set 类型
- ZSet 类型
- Redis 持久化机制
- RDB
- AOF
- 混合持久化
一、Redis 数据结构概览
Redis 不像 MySQL 一样使用表存储数据,而是:
Key → Value例如:
user:1001
↓
{ name:"Tom", age:20}其中:
- Key:数据唯一标识
- Value:实际存储的数据
Redis 支持多种 Value 类型:
| 类型 | 特点 | 应用场景 |
|---|---|---|
| String | 字符串、数字 | 缓存、计数器 |
| Hash | 对象结构 | 用户信息 |
| List | 列表结构 | 消息队列 |
| Set | 无序集合 | 标签、去重 |
| ZSet | 有序集合 | 排行榜 |
二、String 类型
1. String 简介
String 是 Redis 最基础的数据类型。
它可以保存:
- 字符串
- 数字
- 二进制数据
例如:
SET username Tom保存:
key:
username
value:
Tom获取:
GET username结果:
Tom2. String 常用命令
设置数据
SET key value例如:
SET name Tom获取数据
GET key例如:
GET name结果:
Tom删除数据
DEL key例如:
DEL name设置过期时间
SET key value EX seconds例如:
SET token abc123 EX 3600表示:
token 1小时后自动删除3. String 应用场景
(1)缓存数据
例如:
数据库:
MySQL
user表缓存:
Redis
user:1001流程:
请求用户信息
↓
查询Redis
↓
存在
↓
直接返回
不存在
↓
查询MySQL
↓
写入Redis(2)计数器
例如:
文章阅读量:
INCR article:view:1001第一次:
1第二次:
2应用:
- 点赞数量
- 浏览量
- 库存数量
三、Hash 类型
1. Hash 简介
Hash 类似 Java 中的:
Map结构:
key
↓
field:value例如:
用户对象:
user:1001
{ name:"Tom", age:20, email:"xxx@qq.com"}Redis:
HSET user:1001 name Tom
HSET user:1001 age 202. Hash 常用命令
添加字段
HSET key field value例如:
HSET user:1 name Tom获取字段
HGET key field例如:
HGET user:1 name返回:
Tom获取全部字段
HGETALL user:1返回:
name Tom
age 203. Hash 应用场景
用户信息缓存
MySQL:
user表Redis:
user:1001保存:
name
age
email
avatar优势:
不用存整个 JSON。
可以单独修改字段。
例如:
修改年龄:
HSET user:1001 age 21四、List 类型
1. List 简介
List 是一个有序列表。
特点:
- 按插入顺序保存
- 可以重复
- 支持左右插入
结构:
List
A
B
C
D2. List 常用命令
左侧插入
LPUSH key value右侧插入
RPUSH key value获取列表
LRANGE key start end例如:
LRANGE queue 0 -1表示:
获取全部元素。
3. List 应用场景
消息队列
生产者:
生产消息
↓
Redis List消费者:
读取消息
↓
处理任务例如:
订单创建
↓
加入队列
↓
异步发送邮件五、Set 类型
1. Set 简介
Set 是无序集合。
特点:
- 不重复
- 无序
例如:
Java
Python
Go添加:
SADD language Java2. Set 常用命令
添加元素
SADD key value查看全部元素
SMEMBERS key判断是否存在
SISMEMBER key value3. Set 应用场景
(1)去重
例如:
用户点赞:
article_like_1
100110021003同一个用户不能重复点赞。
(2)共同好友
用户A:
Tom
Jack用户B:
Tom
Lucy求共同好友:
SINTER userA userB结果:
Tom六、ZSet 类型(Sorted Set)
1. ZSet 简介
ZSet:
有序集合。
区别:
Set:
无序ZSet:
按照 score 排序结构:
member
score例如:
排行榜:
Tom 100
Jack 90
Lucy 802. ZSet 常用命令
添加元素
ZADD key score member例如:
ZADD rank 100 Tom获取排行榜
ZRANGE key start end例如:
ZRANGE rank 0 9获取前10名。
获取分数
ZSCORE key member3. ZSet 应用场景
排行榜
例如:
游戏排行榜:
玩家A 10000分
玩家B 9000分
玩家C 8000分Redis:
game_rank
A 10000
B 9000
C 8000根据 score 自动排序。
七、Redis 持久化机制
Redis 数据存储在内存中:
优点:
速度快缺点:
服务器宕机
数据可能丢失因此 Redis 提供:
- RDB
- AOF
- 混合持久化
八、RDB 持久化
1. 什么是 RDB?
RDB:
Redis Database
它会:
在某个时间点生成 Redis 数据快照。
例如:
当前Redis数据
↓
生成dump.rdb文件2. RDB 工作流程
Redis运行
↓
满足保存条件
↓
fork子进程
↓
生成快照
↓
保存dump.rdb3. RDB 优点
(1)恢复速度快
因为:
直接加载二进制文件。
(2)文件小
适合:
数据备份。
4. RDB 缺点
数据可能丢失。
例如:
设置:
5分钟保存一次如果:
4分钟后服务器宕机这4分钟数据:
可能丢失。
九、AOF 持久化
1. 什么是 AOF?
AOF:
Append Only File
它记录:
每一次写操作命令例如:
执行:
SET name Tom保存:
SET name Tom2. AOF 工作流程
客户端写入命令
↓
Redis执行
↓
记录日志文件3. AOF 优点
- 数据安全性更高
- 丢失数据少
4. AOF 缺点
- 文件更大
- 恢复速度慢
十、AOF 三种同步策略
always
每次写入立即同步。
优点:
安全。
缺点:
性能低。
everysec(默认)
每秒同步一次。
特点:
性能和安全平衡。
no
由操作系统决定。
性能最高。
风险较高。
十一、混合持久化
1. 为什么需要混合持久化?
RDB:
优点:
- 恢复快
缺点:
- 可能丢数据
AOF:
优点:
- 数据安全
缺点:
- 恢复慢
因此 Redis 4.0 引入:
混合持久化2. 混合持久化原理
流程:
AOF重写
↓
先写RDB快照
↓
追加AOF增量命令生成:
RDB数据
+
AOF日志3. 恢复流程
Redis启动:
读取RDB部分
↓
加载基础数据
↓
执行AOF增量命令
↓
恢复最新状态十二、三种持久化方式对比
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 定时快照 | 恢复快、文件小 | 可能丢数据 |
| AOF | 记录命令 | 数据安全 | 文件大、恢复慢 |
| 混合持久化 | RDB+AOF | 兼顾速度和安全 | 复杂度更高 |
十三、面试回答模板
Redis 常用数据类型有哪些?
回答:
Redis 提供了丰富的数据结构,常用的包括 String、Hash、List、Set 和 ZSet。String 常用于缓存和计数器,Hash 适合存储对象信息,List 可以实现消息队列,Set 常用于去重和集合运算,ZSet 可以实现排行榜等有序场景。
Redis 如何保证数据不丢失?
回答:
Redis 提供 RDB 和 AOF 两种持久化方式。RDB 是通过生成数据快照进行持久化,恢复速度快但可能存在数据丢失;AOF 是记录每次写操作日志,数据安全性更高但文件较大。Redis 4.0 后支持混合持久化,将 RDB 快照和 AOF 增量日志结合,在保证恢复速度的同时减少数据丢失。
总结
Redis 核心知识结构:
Redis数据类型
↓
String
Hash
List
Set
ZSet
Redis持久化
↓
RDB
↓
AOF
↓
混合持久化掌握这些内容,可以覆盖后端开发中 Redis 的基础使用和常见面试问题。
《Redis数据类型与持久化机制》
作者:felinus
本文链接: https://felinus-blog.vercel.app/posts/f8882818/
本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。