【Redis】Redis持久化机制RDB与AOF 叁歲伎倆 2023-10-12 13:17 14阅读 0赞 **目录** 一、RDB 1、概念 2、RDB文件保存 3、执行RDB 4、触发RDB 5、fork原理 6、RDB的缺点 二、AOF 1、概念 2、开启AOF 3、触发AOF 4、触发重写AOF 三、区别 -------------------- ## 一、RDB ## ### 1、概念 ### RDB全称为Redis Database Backup File(Redis数据备份文件),也叫做Redis数据快照。简单的来说就是把某一时刻Redis内存里的数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件恢复数据 ### 2、RDB文件保存 ### 在Redis的配置文件中我们可以修改RDB文件的相关配置,比如RDB文件的保存路径,与该文件是否压缩 > rdbcompression yes \# 是否压缩、不建议开启,压缩文件会消耗CPU > > dbfilename dump.rdb \# RDB文件的名称 > > dir ./ \# 文件保存路径,默认保存到当前运行目录 ### 3、执行RDB ### 在Redis的客户端,我们可以通过save与bgsave执行快照操作,两者的区别是save是占用主进程去执行,而bgsave是开启一个子进程去执行,我们知道Redis是单进程的,我们如果使用save命令时,这个命令会占用当前进程使得其他命令阻塞等待,通常在Redis服务关闭时执行一次save命令 ### 4、触发RDB ### 我们可以在Redis的配置文件中修改触发RDB的规则 > save 900 1 \# 900秒内,如果至少有一个key被修改 则执行bgsave > > save 300 10 \# 300秒内,如果至少有十个key被修改 则执行bgsave > > save 600 10000 \# 600秒内,如果至少有一万个key被修改 则执行bgsave ### 5、fork原理 ### bgsave在执行的时候会fork主进程得到子进程,子进程是共享主进程的内存数据的,在完成fork后读取内存中的数据写入RDB文件,在子进程fork主进程时也是阻塞的。fork的过程中会将主进程的页表进行复制也就是将虚拟内存进行拷贝(虚拟内存可以映射到物理内存),然后通过该页表操作主进程的内存数据,此时如果在子进程RDB的过程中,主进程进行了写操作,则可能会导致脏读,为了避免脏读,此时主进程进行写操作时会话拷贝一份数据副本进行写操作![25101627e9474cea8a4778c08508b1bb.png][] ### 6、RDB的缺点 ### RDB的执行间隔时间长,两次RDB之间写入数据有丢失风险,如果在第一次写入成功后第二次RDB之前Redis宕机则这个过程的数据会丢失,而且fork子进程、压缩、写出RDB文件都比较耗时 ## 二、AOF ## ### 1、概念 ### AOF全称Append Only File(追加文件),Redis处理的没有写操作命令都会记录在AOF文件中,可以看作为命令日志文件 ### 2、开启AOF ### AOF默认是关闭的。需要修改Redis的配置文件来开启 > appendony yes \# 开启 > > appendfilename “文件名“ ### 3、触发AOF ### AOF的命令记录频率也是可以通过Redis配置文件进行修改的 > apppendfsync alaways \# 执行一次命令立即记录到AOF文件中 > > apppendfsync everysec \# 写命令先存入AOF缓冲区,然后每个1s将缓冲区的数据写入AOF是默认选项 > > apppendfsync no \# 写命令存入AOF缓冲区,由操作系统决定何时写入AOF <table style="width:500px;"> <tbody> <tr> <td>配置</td> <td>刷盘时机</td> <td>优点</td> <td>缺点</td> </tr> <tr> <td>alaways</td> <td>同步刷盘</td> <td>可靠性高,数据不易丢失</td> <td>性能影响大</td> </tr> <tr> <td>everysec</td> <td>每秒刷盘</td> <td>性能中</td> <td>最多丢失1s数据</td> </tr> <tr> <td>no</td> <td>操作系统控制</td> <td>性能最好</td> <td>可靠性差,易丢失大量数据</td> </tr> </tbody> </table> ### 4、触发重写AOF ### AOF是记录写命令,AOF会比RDB文件大得多,而AOF会记录对一个key的多次写操作,但是只有最后一次才有意义。我们可以通过bgrewriteaoff来触发AOF文件执行重写,用最少的命令达到同样的效果,在配置文件中可以配置触发重写的规则 > auto-aof-rewrite-percentage 100 \# AOF文件比上次的文件增长超过多少百分比重写 > > auto-aof-rewrite-min-size 64mb \# AOF文件体积最小多大以上触发重写 ## 三、区别 ## ![a3e2e2900e3840f69ee5c12737e02d91.png][] [25101627e9474cea8a4778c08508b1bb.png]: https://img-blog.csdnimg.cn/25101627e9474cea8a4778c08508b1bb.png [a3e2e2900e3840f69ee5c12737e02d91.png]: https://img-blog.csdnimg.cn/a3e2e2900e3840f69ee5c12737e02d91.png
还没有评论,来说两句吧...