Redis持久化机制 RDB AOF

Redis持久化

Redis提供了对持久化的支持,我们可以选择不同的方式(RDB或者AOF)将数据从内存中保存到硬盘当中,使数据可以持久化保存。

RDB

RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。

开启RDB方式

  • save命令

同步Redis数据到磁盘上,当客户端向服务器发送save命令请求进行持久化时,服务器会阻塞save命令之后的其他客户端的请求,直到数据同步完成。

image

  • bgsave命令

异步保存数据集到磁盘上,当客户端发服务发出bgsave命令时,Redis服务器主进程会forks一个子进程来数据同步问题,在将数据保存到rdb文件之后,子进程会退出。子进程进行IO写入操作时,主进程仍然可以接收其他请求(但forks子进程是同步的,所以forks子进程时会阻塞其他客户端请求)。

image

  • 配置触发

redis.conf配置,达到触发条件时,会forks一个子进程进行数据同步。

# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000

RDB文件

RDB默认生成的文件名为dump.rdb,生成过程如下:

1.生成临时rdb文件,并写入数据。
2.完成数据写入,用临时文代替代正式rdb文件。
3.删除原来的db文件。

RDB优劣势

  • 优点

    1. 与AOF方式相比,通过rdb文件恢复数据比较快。
    2. rdb文件非常紧凑,适合于数据备份。
    3. 通过RDB进行数据备,由于使用子进程生成,所以对Redis服务器性能影响较小。
  • 缺点

    1. 服务器宕机有数据缺失的风险
    2. save会造成Redis服务阻塞,gsave命令在forks子进程会消耗内存

AOF

AOF(Append-only file),AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以Redis协议追加保存到以后缀为aof文件末尾,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。

image

配置

# 开启aof机制
appendonly yes

# aof文件名
appendfilename "appendonly.aof"

# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always

# 默认不重写aof文件
no-appendfsync-on-rewrite no

# 保存目录
dir ~/redis/

写入策略

  • always

客户端的每一个写操作都保存到aof文件当,这种策略很安全,但是每个写请求都有IO操作。

  • everysec

appendfsync的默认写入策略,每秒写入一次aof文件,因此,最多可能会丢失1s的数据。

  • no

Redis服务器不负责写入aof,而是交由操作系统来处理什么时候写入aof文件。更快,但也是最不安全的选择,不推荐使用。

AOF文件重写

可以通过配置的no-appendfsync-on-rewrite方式或者客户端向服务器发送bgrewriteaof命令

AOF文件修复

  1. 定时备份aof文件
  2. 使用redis-check-aof命令修复aof文件
  3. 重启Redis服务器,加载已经修复的aof文件,恢复数据

AOF优劣势

  • 优点

    1. AOF只是追加日志文件,因此对服务器性能影响较小,速度比RDB要快,消耗的内存较少。
  • 缺点

    1. AOF方式生成的日志文件太大,即使通过AFO重写,文件体积仍然很大。
    2. 恢复数据的速度比RDB慢。
  • 注意

当RDB与AOF两种方式都开启时,Redis会优先使用AOF日志来恢复数据,因为AOF保存的文件比RDB文件更完整。