Redis的持久化之RDB

190 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情

背景

Redis的数据都存储在内存中,如果服务器出现宕机,那么Redis的数据会丢失吗?我们可以通过Redis的持久化来保证数据的不丢失,本文将介绍Redis的持久化之RDB

简介

RDB 就是RedisDataBase的缩写,简称内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程,由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值。

触发方式

Redis进行RDB持久化的方式有两种分别为手动触发RDB持久化和自动触发RDB持久化。

自动触发

Redis自动触发RDB持久化的场景

  • Redis.conf文件进行相关RDB规则配置。
  • 主从复制时,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点;

Redis RDB持久化相关配置

#设置Redis持久化的频率
save 900 1
save 300 10
save 60 10000

# 在生成快照的过程中,如果出现了错误Reids禁止写的操作
stop-writes-on-bgsave-error yes

#属性将在字符串类型的数据被快照到磁盘文件时,启用LZF压缩算法
rdbcompression yes

#是否进行RDB文件的完整性校验
rdbchecksum yes

#Rdb文件的名称
dbfilename dump.rdb

#生成RDB文件路径
dir /var/lib/redis

配置说明

  • save 900 1 :15分钟内至少1个key的值改变,则进行RDB持久化
  • save 300 10 :15分钟内至少1个key的值改变,则进行RDB持久化
  • save 60 10000 : 1分钟内至少10000个key值改变,则进行RDB持久化。
  • stop-writes-on-bgsave-error:默认值为yes,如果快照操作出现异常(例如操作系统用户权限不够、磁盘空间写满等等)时,Redis就会禁止写操作。
  • rdbcompression:默认值为yes,将字符串类型的数据快照到磁盘文件中,启用LZF压缩算法,对数据进行压缩处理。
  • rdbchecksum:默认值位yes,在RDB文件的末尾将冗余一个64位的CRC校验编码,用于对RDB文件进行完整性的校验。
  • dbfilename:RDB文件的名称
  • dir:RDB文件生成的路径

手动触发

手动触发RDB持久化需要执行save或者bgsave

save命令

该命令会阻塞Redis的主线程,执行命令期间,Redis不能执行其他命令,直到RDB文件生成为止。生成需要禁止进行此命令。

bgsave命令

Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束,具体流程如下:

图片.png

bgsave与save的比较

虽然save和bgsave命令都能进行RDB的持久化,但是却存在相关的差异,具体差异如下:

图片.png

RDB持久化的优缺点

优点

  • RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;
  • RDB在恢复大数据集时的速度比AOF的恢复速度要快。

缺点

  • RDB方式实时性不够,无法做到秒级的持久化,会导致数据丢失。
  • 当数据集非常大,CPU的为单核时,Redis在fork子进程时可能会消耗相对较长的时间,从而影响客户端请求。
  • RDB文件是二进制的,没有可读性,且存在文件兼容性问题。

总结

本文讲解了Redis的持久化之RDB,如有疑问请随时反馈。