Redis的持久化之RDB

    作者:匿名更新于: 2021-10-25 21:28:26

    大神带你学编程,欢迎选课

      Redis支持数据的持久性,主要分为RDB和AOF两种方式,接下来的文章里,小编来给大家介绍一下RDB,先来看看什么是RDB。

      RDB持久性是将当前过程数据生成快照并保存在磁盘上的过程。由于是某一时刻的快照,快照中的值应该比内存中的值早或等于。

      生成的rdb文件的名称和存储位置由dbfilename和dir两个参数控制,默认生成的rdb文件为dump.rdb。

      触发方式:

      有两种方法可以触发rdb的持久性,即手动触发和自动触发。

      手动触发:

      redis客户端执行save命令和bgsave命令可以触发rdb的持久性,但两者仍然不同。

      1.使用save命令时,使用redis的主要过程是持久的。此时,redis服务将被堵塞,导致服务无法使用,直到持久完成。不推荐在线环境;

      2.bgsave命令是fork的子过程,使用子过程进行持久化,主过程只在fork的子过程中暂时堵塞,fork操作完成后不堵塞,主过程可以正常进行其他操作。

      3.bgsave是对save堵塞主流程的优化,后续的所有自动触发都是使用bgsave进行的。

      自动触发:

      在以下四种情况下会自动触发。

      在redis.conf中配置savemn,即当m秒内有n次修改时,bgsave会自动触发生成rdb文件;

      主从复制时,从节点到主节点的全复制也会触发bgsave操作,生成当时的快照发送到节点;

      执行debugreload命令重载redis时,还会触发bgsave操作;

      默认情况下执行shutdown命令时,如果不打开aof持久性,也会触发bgsave操作;

      关闭rdb持久性:

      有两种方法可以关闭rdb法:  

     

      过程:

      rdb持久流程图如下:  

     

      具体流程如下:

      redis客户端执行bgsave命令或自动触发bgsave命令;

      主流程判断目前是否存在执行中的子流程,如果存在,则主流程直接返回;

      如果没有正在执行的子过程,则fork的新子过程将被持久化,fork过程将被堵塞。fork操作完成后,主过程可以执行其他操作;

      子过程首先将数据写入临时rdb文件,快照数据写入完成后,原子取代旧rdb文件

      同时向主流程发送信号,通知主流程rdb持续完成,主流程更新相关统计信息(infoPersitence下的rdb_*相关选项)。

      优点和缺点:

      好处:

      RDB文件是某个时间节点的快照。默认情况下,使用LZF算法进行压缩。压缩后的文件体积远小于内存,适用于备份、全复制等场景;

      Redis加载RDB文件恢复数据远快于AOF模式;

      缺点:

      RDB模式实时性不够,无法实现秒级的持久性;

      每一次调用bgsave都需要fork子过程,fork子过程属于重量级操作,经常执行费用较高;

      RDB文件是二进制的,没有可读性OF文件可以在了解其结构的情况下手动修改或修改;

      版本兼容RDB文件;

      小编的分享就到这里了,希望上面的介绍有帮到大家。

        >>>>>>点击进入Python专题

课课家教育

未登录