一位爱好技术的橘右京的哥哥橘左京
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次则触发RDBsave 300 10 在300秒内数据更新10次则触发RDBsave 60 10000 在60秒内数据更新10000次则触发RDB
在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之前版本。