redis持久化两种方式

Redis持久化概述redis

Redis持久化分红两种方式:RDB(Redis DataBase)和AOF(Append Only File)数据库

1:RDB是在不一样的时间点,将Redis某一时刻的数据生成快照并存储到磁盘上缓存

2:AOF是只容许追加不容许改写的文件,是将Redis执行过的全部写指令记录下来,在下次app

Redis从新启动时,只要把这些写指令从前到后再重复执行一遍,就能够实现数据恢复了异步

3:RDB和AOF两种方式能够同时使用,在这种状况下,若是Redis重启的话,则会优先采用AOF函数

方式来进行数据恢复,这是由于AOF方式的数据恢复完整度更高工具

4:能够关闭RDB和AOF,这样的话,Redis将变成一个纯内存数据库,就像Memcache同样性能

5:经过配置redis.conf中的appendonly为yes就能够打开AOF功能日志

一,RDB进程

RDB方式,Redis会单首创建(fork)一个子进程来进行持久化,会先将数据写入到

一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。

整个过程当中,主进程是不进行任何IO操做的,这就确保了极高的性能

若是须要进行大规模数据的恢复,且对于数据恢复的完整性不是很是敏感,那RDB方

式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

RDB的问题

1:fork一个进程时,内存的数据也被复制了,即内存会是原来的两倍

2:每次快照持久化都是将内存数据完整写入到磁盘一次,并非增量的只同步脏数

据。若是数据量大的话,并且写操做比较多,必然会引发大量的磁盘io操做,可

能会严重影响性能。

3:因为快照方式是在必定间隔时间作一次的,因此若是redis意外down掉的话,就

会丢失最后一次快照后的全部修改。

  触发快照的状况

1:根据配置规则进行自动快照

2:用户执行save或bgsave命令

3:执行flushall命令

4:执行复制replication时

 save命令

执行Save命令时,Redis会阻塞全部客户端的请求,而后同步进行快照操做。

bgsave命令

执行bgsave命令时,Redis会在后台异步进行快照操做,快照同时还能够响应客户端

请求。能够经过lastsave命令获取最后一次成功执行快照的时间。

n flushall命令

这个命令会致使Redis清除内存中的全部数据,若是定义了自动快照的条件,那么无

论是否知足条件,都会进行一次快照操做;若是没有定义自动快照的条件,那么不会进行

快照

二,AOF

默认的AOF持久化策略是每秒钟fsync一次,fsync是指把缓存中的写指令记录到磁盘

中,在这种状况下,Redis仍能够保持很高的性能。

固然因为OS会在内核中缓存write作的修改,因此可能不是当即写到磁盘上。这样

aof方式的持久化也仍是有可能会丢失部分修改。不过能够经过配置文件告诉Redis,想要

经过fsync函数强制os写入到磁盘的时机。

AOF方式在同等数据规模的状况下,AOF文件要比RDB文件的体积大,所以AOF方式的

恢复速度也要慢于RDB方式。

AOF日志恢复

若是在追加日志时,刚好遇到磁盘空间满或断电等状况,致使日志写入不

完整,也没有关系,Redis提供了redis-check-aof工具,能够用来进行日志修

复,基本步骤以下:

1:备份被写坏的AOF文件

2:运行redis-check-aof –fix进行修复

3:用diff -u来看下两个文件的差别,确认问题点

4:重启redis,加载修复后的AOF文件

AOF重写

AOF采用文件追加方式,这会致使AOF文件愈来愈大,为此,Redis提供了

AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,Redis

就会启动AOF文件的内容压缩,只保留能够恢复数据的最小指令集。可使用命

令bgrewriteaof 。

AOF重写的触发机制

Redis是这样工做的:Redis会记录上次重写时的AOF大小。假如自启动至今尚未进

行太重写,那么启动时AOF文件的大小会被做为基准值,这个基准值会和当前的AOF大小进

行比较,若是当前AOF大小超出所设置的增加比例,则会触发重写。另外,你还须要设置一

个最小大小,是为了防止在AOF很小时就触发重写

AOF重写的基本原理

1:在重写开始前,redis会建立一个“重写子进程”,这个子进程会读取现有的AOF文件,并

将其包含的指令进行分析压缩并写入到一个临时文件中。

2:与此同时,主进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有

的AOF文件中,这样作是保证原有的AOF文件的可用性,避免在重写过程当中出现意外。

3:当“重写子进程”完成重写工做后,它会给父进程发一个信号,父进程收到信号后就会将

内存中缓存的写指令追加到新AOF文件中

4:当追加结束后,redis就会用新AOF文件来代替旧AOF文件,以后再有新的写指令,就都会追

加到新的AOF文件中

5:重写aof文件的操做,并无读取旧的aof文件,而是将整个内存中的数据库内容用命令的

方式重写了一个新的aof文件,这点和快照有点相似

相关文章
相关标签/搜索