Redis中RDB和AOF两种持久化方式区别

1.RDB(Redis DataBase)

什么是RDB?

在指定的时间间隔内,将内存中的数据写入到磁盘中来实现持久化功能。恢复时,将磁盘中的rdb文件写入到内存中来实现恢复。相当于一个快照的功能

RDB的过程

会fork一个子进程来执行RDB持久化的过程,在对数据添加修改时,会将数据先写入到一个临时的rdb文件中,当完成持久化过程后,会将这个临时文件替换掉原来的磁盘内的rdb文件。在这个过程中,父进程只负责处理redis的一些操作,不涉及IO操作,只有子进程来进行IO操作

Redis中RDB和AOF两种持久化方式区别_第1张图片

RDB的时间间隔和触发机制

1.在redis的配置文件中修改

save 900 1 # 每900秒只要修改一次,就进行持久化操作
save 300 10 # 每300秒10次,进行持久化操作
save 60 10000 # 每60秒10000次,进行持久化操作

2、执行 flushall 命令,也会触发rdb
3、退出redis,也会产生 rdb

RDB的优缺点

优点

  1. 数据量大的时候,恢复数据时会比AOF更快
  2. 因为父进程不进行IO操作,所以他能最大化redis的工作性能

缺点

  1. 保存的数据完整性不高,因为他有一个时间间隔的机制,当最后一次还没有达成这个保存条件时,服务器宕机了,就会导致最后的数据丢失
  2. 在创建子进程的时候,很占用一定的内容空间

2.AOF(Append Only File)

什么是AOF?

AOF是用日志的方式来记录下来所有的操作记录,不记录读取的操作。redis启动的时候,会读取aof文件然后从上往下的顺序来执行记录的操作命令

AOF的过程

父进程会按照配置文件中的aof规则将所有的操作命令(不包括读操作)追加写入aof文件中,下面流程图包括了AOF重写的操作

Redis中RDB和AOF两种持久化方式区别_第2张图片

AOF的配置

appendonly yes #是否开启AOF
appendfilename "appendonly.aof" #默认的aof文件的名字
appendfsync always #每次操作都会追加写入aof文件,每次都会同步,效率低
appendfsync everysec #每一秒会追加写入aof文件,每秒同步,可能会丢失一秒
appendfsync no #不同步写入,操作系统自己同步数据,速度最快

AOF的重写

       随着越来越多的操作,导致文件越来越大,会影响服务器正常运行,恢复数据也会更慢,这时候就需要一个重写操作。
       文件重写是指定期重写AOF文件,减小AOF文件的体积。需要注意的是,AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
       重写来减小文件的大小的手段主要有两点:

  1. 去除过期的数据
  2. 去除一些无效的命令,例如重复的命令,删除了某些数据,单独的get合并成mget指令,等等

文件重写的流程,有两点需要特别注意:

  1. 重写由父进程fork子进程进行;
  2. 重写期间Redis执行的写命令,需要追加到新的AOF文件中,为此Redis引入了一个重写缓存。

重写的触发条件
在配置文件中进行配置,同时满足这两个条件时,才会进行重写操作

auto-aof-rewrite-percentage 100  #执行AOF重写时,当前AOF大小和上一次重写时AOF大小的比值。
auto-aof-rewrite-min-size 64mb  #执行AOF重写时,文件的最小体积,默认值为64MB。

AOF的优缺点

优点

  1. 有多种持久化策略,数据完整性会比较高
  2. AOF日志文件过大的时候,后台会进行重写操作,也不会影响客户端的读写。
  3. 误删操作能够紧急恢复

缺点

  1. 大量数据恢复时,由于是通过命令恢复,所以比rdb方式慢
  2. aof运行效率比较慢,所以Redis默认是rdb方式

你可能感兴趣的:(redis)