Redis持久化RDB和AOF

RDB简介

RDB(Redis DataBase)是生成Redis某一时间点内存的Snapshot快照存入磁盘。

触发方式

1.手动触发
save

save命令会阻塞redis进程(redis是单线程)去执行保存快照的操作,直到快照保存完成redis才会继续处理其他请求。

bgsave

bgsave命令会从主线程上fork出一个子线程,fork命令会把主线程的所有key和对应value的内存地址复制给子线程,由于只复制内存地址速度很快,fork命令结束后主线程就可以立即处理其他请求,由子线程来处理保存内存快照的操作。

linux fork之后,kernel把父进程中所有的内存页权限都设置readonly,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常终端(page-fault),陷入kernal的一个中断例程。中断例程中,kernel的copyonwrite机制就会把触发的异常页复制一份,于是父子进程各自持有独立的一份。如果这个时候有大量的写入操作,会产生大量的分页错误(页异常中断page-fault),这样就得耗费不少性能在复制上。

2.自动触发

redis.conf 内配置

save 900 1
save 300 10
save 60 10000

900秒后如果超过1个key的值发生了变化
300秒后如果超过10个key的值发生了变化
60秒后如果超过10000个key的值发生了变化
三个条件只要有一个触发就会执行bgsave操作(命令虽然是save单实际自动触发的是bgsave),然后时间计数器重置。

3.其他配置
dbfilename dump.rdb
dir ./
rdbcompression yes
stop-writes-on-bgsave-error yes
rdbchecksum yes

dbfilename:rdb文件名称(不包含路径)
dir:rdb文件路径
rdbcompression:是否开启rdb文件压缩
stop-writes-on-bgsave-error:如果子线程rdb操作失败,是否阻止主线程继续写数据
rdbchecksum:是否开启使用CRC64算法对rdb文件进行行数据校验

AOF简介

AOF(AppendOnlyFile)通过保存redis的操作命令来增量保存redis数据到磁盘中

开启方式

appendonly yes

修改redis.conf中 appendonly为yes(默认是no)

其他配置
appendfilename appendonly.aof
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

appendfilename:aof文件名单,(不包含路径,路径和rdb文件共用配置)
appendfsync:everysec:每秒同步到磁盘一次,always每次指令都会同步磁盘,no等操作系统的buffer区满后再同步到磁盘
no-appendfsync-on-rewrite: 是否开启在进行rewrite时暂时不同步aof文件到磁盘,防止io争抢
auto-aof-rewrite-percentage:100 aof文件超过上次rewrite后的大小超过100%触发rewrite(如果是0则关闭rewrite),rewrite是把重复的指令合并,减少aof文件体积。
auto-aof-rewrite-min-size:触发rewrite时aof文件的最小值,低于此值不触发

RDB和AOF混合模式

开启混合模式

aof-use-rdb-preamble yes

修改redis.conf中 aof-use-rdb-preamble为yes(默认是no),开启后aof触发rewrite后会执行bgsave并把生成的rdb文件和触发rewrite后的aof文件合并成新的aof文件,替换旧的aof文件。这时候aof文件分为两部分,一部分为bgsave生成的rdb文件,另一部分后后续追加的aof文件。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容