持续创作,加速成长!这是我参与「掘金日新计划 · 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持久化过程由子进程负责,完成后自动结束,具体流程如下:
bgsave与save的比较
虽然save和bgsave命令都能进行RDB的持久化,但是却存在相关的差异,具体差异如下:
RDB持久化的优缺点
优点
- RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景;
- RDB在恢复大数据集时的速度比AOF的恢复速度要快。
缺点
- RDB方式实时性不够,无法做到秒级的持久化,会导致数据丢失。
- 当数据集非常大,CPU的为单核时,Redis在fork子进程时可能会消耗相对较长的时间,从而影响客户端请求。
- RDB文件是二进制的,没有可读性,且存在文件兼容性问题。
总结
本文讲解了Redis的持久化之RDB,如有疑问请随时反馈。