redis的两种持久化的机制,你真的了解么?

redis提供了两种持久化的机制 RDB和AOF机制linux

RDB(redis Database):RDB保存某一个时间点以前的快照数据。redis

AOF(Append-Only File):指全部的命令行记录以redis命令请求协议的格式彻底持久化存储保存为AOF文件缓存

混合持久化(4.0版本之后):指进行AOF重写时子进程将当前时间点的数据快照保存为RDB文件格式,然后将父进程累计命令保存为AOF格式。安全

RDB快照有两种触发方式微信

1:为经过配置参数,以下:app

经过必定的时间周日内看,命令执行的个数,超过阈值当即执行快照生成性能

save 900 1  //900秒内有1次更新
save 300 10 //30秒内有10次更新
save 60 10000  //60秒内有10000次更新

2:手动执行bgsave/save,手动触发生成快照
直接执行save会阻塞主进程,bgsave的话会fork一个子进程完成快照操作系统

可是redis在发生RDB持久化的过程当中有几个问题须要思考命令行

1.RDB快照过程当中Redis是否会中止对外服务线程

2.若是不回中止服务,那如何处理新的请求

接下来咱们看redis的

RDB持久化的具体过程

file
1:主进程会fork一个子进程

2:子进程会共享一部分主进程的数据空间,而且把共享的数据置为read-only的状态,在这个过程当中,子进程以rdb的协议来实行持久化

3:在持久化的过程当中是避免不了有新的数据写入的,由于咱们有一部分的数据是共享的,两个进程同时拥有一块数据,确定会致使数据不一致的问题,
可是依赖于操做系统的fork机制,在修改的时候必定是修改部份内存页的数据,这个时候会触发对应内存页的copyonwrite的操做,不会影响子进程完
成持久化,持久化结束后,主进程会对子进程进行回收

RDB的文件格式
file

  • redis的rdb文件是一个很是紧凑的格式

  • 开头的REDIS是固定的一个格式,redis在读取持久化文件的时候发现不是以REDIS开头的会报错

  • 0006是RDB_VERSION当前RDB协议的版本

  • AUX_FIELD_KEY_VALUE_PAIRS是一些辅助的字段

  • data则为保存的数据,数据首先会选择redis_db,db选择以后就是键值对的数据,对应的键值对又会分为设置过过时时间和未设置过时时间的数据

RDB持久化的优势

1:二进制的数据很是紧凑,数据的恢复速度很是快

2:在持久化的过程当中,性能最大化,fork子进程来完成写操做,让主进程继续处理命令,使用单独子进程来进行持久化,保证了redis的高性能

RDB持久化的缺点

1:数据安全性低,RDB是间隔一段时间进行持久化,若是持久化之间redis发生了故障,会发生数据丢失

2:linux fork以后,kernel把父进程中全部的内存页权限都设置readonly,而后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,因而触发页异常终端(page-fault),陷入kernal的一个中断例程。中断例程中,kernel的copyonwrite机制就会把触发的异常页复制一份,因而父子进程各自持有独立的一份。若是这个时候有大量的写入操做,会产生大量的分页错误(页异常中断page-fault
),这样就得耗费很多性能在复制上。

AOF持久化执行流程

经过appendonly yes开启

file

Redis使用单线程响应命令,若是每次AOF文件命令都追加到磁盘,会极大的影响处理性能,因此Redis先写入aof缓冲区,根据用户配置的同步磁盘策略写入aof文件中,能够经过appendfsync参数配置同步策略:含义以下

appendfsync always #表示每次更新操做后手动调用fsync()将数据写入到磁盘
appendfsync everysec #表示每秒同步一次(折中方案,默认值)
appendfsync no  #表述等操做系统进行数据缓存同步到磁盘(快速响应客户端,不对AOF作数据同步,同步文件由操做系统负责,一般同步周期最长30S)

AOF重写机制

随着命令得不断写入AOF,文件会愈来愈大,为了解决这个问题Redis引入了AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程,AOF重写机制能够经过手动触发了自动触发

手动触发:bgreweuteaof命令

自动触发:

auto-aof-rewrite-percentage 100 #表示当前AOF文件空间和上一次重写后AOF文件空间的比值(100%)
auto-aof-rewrite-min-size 64mb #表明AOF重写时文件最小体积

AOF的优势:数据安全,AOF持久化能够配置appendfsync属性,有always,每进行一次命令操做就记录到aof文件中一次。

AOF的缺点:数据集比较大的时候,比RDB启动效率低

混合持久化

能够经过aof-use-rdb-preamble yes开启

加载时,首先会识别AOF文件是否以REDIS字符串开头,若是是,就按照RDB格式加载,加载完RDB后继续按AOF格式加载剩余部分。
混合式持久化方案兼顾了RDB的速度,和AOF的安全性

关注个人技术公众号,每周都有优质技术文章推送。
微信扫一扫下方二维码便可关注:
file