一位爱好技术的橘右京的哥哥橘左京


Redis——持久化详细解析

  • 1. 持久化
  • 1.1 RDB
  • 1.1.1 触发方式
  • 1.1.2 数据恢复
  • 1.1.3 优势与劣势
  • 1.1.4 自动保存原理
  • 1.2 AOF
  • 1.2.1 AOF的配置
  • 1.2.2 AOF数据恢复
  • 1.2.3 AOF重写
  • 1.2.4 AOF优势与劣势
  • 1.3 RDB-AOF混合持久化


1. 持久化

Redis基于内存存储数据,如果发生宕机或断电会造成数据丢失,为此Redis提供了持久化策略:RDB快照、AOF日志,将内存数据持久化到硬盘,用于数据恢复。

1.1 RDB

将当前内存的键值对快照写入磁盘,恢复时读取快照将数据恢复到内存。

1.1.1 触发方式

1)自动触发

save 900 1 在900秒内数据更新1次则触发RDB
save 300 10 在300秒内数据更新10次则触发RDB
save 60 10000 在60秒内数据更新10000次则触发RDB

redis执行save后保存到哪里去了 redis save m n_缓存

在redis.conf配置文件中SNAPSHOTTING下进行RDB的相关配置。

①save: save m n命令表示数据在m秒内数据发生n次变化会自动触发持久化.
②stop-writes-on-bgsave-error:默认yes,若最后一次快照失败,redis是否停止接收新数据。
③rdbcompression: 默认yes,是否对rdb文件进行压缩,若是则采用LZF算法压缩,若不是则不压缩。
④rdbchecksum: 默认yes,是否使用CRC64算法进行数据校验。
⑤dbfilename: 快照默认文件名。
⑥dir: 快照存储路径。

2)手动触发

①save: 在持久化时会阻塞,Redis不能处理其他命令,直到持久化完毕。
②bgsave: 异步持久化。Redis进程执行fork命令创建子进程,由子进程完成持久化,主进程不受影响可继续响应客户端操作。

1.1.2 数据恢复

恢复数据,Redis能够直接读取根目录下的dump.rdb写入内存,期间Redis是阻塞的。

1.1.3 优势与劣势

优势:

①占用资源少,适合备份和数据恢复。
②生成RDB文件时,redis会fork一个子进程进行生成,不影响主进程操作。
③恢复大量数据时RDB比AOF快。

劣势:

①bgsave操作每次都要执行fork命令,属于重量级操作,影响性能。
②RDB文件使用特定二进制保存,可能出现版本兼容问题。
③不能做到实时备份,有可能最后还未保存的数据会丢失。

1.1.4 自动保存原理

Redis内部有一个方法redisService,内部记录了三个参数,saveparams(数据数组),dirty(计数器),lastsave(上次保存时间)。每执行一次写入、修改命令后将计数器加1,并记录写入时间,Redis的serverCron周期函数每隔一百秒执行一次检查是否满足自动保存条件,满足则更新RDB文件。

1.2 AOF

将Redis中执行增删改操作的命令保存到AOF文件中。

1.2.1 AOF的配置

在redis根目录下找到redis.conf,其中APPEND ONLY MODE就是AOF相关配置。

①appendonly: 默认no,是否开启aof持久化。
②appendfilename: aof文件名称。
③appendfsync: aof持久化默认策略,分为三类
no:不执行fsync,由操作系统保证同步到磁盘,速度最快,不安全。
always:每执行一次写操作,都会同步到磁盘,效率低。
everysec:每秒执行一次fsync,兼顾安全和效率,最多丢失一秒的数据。
④no-appendfsync-on-write: 默认为no。yes表示重写期间对新的增删改操作不fsync,暂存内存中,等重写后在写入。
⑤auto-aof-rewrite-percentage: 默认100,当目前AOF文件大小大于⑥auto-aof-rewrite-min-size大小,是上一次重写的AOF文件的两倍时,则进行重写操作。
⑥auto-aof-rewrite-min-size: 64MB,允许触发重写最低的文件大小,避免重写小文件。
⑦aof-load-truncated: 默认yes,指在恢复时,忽略掉可能有问题的最后一条指令,若为no并且最后一条指令有问题会导致失败。

1.2.2 AOF数据恢复

重启Redis会自动进行AOF文件的载入。修复异常AOF文件命令:redis-check-aof --fix。

1.2.3 AOF重写

AOF开启后会将增删改指令写入AOF文件,日积月累文件越来越大,Redis为解决这个问题,提供了AOF重写机制,当AOF文件超过设置阈值时,会自动进行重写操作。

例:

sadd k1 ‘123’
sadd k1 ‘456’
sadd k1 ‘789’
经过重写后会直接修改为sadd k1 ‘123’ ‘456’ ‘789’

Redis是单线程的,在执行重写操作时其他操作会阻塞,这显然是不行的,Redis提供了子进程来完成重写,但产生一个问题是执行重写时间段的数据有可能再次被更新,导致重写数据不一致问题,Redis提供了AOF缓冲区解决这个问题。在重写时,所有新的增删改操作写到AOF缓冲区当中,当子进程重写完毕后通知父进程,父进程调用函数将AOF缓冲区数据重写到AOF文件中。

1.2.4 AOF优势与劣势

优势

①安全性高,数据丢失率小。
②AOF文件可读性强。

劣势

①效率相比RDB要低一些
②文件体积大

1.3 RDB-AOF混合持久化

Redis4.0之后新增了RDB-AOF混合持久化,结合双方优势,既能快速加载还能保证文件大小。
aof-use-rdb-preamble:yes为开启,no为关闭。

当开启混合持久化,主进程先fork出子进程将内存副本全量以RDB方式写入AOF文件,然后将缓冲区的增量以AOF方式写入AOF文件中,完成后通知主进程并将新的含有混合持久化文件替换老的AOF文件。缺点是不能兼容4.0之前版本。