目录
在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF
RDB
RDB (Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据
快照文件称为RDB文件,默认是保存在当前运行目录。
人工主动备份(bgsave)
假如保存的文件较大,由于save是使用主进程来操作,因此会阻塞其它操作,所以需要开启子进程避免其它操作受到影响
条件自动备份
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
以上表达的意思为3600秒内有一次修改就做一次RDB操作
你也可以根据实际需求来修改自动RDB的频率
RDB执行原理
由于在Linux中所有的进程都无法直接操作物理内存,而是由操作系统给每个进程分配一个虚拟内存,然后主进程只能操作虚拟内存,而后操作系统会维护一个虚拟内存与物理内存映射关系的表(页表)。
所以主进程操作虚拟内存,虚拟内存通过页表的映射关系到物理内存
Redis 在持久化时会调用 glibc 的函数 fork 创建一个子进程,fork时会把主进程的页表做拷贝到子进程,因此子进程有了与主进程相同的映射关系。当子进程操作自己的虚拟内存时因为与主进程的映射关系一样,所以就会映射到相同的物理内存区域。当子进程RDB时会写入一个新的RDB文件,写完之后在替换旧的RDB文件。
因此就实现了无需拷贝内存中的数据也能实现共享,这样就执行的时间就更快,阻塞的时间就更短
当子进程在RDB时会读取内存中的数据,但如果此时主进程在修改数据那么读与写会产生冲突,甚至会出现脏数据
copy-on-write技术
为了解决读写冲突fork采用的是copy-on-write技术:
- 当主进程执行读操作时,访问共享内存;
- 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
AOF
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件
可以看做是命令日志文件。
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:
AOF的命令记录的频率也可以通过redis.conf文件来配:
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
总结
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,可以结合两者来使用。