该笔记来自 《redis开发与运维》(付磊)
1 rdb
描述:当前进程数据快照保存
触发方式:手动、自动
手动触发对应命令:save bgsave
save: 阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,
线上环境不建议使用,该命令已经废弃
bgsave:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。
阻塞只发生在fork阶段,一般时间很短
自动触发RDB
第一种:使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave
第二种:如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
第三种:执行debug reload命令重新加载Redis时,也会自动触发save操作
第四种:默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave
RDB文件的处理
保存:RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配置指定。可以通过执行
config set dir{newDir}和config setdbfilename{newFileName}
运行期动态执行,当下次运行时RDB文件会保存到新目录
RDB的优缺点
优点:
第一:RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据
快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份,
并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复
第二:Redis加载RDB恢复数据远远快于AOF的方式
缺点:
第一:RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运
行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高
第二:存在老版本Redis服务无法兼容新版RDB格式的问题
2、AOF
描述:以独立日志的方式记录每次写命令,
重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用
是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式
使用配置
appendonly yes,默认不开启
appendfilename:文件名
dir:指定保存路径
AOP缓冲策略
always: 每次写入都要同步AOF文件,性能低,不建议配置
everySec:默认配置,建议策略,兼顾性能和稳定性;
no:由操作系统来将数据同步到硬盘,有效率但是不保证安全性。
重写机制
描述:Redis引入AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转
化为写命令同步到新AOF文件的过程
为啥aof文件体积可以变小:
第一:过时数据不再存入文件;
第二:旧的AOF文件含有无效命令,如del key1、hdel key2、srem keys、set
a111、set a222等。重写使用进程内数据直接生成
第三:多条写命令可以合并为一个,如:lpush list a、lpush list b、lpush list
c可以转化为:lpush list a b c。为了防止单条命令过大造成客户端缓冲区溢
出,对于list、set、hash、zset等类型操作,以64个元素为界拆分为多条
触发机制
手动触发:直接调用bgrewriteaof命令
自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参
数确定自动触发时机
auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB
auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和
上一次重写后AOF文件空间(aof_base_size)的比值
3、重启加载
第一:AOF持久化开启且存在AOF文件时,优先加载AOF文件
第二:AOF关闭或者AOF文件不存在时,加载RDB文件
第三:加载AOF/RDB文件成功后,Redis启动成功
第四:AOF/RDB文件存在错误时,Redis启动失败并打印错误信息