redis提供了两种长久化的机制 RDB和AOF机制
RDB(redis Database):RDB保留某一个工夫点之前的快照数据。
AOF(Append-Only File):指所有的命令行记录以redis命令申请协定的格局齐全长久化存储保留为AOF文件
混合长久化(4.0版本当前):指进行AOF重写时子过程将以后工夫点的数据快照保留为RDB文件格式,而后将父过程累计命令保留为AOF格局。
RDB快照有两种触发形式
1:为通过配置参数,如下:
通过肯定的工夫周日内看,命令执行的个数,超过阈值立刻执行快照生成
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长久化的具体过程
1:主过程会fork一个子过程
2:子过程会共享一部分主过程的数据空间,并且把共享的数据置为read-only的状态,在这个过程中,子过程以rdb的协定来履行长久化
3:在长久化的过程中是防止不了有新的数据写入的,因为咱们有一部分的数据是共享的,两个过程同时领有一块数据,必定会导致数据不统一的问题,
然而依赖于操作系统的fork机制,在批改的时候肯定是批改局部内存页的数据,这个时候会触发对应内存页的copyonwrite的操作,不会影响子过程完
成长久化,长久化完结后,主过程会对子过程进行回收
RDB的文件格式
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开启
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的安全性
关注我的技术公众号,每周都有优质技术文章推送。
微信扫一扫下方二维码即可关注: