redis之持久化RDB
持久化介绍
什么是持久化
- 将内存中的数据保存至永久性存储介质称为持久化
为什么要持久化?
- 防止数据的意外丢失,确保数据安全性
持久化过程保存什么
- RDB:快照形式,保存当前数据状态,存储数据结果,存储格式简单,关注点在数据
- AOF:日志形式,保存数据的操作过程,存储操作过程,存储格式复杂,关注点在数据的操作过程
持久化之RDB(数据快照)
命令
save
作用
手动执行一次保存操作
了解
RDB启动方式-save指令相关配置
bgsave指令
sava指定工作原理
Redis是单线程的,所有命令都会在队列中排好队,不建议使用save指令,因为save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成,有可能会造成长时间阻塞,线上环境不建议使用
解决方法
命令
bgsave
作用
手动启动后台保存操作,但不是立即执行
1. 客户端发送bgsave后,redis会选择一个合适的时间执行后台执行,并不是像save一样收到指令立即执行
2. bgsave命令是针对save阻塞问题做的优化,Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用
bgsave工作原理
bgsave指令的相关配置
RDB启动方式-save配置-自动执行
配置
save second changes
作用
满足限定时间范围内的key的变化数量达到了指定数量即进行持久化
参数
second:监控时间范围
changes: 监控key的变化量
位置 在conf文件中进行配置
无论get多少次,数据都不会改变,不会进行持久化;由于不进行数据比对,也就意味着对同一个数据连续修改两次,也会进行持久化
RDB三种启动方式对比
- save:由单进程执行,是同步的;save和其他的客户端请求都是排队处理的,若执行时间过长会阻塞其他指令;没有fork子进程,无额外内存消耗
- bgsave:由子进程执行,主进程可以继续处理其他请求,不会阻塞其他指令,是异步的,同时有额外内存开销(子进程)
RDB的特殊启动方式
全量复制(在主从复制中用到)
服务器运行过程中重启
debug reload
关闭服务器时指定保存数据
shutdown save
RDB 的优缺点
RDB优点
- RDB是一个紧凑压缩的二进制文件,存储效率较高
- RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
- RDB恢复数据的速度要比AOF快很多
- 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复
RDB缺点
- save频率低容易丢数据,save频率高会影响请求处理速度
- bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
- Redis的众多版本中未进行RDB文件格式的版本不统一,有可能出现这个版本的redis生成的rbd文件,用其他版本的redis打不开
RDB存储的弊端
- 存储数据量较大,效率较低——基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低
- 大数据量下的IO性能较低
- 基于fork创建子进程,内存产生额外消耗
- 宕机会带来数据丢失