Redis 数据持久化
hanpy

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

RDB 方式

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

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

进行快照的时机

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

RDB文件的创建与载入

创建:

rdbSave 用于生成RDB文件, SAVEBGSAVE 两个命令都会调用 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