什么是 Redis 持久化?
Redis 的数据全部在内存里,如果突然宕机,就会造成数据丢失,因此必须有一种机制来保证 Redis 的数据不会因故障而丢失,这种机制就是持久化机制。持久化机制主要有三种:RDB、AOF、混合持久化(redis 4.0引入)。
RDB 持久化
RDB 全称为 Redis Database Backup file(Redis 数据备份文件),也叫 Redis 数据快照,简单来说就是把 redis 内存中的所有数据都记录到磁盘中,当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。
- 快照文件称为RDB文件,默认保存在redis当前运行目录。
- 下图为Redis内部触发RDB的机制,可以在redis.conf文件中找到,默认情况下redis停机时也会执行一次快照。
- 为什么redis不利用主进程进行持久化的原因?
首先我们都知道 redis 是单线程的,如果用redis主进程来执行持久化,会阻塞客户端请求所有的命令。因为单线程在处理线上业务请求的同时,还需进行内存快照,而内存快照涉及到内存到磁盘的IO操作,IO操作是会严重影响服务器性能,因此redis为了持久化过程中不阻塞线上业务(可以一边持久化,一边响应客户端请求)引入了多进程(fork子进程)快照。
- 快照原理
Redis在持久化时会调用fork函数产生子进程,快照持久化完全由子进程来处理,父子进程共享内存数据。存在一种场景:子进程在持久化过程中,父进程持续接受到客户端请求,对redis的内存数据进行修改,这个时候就会使用操作系统的COW(copy-on-write)机制进行数据段页面分离。数据段是由多个页面组成,当父进程需要对某个页面的数据进程修改时,就会把共享页面复制一份分离出来,然后对这个复制的页面进行修改,这时子进程对应的页面数据时没有发生变化的并且只能进行读操作(ready-only),这就实现了数据在读写时的隔离。
AOF 持久化
AOF 全称为 Append Only File(追加文件),Redis 会把每一个写命令记录在 aof 文件,aof 文件可以看作是写命令的日志文件
- AOF写命令的频率可以通过redis.conf文件来配置
*** AOF三种刷盘方式的优缺点**
- AOF重写
AOF记录的是全量写命令,所以AOF文件体积远比RDB文件大,而且AOF会记录对同一个key的多次修改记录,但是其实这个key最后一次修改才是有意义的。通过bgrewriteaof命令让AOF文件执行重写功能,实现记录最少的命令达到相同的效果,效果如下图所示。
AOF和RDB优缺点对比
混合持久化
混合持久化(redis 5以上版本默认):是RDB和AOF这两种方式的结合体。当开启混合持久化时,fork出子进程将当前全量的数据以rdb方式写入新的AOF文件,再将AOF持久化过程中(持久化开始到持久化结束)缓存区增量命令以aof方式也写入到新文件中,前半段为rdb格式的全量数据,后半段为aof的增量数据,将新文件替换旧的aof文件。混合持久化发生在AOF重写过程。