Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RDB持久化方案,包括操作方法和持久化的实现原理
RDB持久化方案,请参考Redis持久化之AOF
1.定义
RDB 持久化(也称作快照持久化)是指将内存中的数据生成快照保存到磁盘里面,术语snapshot快照,保存的文件后缀是 .rdb。它恢复时是将.rdb文件直接读取到内存中。
2.执行流程
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件
3.触发机制
方式一:自动触发 : 配置文件配置
自动触发是由我们的配置文件来完成的。在redis.conf配置文件中,里面有如下配置,我们可以去设置:
save 这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘,
格式:“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
stop-writes-on-bgsave-error RDB失败后,Redis是否停止接收数据。默认值为yes
rdbcompression 对存储在磁盘上的快照是否进行压缩存储。默认值是yes
rdbchecksum 存储快照后是否进行数据校验,会增加资源消耗。默认值是yes
dbfilename 设置快照文件的名称,默认值为dump.rdp
dir 设置快照文件的存放路径
方式二:手动触发 : SAVE 和 BGSAVE
SAVE: 该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
BGSAVE: Redis进程执行fork操作创建子进程,RDB持久化过程由子进程在后台异步进行快照操作,快照同时还可以响应客户端请求,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
方式三:FLUSHALL命令
方式四:Redis关闭的时候
4.备份和恢复
备份: 先通过config get dir 查询rdb文件的目录 ,将*.rdb的文件拷贝到别的地方即可
恢复: 先关闭Redis,将备份文件拷贝到快照文件目录下,启动redi后,就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。
5.停止RDB的方式
- 注释掉所有的 save 行来停用保存功能或者直接一个空字符串来实现停用:save ""
- 也可以通过命令:redis-cli config set save " "
6.优缺点
优点
RDB是一个非常紧凑(compact)的文件,全量备份,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。
生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)
RDB方式数据没办法做到实时持久化
fork进程的时候,会占用一定的内存空间
文章多以个人学习及理解为基础略作整理,如有错误,请联系我,我会及时修改.
推荐阅读: