前言
RDB
-
RDB持久化是把当前进程数据生成快照保存到硬盘的过程, 触发RDB持久化过程分为手动触发和自动触发。
-
RDB完成后会自动生成一个文件,保存在
dir
配置的指定目录下,文件名是
dbfileName
指定。
-
Redis默认会采用LZF算法对生成的RDB文件作压缩处理,压缩后的文件远远小于内存大小,默认开启。
手动触发
自动触发
-
除了手动触发RDB,Redis服务器内部还有以下几个场景可以自动触发RDB:
-
根据咱们的
save m n
配置规则自动触发。
-
若是从节点执行全量复制操做, 主节点自动执行bgsave生成RDB文件并发送给从节点。
-
执行
debug reload
命令从新加载Redis时, 也会自动触发save操做。
-
默认状况下执行shutdown命令时, 若是没有开启AOF持久化功能则自动执行
bgsave
。
RDB执行流程
-
RDB的主流方式就是bgsave,经过下图咱们来看看RDB的执行流程:
-
经过上图能够很清楚RDB的执行流程,以下:
-
执行bgsave命令后,会先判断是否存在AOF或者RDB的子进程,若是存在,直接返回。
-
父进程fork操做建立一个子进程,fork操做中父进程会被阻塞。
-
fork完成后,子进程开始根据父进程的内存生成临时快照文件,完成后对原有的RDB文件进行替换。执行
lastsave
命令能够查看最近一次的RDB时间。
-
子进程完成后发送信号给父进程,父进程更新统计信息。
RDB的优势
RDB的缺点
AOF
如何开启AOF
AOF总体的执行流程
命令写入
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
复制代码
文件同步
-
Redis提供了多种AOF缓冲区同步文件策略, 由参数
appendfsync
控制,以下:
-
配置为
always
时, 每次写入都要同步AOF文件, 在通常的SATA硬盘上,Redis只能支持大约几百TPS写入, 显然跟Redis高性能特性背道而驰,不建议配置。
-
配置为
no
,因为操做系统每次同步AOF文件的周期不可控,并且会加大每次同步硬盘的数据量,虽然提高了性能,但数据安全性没法保证。
-
配置为
everysec
(默认的配置),是
建议的同步策略, 也是默认配置,作到兼顾性能和数据安全性。理论上只有在系统忽然宕机的状况下丢失1秒的数据(固然,这是不太准确的)。
文件重写机制
-
随着命令不断写入AOF, 文件会愈来愈大, 为了解决这个问题, Redis引入AOF重写机制压缩文件体积。 AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。
-
为何要文件重写呢? 由于文件重写可以使得AOF文件的体积变得更小,从而使得能够更快的被Redis加载。
-
-
auto-aof-rewrite-min-size
:表示运行AOF重写时文件最小体积, 默认为64MB。
-
auto-aof-rewrite-percentage
:表明当前AOF文件空间(
aof_current_size
) 和上一次重写后AOF文件空间(
aof_base_size
) 的比值。
-
自动触发时机至关于
aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage。其中
aof_current_size
和
aof_base_size
能够在
info Persistence
统计信息中查看。
-
那么文件重写后的AOF文件为何会变小呢? 有以下几个缘由:
-
进程内已经超时的数据将不会再次写入AOF文件中。
-
旧的AOF文件含有无效命令,如
del key1
、
hdel key2
等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
-
多条写命令能够合并为一个, 如:
lpush list a
、
lpush list b
、
lpush listc
能够转化为:
lpush list a b c
。为了防止单条命令过大形成客户端缓冲区溢出,对于
list
、
set
、
hash
、
zset
等类型操做,以64个元素为界拆分为多条。
-
介绍了文件重写的系列知识,下面来看看Redis内部是如何进行文件重写的,以下图:
-
看完上图,大体了解了文件重写的流程,对于重写的流程,补充以下:
-
重写期间,主线程并无阻塞,而是在执行其余的操做命令,依然会向旧的AOF文件写入数据,这样可以保证备份的最终完整性,若是数据重写失败,也能保证数据不会丢失。
-
为了把重写期间响应的写入信息也写入到新的文件中,所以也会为子进程保留一个缓冲区,防止新写的文件丢失数据。
-
重写是直接把当前内存的数据生成对应命令,并不须要读取老的AOF文件进行分析、命令合并。
-
AOF文件直接采用的
文本协议
,主要是兼容性好、追加方便、可读性高可认为修改修复。
-
不管是
RDB
仍是
AOF
都是先写入一个临时文件,而后经过
重命名
完成文件的替换。
AOF的优势
AOF的缺点
AOF和RDB的区别
重启加载
性能问题与解决方案
总结