Redis 数据持久化

Redis 以数据结构的形式将数据维持在内存中, 为了让这些数据在 Redis 重启之后仍然可用, Redis
分别提供了 RDB
和 AOF
两种持久化模式。
RDB 方式
RDB 持久化方式也叫“快照”方式,当符合一定条件时 Redis 会自动将内存中的所有数据生成一份副本并存储在硬盘上。
RDB 功能最核心的是 rdbSave
和 rdbLoad
两个函数,前者用于生成 RDB 文件到磁盘,而后者则用于将 RDB 文件中的数据重新载入到内存中
进行快照的时机
- 根据配置规则进行自动快照
- 用户执行 SAVE或 BGSAVE命令
- 执行 FLUSHALL命令
- 执行复制(replication)时
RDB文件的创建与载入
创建:
rdbSave
用于生成RDB文件, SAVE
和 BGSAVE
两个命令都会调用 rdbSave
函数,但它们调用的方式各有不同
save
命令在执行的时候会阻塞redis的服务器进程,直到RDB文件创建完毕为止。在执行命令的期间服务器不能处理任何命令请求。bgsave
命令执行的时候会派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。
载入:
rdbLoad
函数用于读取 RDB 文件,当 Redis 服务器启动时, rdbLoad
函数就会被执行, 它读取 RDB 文件, 并将文件中的数据库数据载入到内存中。因为 AOF 文件的保存频率通常要高于 RDB 文件保存的频率,所以一般来说, AOF 文件中的数据会比 RDB 文件中的数据要新,因此服务器在启动时, 打开了 AOF 功能, 那么程序优先使用 AOF 文件来还原数据
RDB 相关的配置
1 | ################################ SNAPSHOTTING ################################ |
快照的过程
- Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
- 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
- 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成
AOF 方式
AOF 以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。
AOF文件的写入与同步
当AOF持久化功能处于打开的时候,服务器在执行完一个写命令之后,会以协议格式的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。
1 | # 同步时机 |
AOF 相关的配置
1 | ############################## APPEND ONLY MODE ############################### |