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的头部,作为已有的历史数据,替换掉原来的流水账操作。
标签:AOF,持久,文件,Redis,redis,重写 From: https://www.cnblogs.com/tod4/p/16969127.html