作者:天堂寨旅游2013_668 | 来源:互联网 | 2023-12-12 08:51
本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。
本笔记参考《Redis设计与实现》 P118 ~ P150
RDB文件
1、RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据
2、SAVE
命令由服务器进程直接执行保存操作,该命令会阻塞服务器
3、BGSAVE
命令由子进程执行保存操作,不会阻塞服务器
注意此时服务器的状态:在处理BGSAVE
命令时,服务器处理SAVE
、BGSAVE
、BGREWRITEAOF
三个命令方式与平时不同。
- 客户端发送的
SAVE
命令会被服务器拒绝,服务器禁止SAVE
命令与BGSAVE
同时执行,是为了避免父进程与子进程同时执行rdbSave
调用,产生竞争条件。 - 客户端发送的
BGSAVE
命令也会被服务器拒绝,因为同时执行两个BGSAVE
也会产生竞争条件。 - 最后:
BGSAVE
和BGREWRITEAOF
不能同时执行:因为两个命令实际工作都是由子进程执行,所以两个命令在操作方面没有冲突,但是并发出两个子进程,并且两个子进程都是同时执行大量的磁盘写入操作的话不是个好主意。
4、服务器状态中会保存所有用save
选项设置的保存条件,当任意一个保存条件被满足,服务器自动执行BGSAVE
5、RDB文件时一个经过压缩的二进制文件,由多个部分组成
6、对于不同类型的键值对,RDB文件会使用不同方式保存
AOF文件
1、APF文件通过保存所有修改数据库的写命令请求来记录服务器的数据库状态
2、AOF文件中的所有命令都是以Redis命令请求协议的格式保存的
3、命令请求会先保存到AOF缓冲区中,之后再定期写入并同步到AOF文件
4、appendfsync
选项的不同值对于AOF持久化功能的安全性以及Redis服务器的性能有很大影响
- 当
appendfsync
的值为always
时,服务器在每个事件循环都要将aof_buf
缓冲区中的所有内容写到AOF文件中,并且同步AOF文件,所以always
的效率最慢,但安全性最强,出现故障,AOF持久化也只会丢失一个事件循环中所产生的命令数据 - 当
appendfsync
的值为everysec
时,服务器在每个事件循环都要将aof_buf
缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步。效率足够快,出现故障也只会丢失一秒钟的命令数据 - 当
appendfsync
的值为no
时,服务器在每个事件循环都要将aof_buf
缓冲区中的所有内容写入到AOF文件中,何是同步由操作系统控制。该模式下的AOF文件写入速度最快,因为缓存了足够多的数据,但是出现故障会丢失上次同步AOF之后的所有写命令数据
5、服务器只要载入并重新执行保存在AOF文件中的命令,就可以还原数据库本来的状态(通过创建一个不带网络连接的伪客户端)
6、AOF重写可以产生一个新的AOF文件,新文件与原有文件所保存的数据库状态一样,但是体积更小
7、AOF重写的功能时通过读取数据库中的键值对来实现的,程序无须对现有AOF文件进行任何读入、分析或者写入操作
8、执行BGREWRITEAOF
命令时,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。当子进程完成创建新AOF文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新AOF文件的末尾,使得新旧两个AOF文件所保存的数据库状态一致。最后,服务器用新的AOF文件替换掉旧AOF文件,完成文件重写操作