Redis RDB持久化

1、什么是RDB

RDB(redis database)是redis默认的持久化方案。在指定的时间内,执行了指定的次数的写操作(或者超过指定时间执行了指定的操作次数),则将内存中的数据写入磁盘,作持久化存储。在指定目录下生成dump.rdb文件,redis重启后可通过加载dump.rdb文件恢复数据。

2、RDB持久化触发方式

1.save命令

save命令触发RDB持久化是一个同步阻塞的过程。在执行save指令期间,redis不能处理其他请求,直到持久化完成。

2.bgsave命令

bgsave命令触发RDB持久化是一个异步的过程。它会fork出一个子进程来做持久化操作,完成后自动结束。redis只有在fork期间会发生阻塞,其他时间仍然可以正常处理请求。

3.shutdown命令

shutdown命令能触发持久化。

4.flushall命令

flushall命令能触发持久化,但是没有什么意义。

5.自动化配置

查看标题4

3、RDB持久化原理

RDB持久化是redis进程fork出一个子进程,该子进程拷贝一份原有的dump.rdb文件,将要持久化的数据集写入临时文件中,最后用临时文件将原有的dump.rdb文件覆盖。

image.png

4、RDB自动触发配置

打开redis.conf配置文件,找到快照(SNAPSHOTTING)部分。核心配置

save ""    不需要持久化操作
save 900 1  每900秒内至少有1个key被改变
save 300 10  每300秒内至少有10个key被改变
save 60 10000  每60秒内至少有10000个key被改变

image.png

解释一下 save 配置的含义。
它指在指定的时间内,执行了多少次更新操作,就会触发RDB持久化操作。
例子:save 100 10
在100秒内,如果redis执行了10次更新操作,就触发一次RDB持久化操作。如果超过了100秒了,redis执行更新操作次数小于10,则不会触发RDB持久化操作。但是当从上次持久化操作后redis只要执行更新操作大于等于10次就会触发RDB持久化,不管时间是否到100秒或者超过100秒。(50秒时,redis一共执行了10次更新操作,触发RDB持久化。)(100秒时,redis一共执行了9次更新操作,105秒时,redis做了一次更新操作,则在105秒时触发RDB持久化)

在SNAPSHOTTING模块中还有下面三个配置

默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。
stop-writes-on-bgsave-error 

存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes
rdbcompression yes

本地持久化数据库文件名,默认值为dump.rdb
dbfilename dump.rdb

持久化文件存储的路径
dir ./
image.png

5、数据恢复

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。

6、RDB的优缺点

优点:

  • 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
  • RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

缺点:

  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁执行成本过高(影响性能)
  • 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)

你可能感兴趣的:(Redis RDB持久化)