RDB持久化
RDB持久化
一、持久化简介
什么是持久化?
将内存中的数据保存至永久性存储介质称为持久化
为什么要持久化?
防止数据的意外丢失,确保数据安全性
如何防止数据丢失?
RDB持久化:将当前****保存到硬盘(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)
AOF持久化:将每次执行的写****保存到硬盘(原理是将Reids的操作日志以追加的方式写入文件,类似于MySQL的binlog)

二、数据快照RDB
RDB,默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。(/var/lib/redis/6379)
1. save指令
使用save指令即可通过RBD方式进行数据持久化,需要手动执行save操作,持久化时会把redis中的数据默认保存在dump.rdb中,可在配置文件中指定目录

客户端在内存创建数据,并进行save持久化

查看指定dump.rdb中是否有内容

这就表示内存中的数据已经保存在硬盘文件里了
2. RDB文件相关配置
dbfilename dump.rdb
- 说明:设置本地数据库文件名,默认为
dump.rdb
- 经验:通常设置为
dump-端口号.rdb
dir /var/lib/redis/6379 #默认
- 说明:设置存储.rdb文件的路径
- 经验:通常设置成存储空间较大的目录中,目录名称data
rdbcompression yes
- 说明:设置存储至本地数据库时是否压缩数据,默认为yes,采用LZF压缩
- 经验:通常默认为开启状态,
rdbchecksum yes
- 说明:设置读写.rdb文件时是否进行RDB文件的校验,该校验过程在写文件和读文件过程均进行,避免读写已损坏的文件
- 经验:通常默认为开启状态,
stop-writes-on-bgsave-error yes
- 说明:后台存储过程中如果出现错误,是否停止保存操作
- 经验:通常默认为开启状态
修改配置后,需要重启服务程序才能生效,重启后将按照配置文件指定的文件路径和工作方式运行

验证save后数据保存在了rdb文件
服务端杀掉进程后,重新使用配置文件启动

客户端创建两个数据并save

查看rdb文件,已有相关记录

验证重启服务后,程序会从rdb文件中恢复数据到内存

客户端重新连接,发现数据还存在,这是因为服务进程启动时读取了rdb文件,进而恢复到内存中

3. bgsave指令
Redis是单线程的,所有命令都会在队列中排好队,

访问量很大时,单线程又得执行save,还得处理客户请求,造成效率降低,如何处理?
用bgsave解决:

注意: bgsave命令是针对save阻塞问题做的优化,
验证bgsave工作原理
客户端发送bgsave,可以看到给我们提示的是Background saving started

我们查看RDB文件,已经数据addr保存好了

我们查看一下日志文件(配置文件中的logfile)

4.配置自动持久化
到目前为止,save和bgsave都是手动的保存指令,那么会引入以下问题:
Redis提供了一种自动进行数据持久化的方式:指定时间范围内,发生变化(这个变化包括****)的key达到指定数量就进行持久化,需要在配置文件中进行一下配置:
save second changes
- second:监控时间范围
- changes:监控key的变化量
save 900 1 # 900s内有1个key发生变化,则进行bgsave持久化
save 300 10 # 300s内有10个key发生变化,则进行bgsave持久化
save 60 10000 # 60s内有10000个key发生变化,则进行bgsave持久化
修改配置conf文件

启动服务程序

客户端添加一个数据

查看服务器是否进行了持久化(rdb文件已提前清空)

客户端再添加一条数据,此时服务器按照配置文件,自动执行bgsave

此时服务器的rdb文件已经出现


无论get多少次,数据都不会改变,不会进行持久化;由于不进行数据比对,也就意味着对同一个数据连续修改两次,也会进行持久化
save使用注意事项:
- save配置要根据实际业务情况进行设置,持久化的频度过高或过低都会出现性能问题,结果可能是灾难性的
- save配置中对second与changes设置通常具有互补对应关系,尽量不要设置成包含性关系
- save配置启动后执行的是bgsave操作
5. RDB三种启动方式对比
由于,这里只比较save和bgsave

- save:由单进程执行,是同步的;save和其他的客户端请求都是排队处理的,若执行时间过长会阻塞其他指令;没有fork子进程,无额外内存消耗
- bgsave:由子进程执行,主进程可以继续处理其他请求,不会阻塞其他指令,是异步的,同时有额外内存开销(子进程)
6. rdb特殊启动形式
- 全量复制(在主从复制中用到)
- 服务器运行过程中重启
debug reloads
- 关闭服务器时指定保存数据
shutdown save
触发快照的方式:
1、执行shutdown命令,会触发快照
2、flushall命令,也会触发快照。
3、手动执行save命令,也可以触发快照。(bgsave (异步)命令)
4、在指定的时间间隔内,执行指定次数的写操作。
7. RDB优缺点
RDB优点
- RDB是一个紧凑压缩的二进制文件,存储效率较高
- RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
- RDB恢复数据的速度要比AOF快很多
- 应用:
RDB缺点
- Redis的众多版本中未进行RDB文件格式的版本不统一,
RDB存储的弊端
- 存储数据量较大,效率较低——基于快照思想,
- 基于fork创建子进程,内存产生额外消耗
优点
1、适合大规模的数据恢复,与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些 2、如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
1、对数据的完整性与一致性不高。
2、备份时占用内存