Redis的数据是保持在内存中的,但当服务器宕机时,内存中的数据会丢失,因此需要将内存中的数据持久化,使得内存数据丢失时能够重新载入。Redis的持久化方式有RDB和AOF两种
一、RDB持久化
Redis默认采用RDB持久化,可以将Redis在内存中的数据库状态保存到磁盘内,避免数据意外丢失。其中RDB文件是一个经过压缩的二进制文件。
1.RDB文件的创建
(1)当执行save命令或bgsave命令时,会生成RDB文件。两者的区别是,save命令会阻塞Redis服务器进程,此时服务器不能处理任何命令的请求,直至RDB文件创建完成;bgsave命令会派生出一个子进程,由子进程负责创建RDB文件,服务器进程继续处理客户端请求
(2)可通过修改save配置设置保存条件,如果满足以下配置的条件,即3600秒内对数据库至少修改一次、300秒内对数据库至少修改100次、60秒内对数据库至少修改10000次,其中一个条件得到满足,服务器就会执行bgsave命令
![]()
(3)当Redis服务器关闭时,会创建RDB文件

2.RDB文件的载入
在服务器启动时,会载入RDB文件,此时服务器处于阻塞状态,直至载入工作执行完毕。
二、AOF持久化
AOF(append only file)持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态的。可通过修改redis.conf文件中的配置开启AOF持久化。
![]()
appendonly 默认为no,若要开启AOF持久化功能,将no修改为yes
1.AOF功能实现
(1)命令追加:当AOF功能开启时,会将服务器执行的命令追加到服务器状态的aof_buf缓冲区末端
(2)AOF文件的写入和同步:服务器每执行一次事件循环之前,都会调用flushAppendOnlyFile函数,考虑是否将缓冲区的命令写入至AOF文件。其中flushAppendOnlyFile函数的行为由配置appendfsync选项的参数决定

- always:同步写回,每个事件循环都会立马同步写回至AOF文件,速度最慢,但可靠性最高
- everysec:默认选项,每秒将AOF缓冲区的命令写回至AOF文件
- no:由服务器决定何时将命令同步至AOF文件
2.AOF重写
因为AOF文件是通过记录服务器执行的写命令还保存数据库状态,随着时间推移文件会越来越大。为了解决文件体积膨胀的问题,Redis提供了AOF重写功能。
(1)AOF重写的实现:AOF文件重写不需要对现有的AOF文件进行读写分析,而是通过读取数据库状态,用一条写命令保存键值对。AOF重写是在子进程中执行的,在重写过程中,Redis服务器还会接受客户端发送的写命令,可能会对现有数据库状态进行修改,使得当前数据库状态和重写后AOF文件所保存的数据库状态不一致,因此Redis服务器设置了一个AOF重写缓冲区。在服务器创建子进程后开始使用,服务器每执行完一个写命令,会将该命令同时发送给AOF缓冲区和AOF重写缓冲区。当重写工作完成后,会将重写缓冲区的内容全部写入到新的AOF文件
三、对比
安全性:AOF模式由于提供了三种持久化策略,安全性更高,适用于对数据不丢失要求高的场景
载入速度:由于AOF文件实际保存的是服务器运行期间执行过的命令,重新载入时需要逐条执行,而RDB文件保存的是数据库的键值对,在重新载入时,RDB模式会更快

被折叠的 条评论
为什么被折叠?



