Redis 持久化
原创大约 4 分钟Redis 教程redis
Redis 持久化
什么是持久化?
所谓持久化,其实就是一种机制,它能够 将内存中的数据库状态保存到磁盘 中,从而防止服务器宕机导致内存数据丢失。Redis
的 数据都是存在内存中 的,一旦出现宕机等情况,所有数据将会丢失,而持久化机制则是为了应对这一突发故障而提出的机制。
持久化的过程
要进行持久化,都是由客户端发起请求,然后再到服务器真实地写入磁盘中,一般需要经过如下步骤:
- 客户端向数据库 发送写命令请求,此时数据存在于客户端的内存中;
- 数据库 接收 来自客户端的 写命令请求,此时数据存在于服务器的内存中;
- 数据库 调用系统 API 将数据写入磁盘,此时数据从服务器内存准备写入磁盘,位于 内核缓冲区;
- 操作系统将 写缓冲区 传输到 磁盘控制器,此时 数据由内核缓冲区进入磁盘缓存;
- 操作系统的磁盘控制器将数据 写入实际物理媒介中,此时数据写入磁盘;
持久化的两种方式
- RDB:在指定时间间隔内对数据进行快照存储,是
Redis
默认的持久化方式; - AOF:记录每次服务器进行的写操作,当服务器重启时重新执行这些命令以恢复原始数据;
RDB
工作原理
Redis
调用fork()
,产生一个子进程;- 子进程将数据写到一个临时的
RDB
文件; - 当子进程完成新的
RDB
文件写入后,替换掉旧的RDB
文件;
优缺点
- 优点
RDB
是一个单文件,十分简洁,保存了某一时间点的 Redis 数据,适合做备份;RDB
适合用于容灾,单文件传输十分方便;RDB
性能较好,要进行持久化时,主进程fork
一个子进程,然后将持久化的工作交给子进程,而主进程无需进行相关的I/O
操作;- 相比于
AOF
,数据量大时,其启动速度更快。
- 缺点
RDB
容易造成数据丢失,数据安全性较低;RDB
利用fork()
产生子进程进行数据的持久化,一旦数据过大就会消耗一定时间,造成Redis
停止服务几毫秒甚至更久。
配置
# 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
重建的数据和原数据不一致的问题;
配置
# 是否开启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
。