Redis(五)持久化

Redis持久化

Redis持久化指的是将redis中的数据写入硬盘的过程。

1 RDB

简介

在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是snapshot,它恢复的时候是将快照文件直接读到内存。

怎么样进行的持久化?

RDB持久化采用了Linux常用的写时复制技术

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个持久化文件替换上次持久化好的文件dump.rdb,整个过程中主进程是不进行任何IO操作的,这样一方面保证了主进程的性能不受影响,第二点是处于安全性考虑,防止持久化过程出现宕机导致数据不完整。

如果需要大规模的数据恢复,而且对于数据的完整性不是特别敏感,那么RDB方式比AOF方式更加高效。

RDB唯一的缺点是最后一次持久化的数据可能会丢失。原因是父进程结束子进程也会被撤销。

RDB配置
stop-writes-on-bgsave-error

yes:当Redis无法写入硬盘时,直接关闭Redis的写操作

rdbchecksum 完整性检查

yes:存储快照时,让redis使用CRC64算法来校验

save 在指定时间内发生了指定的次数就会执行持久化操作
EDB的备份与恢复

将临时文件(路径由redis.conf指定,默认在启动路径下生成)替换dump.rdb然后启动redis即可。

2 AOF (Append Only File)

2.1 简介

以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写命令记录下来(读操作不记录),只许追加文件不许改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的时候就会根据AOF文件的内容从头执行到结尾以完成数据的恢复工作。

如果同时开启AOF和RDB,系统会默认获取AOF的数据(数据不会存在丢失)

2.2 AOF配置
append only 是否开启aof
appendfilename 生成的aof文件名
appendfsync 设置AOF同步频率
  • always:始终同步,每次redis都会立刻写入日志,性能较差但数据完整性比较好

  • everysec:每秒同步一次,如果宕机则本秒数据可能会丢失

  • no:redis不主动进行同步,而是交给操作系统

2.3 redis修复
redis-check-aof -fix

aof文件受损会导致redis启动失败,这时候可以使用该命令进行文件修复

2.4 Rewrite压缩

AOF采取文件追加的方式,文件会越来越大,为了避免此种情况,新增了重写机制

触发机制:当AOF文件的大小设定超过了给定的阈值,Redis就会启动文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

redis会记录上次aof文件的大小,默认是变为了上次文件大小的两倍并且大于64MB才会触发重写

auto-aof-rewrite-percentage : 设置重写的基准值,默认为100%,即文件达到原来的两倍的时候才进行重写

auto-aof-rewrite-min-size:设置重写的基准值,默认为64MB

例如文件70MB开始重写,然后降到50,下次会从100MB开始重写

重写虽然可以节省大量的磁盘空间,减少回复时间,但是还是有一定负担的

重写的原理:会fork一个子进程来将文件重写(也是先写临时文件再rename),redis4.0版本后的重写,就是把rdb的快照,以二进制的形式附在aof的头部,作为已有的历史数据,替换掉原来的流水账操作

posted @ 2022-12-09 15:44  Tod4  阅读(42)  评论(0编辑  收藏  举报