Redis持久化之RDB的定义及执行原理-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

Redis持久化之RDB的定义及执行原理

简介: Redis 是内存数据库,就是将数据库中的内容保存在内存中,读写效率更高,但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。 Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。

Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RDB持久化方案,包括操作方法和持久化的实现原理

RDB持久化方案,请参考Redis持久化之AOF

1.定义

RDB 持久化(也称作快照持久化)是指将内存中的数据生成快照保存到磁盘里面,术语snapshot快照,保存的文件后缀是 .rdb。它恢复时是将.rdb文件直接读取到内存中。

2.执行流程

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件
image.png

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进程的时候,会占用一定的内存空间


文章多以个人学习及理解为基础略作整理,如有错误,请联系我,我会及时修改.
推荐阅读:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: