Redis持久化机制
Redis的持久化
众所周知,Redis中数据存储及读写操作都是在内存中进行。Redis宕机或者重启后,内存中的数据就会被清除,这是很不安全的。为了解决这个问题,Redis提供了持久化机制,就是将内存中的数据保存在硬盘上,一旦Redis宕机,重启后,数据也能马上恢复,Redis的持久化这时候就显得特别重要。Redis提供了两种持久化存储:AOF和RDB,下面我们一起来了解一下。
1、RDB介绍
RDB 是以二进制文件,在某个时间 点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复的目的,简单理解就是每隔一段时间记录数据快照。
1.1、RDB的触发方式
触发方式一:通过配置参数设置,如save 60 1000,其含义是如果在60s内,有1000个key发生变化,则会触发一次RDB快照的执行。
触发方式二:通过在客户端执行命令bgsave手动触发,命令执行后,Redis会调用bgsaveCommond函数,该函数会fork一个子进行执行实际的快照存储工作,而主进程可以继续处理客户端的请求。
1.2、RDB的优缺点
RDB的优点:1、使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能。
2、一旦Redis发生故障,恢复数据的时间也比较短。
RDB的缺点:1、RDB 是间隔一段时间进行持久化,如果持久化期间 Redis发生故障,在QPS较高的情况下,会发生大量数据丢失的情况,所以这种方式更适合数据要求不严谨的时候。
2、RDB经常需要Fork()才能使子进程将数据持久化存储在磁盘上。如果数据集很大,会比较耗时。
2、AOF介绍
AOF是以格式化指令的方式追加到操作日志文件的尾部,换句话说,你执行过的指令都被记录在一个文件上,如果想要恢复数据,将执行过的指令再执行一遍即可,是不是感觉和mysql中的bin.log十分的相似。AOF理论上可以做到发生故障时只丢失执行一条指令的操作,但是鱼与熊掌不可兼得,其代价就是通过消耗Redis的性能换来的。
2.1、AOF的执行流程及文件写入频次
一旦在配置开启了AOF持久化的方式,每条指令执行完毕都会同步写入到aof_buf(缓冲区)中,还需要再将缓冲区中的内容写入到文件中,真正写入磁盘还需要调用fsync函数,这是一个阻塞并且缓慢的操作,所以Redis提供了3种模式来控制执行fsync的频次:
no:Redis不处理交给操作系统来处理,性能最高,但是也最不安全。
always:每次执行指令,都会调用fsync把每个写命令都立即同步到aof文件中,性能最低,但是最安全。
everysec:每一秒执行一次fsync操作,是折中方案,在性能和安全里面做平衡性选择,建议在生产环境中使用:appendfsync everysec。
2.2、AOF重写及触发方式
有这样一种情况,假设对同一个key进行了十万八千次操作,如果每一个指令都记录,那会使AOF的文件变得很大,这时候,AOF文件的重写就登场了。重写简单的理解:我往一个集合中添加了四个元素,+1,+2,+3,+4,得记录四次操作,重写后只需要记录一次,+(1,2,3,4),就像mysql中执行多次insert和批量插入的道理是一样的。
AOF重写触发方式有两种:
触发方式一:通过配置自动触发,如auto-aof-rewrite-min-size 64mb,auto-aof-rewrite-percentage 100这两个配置,他们的意思是当AOF的文件大于64MB,并且比上一个文件增加了100%时,则会触发重写。
触发方式二:通过客户端输入指令,bgrewriteaof手动触发,通过创建子进程完成重写操作;重写时如果父进程依然在处理大量的请求,那么如何保证重写后得文件包含这些指令呢?1、首先需要将父进程在执行重写的过程中运行的指令进行保存。2、再将这些指令在重写后的文件中进行回放。
2.3、AOF的优缺点
优点:数据更加安全。如果系统对数据安全要求较高,可以选择AOF。
缺点:1、AOF文件通常比同一数据集的等效RDB文件大,恢复数据时也相对较慢。
2、会降低Redis的性能。
3、RDB&AOF混合持久化
混合持久化方案是一种RDB持久化与AOF持久化同步使用的持久化方案,兼顾了二者的优点。当AOF重写时,子进程会将当前时间点的数据快照保存为RDB文件格式,然后将父进程积累的命令保存为AOF格式。Redis4.0以后提供,需要手动开启,修改配置aof-use-rdb-preamble yes即可,在Redis5.0中,已经默认开启混合持久化方案。
混合持久化方案,其实加载的仍然是AOF文件。它的加载流程是,首先会去识别AOF文件是否是以"REDIS"字符串开头,RDB文件其实就是以“REDIS”字符串开头,如果是,就以RDB格式加载,加载完RDB后继续按AOF格式加载剩余部分。
Redis的持久化机制十分的重要,这些知识点也是学习Redis必须要掌握的知识。大家看完后,在日常工作中,可以根据自己的实际情况,选择适合自己的持久化方法。
参考:《Redis5设计与源码分析》