rdb
是默认的持久化机制,生成快照即将内存数据写进磁盘;
生成rdb快照的几种方式
https://joonwhee.blog.csdn.net/article/details/111569283?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2
1)自动生成,在redis.conf中可配置,在指定的多少秒内有多少个key发生变化,就会触发生成快照;
2)执行save或者bgsave命令,前者是同步保存数据,后者是异步保存数据,同步的时候会阻塞其他线程往redis中写数据;
3)shutdown时候,会自动执行一次save命令;flushall命令也可以生成rdb快照保存数据至磁盘;
4)主从复制时候也可以触发生成rdb快照;
当生成快照文件dump.rdb后,可以备份生成一个dump.rdb.bak文件,当删掉dump.rdb文件后,此时需要先执行./redis-cli shutdown命令,再执行cp dump.rdb.bak dump.rdb生成一个dump.rdb文件,最后再启动redis,才能恢复原来dump.rdb文件中的数据,即需要先停机后,再根据.bak文件生成dump.rdb文件才ok,所以在redis关闭后,再将备份的rdb文件拷贝到原路径,则当redis启动后,就可以加载该rdb文件;
dump.rdb文件是一个二进制文件,在redis.conf中有个默认配置即开启了rdb类型文件的压缩;
aof
是append only file的缩写,采用日志的方式保存每个事物操作;redis.conf配置文件中默认aof关闭的,开启后,会追加到appendonly.aof文件中;
原理是先将每个操作写进页缓存,再每隔一定时间刷进磁盘中;在redis.conf文件中刷盘一共有三种时间配置
由于每次执行操作都会写进aof文件中,由于过于详细,所以aof文件会越来越大,所以重写功能应运而生;重写的目的是把中间过程的指令全部去掉,直接保留能实现结果的指令,然后重新生成一个aof文件以覆盖掉旧的aof文件,有自动触发重写,和手动触发重写;
aof重写应该叫aof校验
主进程创建了一个子进程,读取了当前redis内存中最新的键值状态,用一条命令代替之前多条命令,形成新的aof文件,替换旧文件。如果这期间主进程发生了新的写命令,那么主进程会将新命令加到aof重写缓冲区和aof文件缓冲区中,aof重写缓冲区是在主进程fork出子进程之后开始启用。
当子进程完成对AOF文件重写之后,它会向父进程发送一个完成信号,父进程接到该完成信号之后,会调用一个信号处理函数,该函数完成以下工作:
将AOF重写缓存中的内容全部写入到新的AOF文件中;这个时候新的AOF文件所保存的数据库状态和服务器当前的数据库状态一致;
对新的AOF文件进行改名,原子的覆盖原有的AOF文件;完成新旧两个AOF文件的替换。
redis4.0混合持久化
重启redis时,重放aof日志很慢,用rdb快照+增量aof重放替代全量aof重放,大大提高效率。具体是当aof重写时,将重写这一刻之前的内存做rdb快照处理,并且将rdb快照内容和增量的aof修改内存数据的命令存在一起,都写入新的aof文件,等到重写完新的aof文件才会进行改名,覆盖原有的aof文件。当redis重启时,可以先加载rdb的内容,再重放增量aof日志,就可以完全替代之前的aof全量文件重放,因此重启效率大幅得到提升。
判断 aof 文件的前面部分是否为 rdb 格式,只需要判断前 5 个字符是否是 REDIS。这个是因为 rdb 持久化开头就是 REDIS, 同时 aof 命令开头一定不会是 REDIS(命令开头都是 *)。
redis持久化的思维脑图