Redis 数据持久化
hanpy

Redis 以数据结构的形式将数据维持在内存中, 为了让这些数据在 Redis 重启之后仍然可用, Redis 分别提供了 RDB 和 AOF 两种持久化模式。

RDB 方式

RDB 持久化方式也叫“快照”方式,当符合一定条件时 Redis 会自动将内存中的所有数据生成一份副本并存储在硬盘上。

RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数,前者用于生成 RDB 文件到磁盘,而后者则用于将 RDB 文件中的数据重新载入到内存中

进行快照的时机

  1. 根据配置规则进行自动快照
  2. 用户执行 SAVE或 BGSAVE命令
  3. 执行 FLUSHALL命令
  4. 执行复制(replication)时

RDB文件的创建与载入

创建:

rdbSave 用于生成RDB文件, SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同

  1. save 命令在执行的时候会阻塞redis的服务器进程,直到RDB文件创建完毕为止。在执行命令的期间服务器不能处理任何命令请求。
  2. bgsave 命令执行的时候会派生出一个子进程,然后由子进程负责创建RDB文件,父进程继续处理命令请求。

载入:

rdbLoad函数用于读取 RDB 文件,当 Redis 服务器启动时, rdbLoad 函数就会被执行, 它读取 RDB 文件, 并将文件中的数据库数据载入到内存中。因为 AOF 文件的保存频率通常要高于 RDB 文件保存的频率,所以一般来说, AOF 文件中的数据会比 RDB 文件中的数据要新,因此服务器在启动时, 打开了 AOF 功能, 那么程序优先使用 AOF 文件来还原数据

RDB 相关的配置

1
2
3
4
5
6
7
8
9
10
11
12
################################ SNAPSHOTTING  ################################

# 900s内有大于等于1个key修改过就进行快照
save 900 1
save 300 10
save 60 10000

# rdb 文件的名称
dbfilename dump.rdb

# 保存rdb文件的位置
dir ./

快照的过程

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
  3. 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成

AOF 方式

AOF 以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。

AOF文件的写入与同步

当AOF持久化功能处于打开的时候,服务器在执行完一个写命令之后,会以协议格式的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。

1
2
3
4
# 同步时机
# appendfsync always # 每次执行写入都会执行同步
appendfsync everysec # 每秒执行一次同步操作
# appendfsync no # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次)

AOF 相关的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
############################## APPEND ONLY MODE ###############################

# 是否开启AOF, yes | no
appendonly no

# AOF文件名字
appendfilename "appendonly.aof"

# 保存的位置也是通过 dir 来设置的,和RDB使用的一样

# 同步时机
# appendfsync always # 每次执行写入都会执行同步
appendfsync everysec # 每秒执行一次同步操作
# appendfsync no # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次)

# 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写
auto-aof-rewrite-percentage 100
# 限制了允许重写的最小AOF文件大小
auto-aof-rewrite-min-size 64mb