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文件。