redis持久化——RDB

RDB RDB持久化就是把当前的数据以二进制的形式储存到本地硬盘的过程。以下命令设置储存的文件目录和文件名称

dbfilename redisData dir /opt/redis/data/

通常分为手动触发和自动触发
手动触发
手动触发通常使用save和bgsave命令
  • save:save命令会阻塞当前的服务器,知道RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,建议线上环境不要使用该命令。
  • bgsave:Redis进程执行fork操作创建子进程,RDB持久化的过程由子进程完成,完成后自动结束。这种方式阻塞只发生在fork阶段,时间很短。
自动触发
  • 使用save m n,表示m秒内数据集存在n次修改时,自动触发bgsave
  • 执行debug reload命令重新加载Redis时,也会自动触发save操作
  • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能的话则自动执行bgsave
BGSAVE运行流程
【redis持久化——RDB】redis持久化——RDB
文章图片

  1. 执行bgsave命令,如果当前又子进程在运行则直接返回。
  2. 主进程fork出子进程,fork期间可能出现阻塞,通过info stats查看lastest_fork_usec选项,可以获取最近一个fork操作耗时,单位为微秒。
  3. 父进程fork完成后,bgsave命令返回,父进程继续响应其他命令。
  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。
  5. 进程发送信号给父进程表示完成。
RDB优缺点
优点
  • RDB是一个紧凑压缩的二进制文件,代表Redis在某一时间点上的数据快照。Redis默认采用LZF算法对生成的RDB文件做压缩处理,压缩后文件的大小远远小于内存的大小。可以通过config set rdbcompression {yes|no}动态修改。
  • Redis加载RDB恢复数据远远快于AOF的方式。
缺点
  • RDB方式数据没办法做到实时持久化/秒级持久化,因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作。
  • RDB采用特定二进制保存,在Redis多个版本中,可能出现不兼容的情况。

    推荐阅读