什么是持久化?
所谓持久化,其实就是一种机制,它能够 将内存中的数据库状态保存到磁盘 中,从而防止服务器宕机导致内存数据丢失。Redis 的 数据都是存在内存中 的,一旦出现宕机等情况,所有数据将会丢失,而持久化机制则是为了应对这一突发故障而提出的机制。
持久化的过程
要进行持久化,都是由客户端发起请求,然后再到服务器真实地写入磁盘中,一般需要经过如下步骤:
- 客户端向数据库 发送写命令请求,此时数据存在于客户端的内存中;
- 数据库 接收 来自客户端的 写命令请求,此时数据存在于服务器的内存中;
- 数据库 调用系统 API 将数据写入磁盘,此时数据从服务器内存准备写入磁盘,位于 内核缓冲区;
- 操作系统将 写缓冲区 传输到 磁盘控制器,此时 数据由内核缓冲区进入磁盘缓存;
- 操作系统的磁盘控制器将数据 写入实际物理媒介中,此时数据写入磁盘;
持久化的两种方式
- RDB:在指定时间间隔内对数据进行快照存储,是 Redis 默认的持久化方式;
- AOF:记录每次服务器进行的写操作,当服务器重启时重新执行这些命令以恢复原始数据;
RDB
工作原理
- Redis 调用
fork()
,产生一个子进程; - 子进程将数据写到一个临时的 RDB 文件;
- 当子进程完成新的 RDB 文件写入后,替换掉旧的 RDB文件;
优缺点
- 优点
-
- RDB 是一个单文件,十分简洁,保存了某一时间点的 Redis 数据,适合做备份;
- RDB 适合用于容灾,单文件传输十分方便;
- RDB 性能较好,要进行持久化时,主进程
fork
一个子进程,然后将持久化的工作交给子进程,而主进程无需进行相关的 I/O 操作; - 相比于 AOF,数据量大时,其启动速度更快;
- 缺点
-
- RDB 容易造成数据丢失,数据安全性较低;
- RDB 利用
fork()
产生子进程进行数据的持久化,一旦数据过大就会消耗一定时间,造成 Redis 停止服务几毫秒甚至更久;
配置
代码语言:javascript复制# RDB 文件名,默认 dump.rdb
dbfilename dump.rdb
# 文件存放目录,默认为当前工作目录
dir ./
# 保存点,假设为每 60s,数据发生 1000 次以上变动
save 60 1000
# 持久化出错,主进程是否停止希尔
stop-writes-on-bgsave-error yes
# 数据是否压缩
rdbcompression yes
# 数据是否校验
rdbchecksum yes
手动触发方式
- save
会阻塞当前 Redis 服务器,直到持久化完成,对于线上要禁止使用;
- bgsave
fork
一个子进程,由子进程负责持久化进程,因此阻塞只会发生在 fork
子进程的过程中;
AOF
工作原理
- 命令的实时写入,通过增量追加到文件的流程为:命令写入 -> 追加到 AOF 缓存 -> 同步到 AOF 磁盘;
- 对 AOF 文件的重写,是为了减少 AOF 文件的大小,可以手动(
bgrewriteaof
)或自动触发;
优缺点
- 优点
-
- 比 RDB 更可靠,能制定不同的同步策略:不进行同步,每秒同步一次和每次查询进行同步,默认为每秒同步一次;
- AOF 是一个纯追加的文件,面对突发情况也不回出现日志定位或损坏问题;
- 当 AOF 过大时,Redis 会自动重写。重写是在一个新文件上进行,同时 Redis 会继续往旧文件中追加数据,新文件上会写入能重建当前数据集的最小操作命令的集合。当新文件重写完之后,Redis 就将新旧文件进行替换,然后将数据写入新文件;
- AOF 将操作命令以简易的格式保存在文件中,容易导出用于恢复数据;
- 缺点
-
- 数据量相同时,AOF 文件的大小一般都会比 RDB 文件大;
- 在某些同步策略下,AOF 的速度比 RDB 慢,通常同步设置为每秒一次就能获得较高性能;
- 有可能出现 AOF 重建的数据和原数据不一致的问题;
配置
代码语言:javascript复制# 是否开启aof
appendonly yes
# 文件存放目录,与 RDB 公用,默认为当前工作目录
dir ./
# 文件名称,默认为 appendonly.aof
appendfilename "appendonly.aof"
# 同步方式
# appendfsync always
appendfsync everysec
# appendfsync no
# aof重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载aof时如果有错如何处理
aof-load-truncated yes
# 文件重写策略
aof-rewrite-incremental-fsync yes
总结
以上就是 Redis 持久化的相关内容了,首先讲了什么是持久化,然后讲了持久化的过程,最后则是 Redis 中持久化的两种方式:RDB AOF。
创作不易,如果你觉得本文对你有所帮助,那就帮忙点个赞再走吧!