Redis持久化
首先redis中的数据都保存在内存中,这样可以保证较快的操作速率,但内存中的东西不是持久的,当发生断电等重大故障的时候,会导致内存中的数据丢失
redis持久化就是为了解决这一问题而将redis中的数据持久化到磁盘上,防止因发生灾难性故障时,而导致redis中的数据全部丢失
redis提供了两种持久化的方式,分别是RDB和AOF
RDB:通过对redis数据进行快照,然后将快照持久化到磁盘中
AOF:将执行过的指令记录下来,追加到一个文件末尾
AOF和RDB可以同时进行使用,在redis重启或者灾难性修复的时候,使用AOF可以使数据恢复的完整性更高
RDB持久化机制
RDB当满足条件的时候对redis中的数据库进行持久化,条件一般是
save 900 1
save 300 10
save 60 10000
意思是60秒内redis写入一万条数据,5分钟内redis写入10条数据,15分钟内redis写入11条数据,则将redis中的数据进行持久化,当然也可以通过save和bgsave命令主动进行持久化。
当要进行持久化时,redis会保存当前时间点的全量数据快照,然后redis会fork一个子进程来进行持久化,但主进程在持久化过程中不会进行任何的IO操作,也就是redis无法响应其他命令
fork完成后,redis会先将数据写入到一个临时的文件当中,等持久化结束,才会用该文件替换上一次持久化的文件
优点
1.适合对大规模数据的恢复
2.基于RDB来重启和恢复数据更加的快速
缺点
1.fork进行会导致redis的内存翻倍
2.由于是数据的全面同步,数据量太大会由于IO影响性能
3.如果redis出现故障,会导致丢失当前到最近一次持久化之间的数据
AOF持久化机制
AOF,英文是Append Only File,意思是只允许追加不允许修改的文件。
AOF机制,是将redis执行过的写指令记录下来,在需要恢复的时候,将指令从头到尾执行一遍即可
AOF机制默认是关闭的,需要通过配置redis.conf中的appendonly yes打开AOF功能,AOF持久化策略每秒中执行一次,将redis中缓存的指令,持久化到磁盘中,这样就会丢失,也只会丢失这一秒的指令
因为AOF一直在末尾增加新的指令,如果不对文件进行处理,会导致文件越来越大。
redis支持对AOF文件进行重写,当文件的大小超过所设置的阀值的时候,redis就会对AOF文件进行压缩,去掉过期的,重复的、没有用的指令,只保留能恢复数据的最小指令集。
AOF重写过程
1.跟RDB一样先进行fork,创建一个子进程
2.子进程将新的AOF写到一个临时文件里面
3. 主进程继续将变动写到内存和旧的AOF文件当中
4. 当子进程完成重写之后,向主进程发送信号,主进程接受到信号将新指令写到新的临时文件当中
5. 用临时文件替换旧的AOF文件,成为新的AOF文件。
优点
1.可读性高,数据不易丢失
2.只能在末尾追加,没有磁盘的寻址开销,写入性能高,
缺点
1.AOF文件通常比RDB文件更大
2.数据的还原数度也更慢