第10章 RDB
Redis提供了RDB持久化功能,这个功能可以将Redis内存中的数据库状态保存到磁盘里面,避免数据意味丢失。 RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。
10.1 RDB文件的创建与载入
生成RDB文件的两个命令:
- SAVE命令:会阻塞redis服务器进程,阻塞期间不能处理任何命令请求;
- BGSAVE命令:派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。
总结
- 服务器状态中会保存所有用save选项设置的保存条件,当任意一个保存条件被满足时,服务器会自动执行BGSAVE命令;
- RDB文件是一个经过压缩的二进制文件,由多个部分组成;
- 对于不同类型的键值对,RDB文件会使用不同的方式来保存它们。
第11章 AOF
AOF持久化是通过Redis服务器所执行的写命令来记录数据库状态,而RDB持久化是通过保存数据库中的键值对来记录数据库状态。
11.1 AOF持久化实现
AOF持久化功能的实现可以分为命令追加、文件写入、文件同步三个步骤。
11.3 AOF重写
为了解决AOF文件膨胀的问题,redis提供了AOF过后才能够写的功能,redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新的AOF文件的体积通常会比旧的AOF文件的体积要小得多。
11.3.1 重写的原理
首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多命令,这就是AOF重写功能的实现原理。
11.3.2 后台重写的原理
使用子进程做AOF重写期间,服务器进程还需要继续处理命令请求,而新的命令可能会对现有的数据库状态进行修改,从而使得服务器当前的数据库状态和重写后AOF文件所保存的数据库状态不一致。
为了解决这种数据不一致问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后开始使用,当redis服务器执行完一个写命令之后,它会同时将这个写命令发送给AOF缓冲区和AOF重写缓冲区。
这样可以保证:
- AOF缓冲区的内容会定期被写入和同步到AOF文件,对现有AOF文件的处理工作会如常进行
- 从创建子进程开始,服务器执行的所有写命令都会被记录到AOF重写缓冲区里面。
当子进程完成AOF重写工作之后,它会向父进程发送一个信号,父进程在接到该信号之后,会调用一个信号处理函数,并执行以下工作:
- 1.将AOF重写缓冲区中的所有内容写入到AOF文件中,这时新AOF文件所保存的数据库状态将和服务器当前的数据库状态一致。
- 2.对新的AOF文件进行改名,原子地覆盖现有的AOF文件,完成新旧两个AOF文件的替换。
这样在整个AOF后台重写过程中,只有信号处理函数执行时会对服务器进程造成阻塞,在其他时候,AOF后台重写都不会阻塞父进程,这将AOF重写对服务器性能造成的影响降到了最低。
11.4 重点回顾
- AOF重写是有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有AOF文件进行任何读入、分析或者写入操作。
- AOF重写可以产生一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样,但体积更小。