持久化即备份,这是单机高可用的策略之一,有了备份,就能够在Redis故障经过备份进行恢复。redis持久化主要有RDB和AOF。linux
RDBredis
RDB(Redis DataBase),基于策略定时将redis内存中的数据保存到硬盘。须要时能够经过这个备份文件进行恢复。安全
AOF服务器
AOF(Append Only File),是把每次redis执行的命令记录到日志文件中(相似于MySql的Bin log),当Redis启动时能够经过执行log中的命令来恢复数据app
save命令:阻塞当前redis服务器,直到RDB过程完成,服务器在阻塞期间不能处理如何客户端请求,原则上save命令已经废弃。函数
bgsave命令:会fork一个子进程,RDB的持久化由这个子进程来完成,阻塞只发生在fork阶段,耗时较短,子进程执行rdb期间redis服务器不会阻塞,正常处理客户端请求。性能
自动触发机制:在redis.conf 配置:操作系统
save m n
表明若是在m秒内存在n次的修改时,则执行bgsave命令线程
优势日志
缺点
为了解决实时持久化问题,redis引入了AOF。
AOF默认是关闭的,经过以下命令开启:
appendonly yes
AOF工做基本流程:
命令写入
对于每一条redis写入命令,在AOF中会追加一条文本,文本格式是redis文本协议格式(RESP),直接采用协议格式,以来兼容性和可读性高,二来避免了二次处理的开销。
若是直接把命令写入硬盘会影响到redis的性能。先写入aof_buf,而后后期经过同步策略写入硬盘,避免直接的IO影响到redis的性能。
文件同步
redis提供了多种AOF缓冲区文件同步策略,同步策略分别使用了操做系统的wirte函数和fsync函数,说明以下:
write: 会触发延迟写(delayed write)操做,为了性能,linux在内核提供了页缓冲区用来提升硬盘的IO性能,write操做在写入系统缓冲区后直接返回,后期同步硬盘操做依赖于操做系统调度(好比按时,或者缓冲区慢等)。若是在同步前出现系统宕机故障,缓冲区的数据会丢失。
fsync: 强制操做系统将缓冲区的操做同步到硬盘。
由appendfsync参数控制:
可配置的值 | 说明 |
---|---|
always | 命令写入buf后调用系统调用fsync同步AOF文件,fsync完成后线程返回 |
no | 命令写入buf后调用系统调用write操做,后续fsync同步操做由操做系统来完成,通常为30秒一次。 |
everysec | 命令写入buf后调用系统调用write操做,后续fsync同步操做专门线程每一秒调用一次。 |
everysec是always和no的折中,是性能和安全性的这种,是redis默认的配置,也是比较推荐的配置。
文件重写
文件重写就是把Redis进程里面的最新数据转化为写命令而后同步到aof文件的过程,经过重写不但能够减少aof文件的体积,从而进一步提升aof文件在恢复过程当中的加载速度。
由如下缘由能够经过aof重写减小aof文件的体积:
触发机制:
手动触发:执行bgrewriteaof命令
自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数肯定自动触发时机:
auto-aof-rewrite-min-size:表示运行aof重写时文件的最小体积,默认为64MB
auto-aof-rewrite-percentage:表示当前aof文件的size(aof_current_size)和上一次重写后aof文件的size(aof_base_size)的比值。
只有当以上两个条件同时知足时,才会触发自动aof
aof重写流程: