每一个你不满意的现在,都有一个你不努力的曾经。

Redis持久化RDB与AOF


为什么需要持久化

Redis 是基于内存的数据库,一旦服务宕机数据将会被清空。
持久化就是将内存中的数据保存到磁盘为了避免意外数据丢失或者服务器宕机、重启时能够恢复数据。
Redis 持久化主要分为 RDB持久化和 AOF持久化,一个是快照的方式,一个是类似日志追加的方式。

RDB持久化

RDB持久化是把当前进程数据生成快照保存到磁盘上。
触发 RDB 持久化的方式有两种,分别为手动触发和自动触发

手动触发

手动触发分别为 save 和 bgsave 命令
save命令:会造成 Redis 服务器阻塞直到 RDB持久化的过程完成为止,对于内存较大的实例造成的阻塞的时间也会相应变长。
bgsave命令:Redis 进程 fork 出子进程,RDB持久化过程

自动触发

在 redis.conf 文件中配置 save <seconds><changes>
以默认配置文件为例:
# save 3600 1
# save 300 100
# save 60 10000
即在3600秒内有1个 key 被修改,则自动触发 bgsave 操作
如 save "" 表示禁用 RDB持久化

在主从复制的时候,slave 从节点需要在 master 主节点进行全量复制的时候,主节点进程会fork出子进程进行bgsave操作,快照生成完成后会传输给 slave从节点

如果没有启用AOF持久化,默认情况执行 shutdown 命令也会触发bgsave操作

bgsave 具体流程

redis客户端执行 bgsave 或者自动触发 bgsave 命令
主进程判断是否有正在执行的子进程,如果子进程存在则主进程返回
如果没有正在执行的子进程,那么主进程会 fork 出一个子进程进行持久化,在 fork 子进程这个过程是阻塞的,等到主进程 fork 完成后主进程即可执行其他操作
子进程先将数据写入临时的rdb文件中,等待快照数据写入完成后再替换掉旧的rdb文件(替换的过程是原子性的),同时会给主进程发送信号,通知主进程 rdb 持久化已完成</changes></seconds>
Card image cap

每一个你不满意的现在,都有一个你不努力的曾经。