1.Redis持久化

Redis有两种持久化方案:

  • RDB持久化
  • AOF持久化

1.1.RDB

RDB全称Redis Database Backup file(Redis数据备份文件),RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

1.1.1.RDB执行

RDB持久化在四种情况下会执行:

  • 执行save命令
  • 执行bgsave命令
  • Redis停机时
  • 触发RDB条件时

1)save命令

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。

2)bgsave命令

bgsave命令执行后Redis执行fork操作创建子进程完成RDB,主进程可以继续处理用户请求,不会阻塞。

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 下面的配置代表600秒内如果至少有10个key被修改,则执行bgsave
save 600 10  

RDB的其它配置也可以在redis.conf文件中设置:

# 是否进行压缩(会耗费cpu资源)
rdbcompression yes

# RDB文件保存名称(默认为dump.rdb)
dbfilename dump.rdb  

1.1.2.RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

1.2.AOF

1.2.1.AOF原理

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

1.2.2.AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes

AOF的命令记录的频率也可以通过redis.conf文件来配:

# 每执行一次写命令,立即记录
appendfsync always 
# 每隔1秒将缓冲区数据写到AOF文件(默认)
appendfsync everysec 
# 由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

三种策略对比:

1.2.3.AOF文件重写

AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件相比上次增长超过多少百分比则触发bgrewriteaof
auto-aof-rewrite-percentage 100
# AOF文件达到一定大小触发bgrewriteaof
auto-aof-rewrite-min-size 64mb 

重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

1.3.RDB与AOF对比

RDB和AOF各有优缺点,在实际开发中一般会结合两者来使用。