一. 场景介绍
小白:杨哥,我们学的redis缓存数据库,关于他的持久化机制能给我详细讲讲吗?昨天面试时被问到了,我回答的不是很理想,哭唧唧。
杨哥:没问题,来,整起!
二. 持久化方案
Redis的持久化机制有3种实现方案:RDB、AOF、混合持久化。
三. RDB方案
3.1持久化机制--自动
RDB是Redis默认的持久化机制,一般会按默认的规则自动触发数据的持久化。
3.2持久化机制--手动执行
Redis也可以通过手动操作触发持久化,我们可以使用save和bgsave两个命令进行触发。
3.2.1 save命令
save命令会阻塞当前Redis的线程,直到RDB持久化过程完成为止,若持久化的数据较大,则会造成长时间的阻塞,不建议在线上环境直接使用该命令。
3.2.2 bgsave命令
执行bgsave命令时,redis进程会通过fork操作创建出一个子进程,由子线程完成持久化操作,阻塞时间很短(微秒级)。这是对save命令的优化,在执行redis-cli shutdown命令关闭redis服务时,如果没有开启AOF持久化,就会自动执行bgsave。
3.3 RDB的优缺点
优点:压缩后的二进制文件,适用于备份、全量复制,适用于灾难恢复;加载RDB恢复数据远快于AOF方式。
缺点:无法做到实时持久化,每次都要创建子进程,频繁操作成本过高;保存后的二进制文件,存在老版本不兼容新版本rdb文件的问题;数据可能丢失。
四. AOF方案
AOF是通过保存Redis服务器执⾏的所有写操作命令来进行数据库备份的方案,并在服务器启动时,通过重新执行记录的这些命令来还原数据集。
4.1 开启和关闭
默认没有开启AOF,需要我们在redis.config中进行手动修改。
4.2 执行流程
当redis服务重启时,可加载AOF文件进行恢复。以下是AOF方案的执行流程。
4.3 写入磁盘机制
4.4 重写机制
4.5 AOF的优缺点
优点:
AOF比RDB更可靠。我们可以设置不同的fsync策略:no、everysec和?always,默认是everysec。在这种配置下,redis仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失1秒钟的数据。
AOF是一个纯追加的日志文件。即使日志因为某些原因包含了未写入完整的命令(如磁盘已满,写入中途停机等等)可以redis-check-aof轻易地修复这种问题。
当?AOF文件件太大时,会重写。
AOF文件易于解析。
缺点:
AOF持久化的速度,相对RDB较慢的,存储的是一个文本文件,到了后期文件会比较大,传输困难。
五. 混合使用方案
混合持久化并不是一种全新的持久化方式,而是对已有方式的优化。混合持久化只发于 AOF 重写过程。使用了混合持久化,重写后的新 AOF 文件件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。
优点:结合RDB和AOF的优点,更快的重写和恢复。
缺点:AOF文件中的RDB部分不再是AOF格式,可读性差。
*威哥Java学习交流Q群:691533824
加群备注:CSDN推荐