参考:黄健宏 著. Redis设计与实现 (数据库技术丛书) . 机械工业出版社. Kindle 版本.
一、对持久化的理解
Redis 平时的键值对都是在内存中的,但是一旦意外中断或关闭连接,我们将丢失数据。
为了避免这种情况,就有一个持久化的机制,在某种条件下将数据以某种方式转储到文件中,下次启动服务器时可以通过持久化文件恢复数据。
二、持久化的方式
Redis 提供了两种方式,分别是RDB 和 AOF,两者最大的区别是 RDB 存储的是数据库状态(键值对),AOF 则是通过保存 Redis 服务器所执行的命令来记录数据库状态。
三、RDB
3.1 RDB文件的创建与载入
RDB持久化可以手动执行,也可以根据配置定期执行。
RDB持久化生成一个经过压缩的二进制文件,通过这个文件可以还原生成文件时的数据库状态。
两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
SAVE命令会阻塞 Redis 服务器进程, 直到 RDB 文件创建完毕为止, 在服务器进程阻塞期间, 服务器不能处理任何命令请求。而BGSAVE会派生出一个子进程。
如果服务器开启 了AOF 持久化功能, 那么服务器会优先使用 AOF 文件来还原数据库状态。
3.2 自动间隔性保存
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
四、AOF
4.1 AOF持久化的实现
AOF持久化保存数据库状态的方法是将服务器执行的SET、SADD、RPUSH等命令保存到AOF文件中。
服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态。
AOF持久化的实现可以分为命令追加、文件写入、文件同步三个步骤。
命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。
文件写入和同步:不同appendfsync值产生不同的持久化行为
always每次都要写入、同步,所以其安全性最高,效率是最慢的;everysec效率也足够快,也安全性也可以得到保证;no效率最高,但安全性比较差。
4.2 AOF文件的载入与数据还原
AOF文件中记录了数据库中所有写操作的命令,所以服务器只需要重新执行一遍AOF文件中的命令即可恢复服务器关闭之前的状态。步骤如下:
- 创建一个不带网络连接的伪客户端;
- 从AOF文件中分析并读取一条写命令;
- 使用伪客户端执行被读出的写命令
4.3 AOF重写
随着AOF文件中的内容越来越多,体积越来越大,使用AOF文件进行数据还原也会耗费更多时间。
为了解决AOF文件体积膨胀的问题,Redis会创建一个新的AOF文件来替代。
实际上, AOF 文件重写并不需要对现有的 AOF 文件进行任何读取、 分析或者写入操作, 这个功能是通过读取服务器当前的数据库状态来实现的。
首先从数据库中读取键现在的值, 然后用一条命令去记录键值对, 代替之前记录这个键值对的多条命令, 这就 是 AOF 重写功能的实现原理。
如果redis开始基于rdb进行的持久化,之后通过appendonly yes 打开了aof,这时重新启动redis后会根据aof进行载入,所以原来所有的数据无法加载到数据库中。