持久化方式之RDB

RDB(快照)持久化:保存某个时间节点的全量数据快照

Redis配置文件

在根目录下的redis.conf

配置文件中RDB相关信息

截屏2021-01-11 下午10.44.06

含义:900秒内有一条写入就产生快照,300秒内有10条写入就产生快照,以此类推

配置二:

截屏2021-01-11 下午10.47.37

设置成yes表示当备份进程出错的时候主进程就停止接受新的写入操作

配置三:

截屏2021-01-11 下午10.48.10

设置成yes就表示在备份时先压缩再保存,建议设置成no

RDB的创建与载入

生成命令一:SAVE

  • 阻塞Redis的服务进程,直到RDB文件被创建完毕(很少被使用)

生成命令二: BGSAVE

  • Fork一个子进程来创建RDB文件,不阻塞服务器进程

LASTSAVE

返回上次保存的时间

自动化触发RDB持久化的方式

  • 根据redis.conf文件中的配置来定时触发(用的BGSAVE)
  • 主从复置时,主节点自动触发
  • 执行Debug Reload时
  • 执行Shutdown且没有开启AOF持久化

BGSAVE原理

截屏2021-01-11 下午10.57.18
  1. 执行 bgsave 命令,Redis 父进程判断当前是否存在正在执行的子进程,如 RDB/AOF 子进程,如果存在 bgsave 命令直接返回。

  2. 父进程执行 fork 操作创建子进程,fork 操作过程中父进程会阻塞。

  3. 父进程 fork 完成后,bgsave 命令返回并不再阻塞父进程,可以继续响应其他命令。

  4. 子进程创建 RDB 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。

  5. 进程发送信号给父进程表示完成,父进程更新统计信息。

缺点

  • 内存数据全量同步,数据量大时会由于I/O而严重影响性能

  • 可能会因为redis挂掉而丢失从当前至最后一次快照的数据