Redis的持久化机制

Redis的数据是存放在缓存里面的,当计算机重启后,缓存内的数据会被清除,这时数据就会消失,因此,redis是可以支持持久化的,他可以根据策略将缓存中的数据存放到硬盘当中,保证数据的持久性。 Reids的持久化有两种方式,一种是RDB,另一种是AOF。下面分别介绍一下两种持久化机制的使用。

RDB(Redis Database)

RDB模式,是每隔一段时间以快照的方式去备份内存中的数据备份到磁盘上。备份的数据是开始备份那个时间点前的数据。

RDB优势

  • 以单独的文件的形式去备份,他可以设置每个小时或者每天去备份一次,恢复的时候,可以根据不同的版本去恢复数据到内存当中。
  • 方便灾后恢复数据,因为它只有一个文件,这个问价中的内容是完整的。
  • 备份时,他是以子进程的方式进行备份的,没有占用主进程,保证服务可以正常运行。当子进程进行备份时,主进程不会进行磁盘的IO,这样可以保证数据的完整性。(?这时如果有数据进来怎么做)
  • 当进行数据恢复的时候,可以快速的恢复比较大的数据集,相对于AOF,恢复的速度更快。

RDB劣势

  • RDB是每隔一段时间去备份一次,当在备份的间隔时间内出现宕机,这时,在上次备份的时间点到宕机这个时间点之间的数据会丢失。如果不在乎数据的完整性,可以使用。
  • RDB在备份的时候,是fork一个子进程进行执行备份操作,这个子进程和主进程是相同的,如果数据集比较大,复制数据时,对于计算机的CPU消耗会比较大。
  • 不能做到实时的备份。

RDB配置

打开Redis的配置文件 redis.conf,搜索SNAPSHOTTING,找到dir,这个就是备份时保存的文件路径。

# 如果至少有一个key发生变化,在900秒后就会保存一次快照
save 900 1
# 如果至少有10个key发生变化,那么在300秒后就回保存一次快照
save 300 10
# 如果至少有10000个key发生了变化,在60秒后就回保存一次快照
save 60 10000

# 如果保存的时候发生错误,就停止写入操作, 如果发生错误不停止写操作,就回出现数据
# 不一致的情况。
stop-writes-on-bgsave-error yes

# 这个是指是否使用压缩,如果使用压缩会占用CPU的性能,如果不使用压缩可以设置为no
# 使用 LZF 方式去压缩
rdbcompression yes

# 数据校验,使用CRC64去校验,使用校验,会有10%的性能消耗
rdbchecksum yes

# 备份文件名称
dbfilename dump.rdb
# 备份文件路径
dir /usr/local/redis/working

总结:使用RDB的备份方式,比较适合大数据量的恢复操作,但是如果在最后一次保存之前出现异常,这时就回丢失数据,对数据的完整性没有保障,如果不在乎数据的完整性,可以使用RDB的持久化方式。

AOF(append only fashion)

aof是以日志的形式存在,只要数据发生变更,就会以追加的方式写入日志,由于aof的日志会越写越大,所以可以通过配置的方式去将日志进行切割。

AOF 优势

  • 使用AOF可以使redis持久化更加健壮,他有三种方式去触发持久化
    • 在关闭时触发
    • 每秒触发(默认的方式)
    • 发生写操作时触发
  • 以日志的形式进行追加持久化
  • 日志内包含了所有的操作,便于redis的解析和恢复操作

AOF 劣势

  • 因为是使用日志的方式,所以和RDB的快照文件相比,要大得多。
  • AOF持久化,每次写入都会有IO操作,因此频繁的IO操作,对计算机性能会有一定的消耗。
  • 历史遗留的bug,AOF恢复的数据可能会有数据丢失。

AOF 配置

打开Redis的配置文件 redis.conf,搜索APPEND,下方的配置都是AOF配置相关的。 redis安装完毕后,默认的持久化方式是RDB模式

# 默认是关闭的, 启动AOF
appendonly yes

# AOF备份的文件名称
appendfilename "appendonly.aof"

# 同步策略
# 有写操作就同步
appendfsync always
# 每一秒
appendfsync everysec
# 关闭
appendfsync no

# 从写的时候不做写操作,否则会出现数据不一致的情况
no-appendfsync-on-rewrite no

# 重写机制,避免日志越来越大,AOF重写时,会执行flushALL命令,这个命令也会被记录到日志内,因此,在恢复的时候,需要将文件最后的flushALL命令删除,否则恢复之后是空的。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

RDB 和 AOF 选择

如果在可以接受在一段时间内他的缓存可以丢失的话,可以选择使用RDB模式。 如果对数据的实时性要求比较高,可以使用AOF的方式。 通常两个方法是一起使用,RDB作为冷备份,AOF用来做热备份,这样数据即使丢失最大就是在1s-2s。 redis在恢复的时候,是先去加载AOF日志进行恢复,如果AOF日志不存在,就回去使用RDB快照就恢复。这里有一个效率的问题,因为RDB是快照的方式,快照文件内记录的上一次备份时间点之前的所有数据,恢复的速度比较快,而AOF日志是记录了所有的操作命令,恢复的时候相对会比较慢,因此两个持久化的方法联合使用,不仅可以提高数据的安全性,也能提高数据恢复的速度。