redis:五、缓存持久化(RDB和AOF)的开启和配置、面试回答模板

持久化

方案

redis中自身存在两种方案,分别叫RDB和AOF,来保障数据的持久化。其中前者默认开启,后者默认关闭。

redis是基于内存的,redis持久化的意思就是将redis数据,即内存数据写入磁盘等持久化存储设备当中。

RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

手动开启方法

在redis客户端可以通过以下两个命令手动开启redis数据快照。

  • save(由redis主进程来执行RDB,会阻塞其他所有命令)
  • bgsave(开启子进程执行RDB,避免主进程受到影响)

被动触发

在redis.conf中有被动触发的相应条件,且默认是bgsave。

复制代码
save 900 1  # 900秒内,如果至少有1个key被修改,则执行bgsave   

原理

redis的主进程并不直接和真实物理地址打交道。它会维护一个页表的东西,页表记录着虚拟地址和物理内存中真实的物理地址之间的映射关系。子进程就是直接复制该页表,以此达到和主进程共享数据的效果。这个复制过程很快,是纳秒级别的,所以可以忽略不记。当子进程复制完页表后会读取内存数据并写入RDB文件。

当子进程在写入RDB文件时,主进程那依旧可以接受用户的请求并写数据。但是此时物理内存中的数据是只读模式,只是会拷贝一份数据出来让主进程可以在上面修改。主进程修改完后页表也会指向这个拷贝出来的新数据。这样就防止了子进程写入RDB,主进程那同时修改数据,从而产生的脏数据的问题。

AOF

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

开启与记录频率

在redis.conf文件里修改以下配置:

复制代码
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"


# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

重写功能

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

复制代码
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb 

RDB和AOF的对比

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

面试回答模板

redis做为缓存,数据的持久化是怎么做的?

背熟以下回答大概用时1min。

redis自身存在两种方案,分别叫RDB和AOF,以此来保障数据的持久化。其中RDB默认开启,AOF默认关闭。RDB全称Redis Database Backup file,即Redis数据备份文件,也被叫做Redis数据快照。它整个是个二进制文件,在保存的时候体积是比较小的,恢复数据的速度比较快,但是它有可能会丢数据。

AOF全称是Append Only File。Redis处理的每一个写命令都会记录在这个AOF文件中,可以看做是一个命令日志文件。它整个文件的体积会比较大,所以恢复数据的速度会慢一些,但是它丢数据的风险要小很多。

一般在实际开发中我们都是结合两者去使用的。

面试官:redis做为缓存,数据的持久化是怎么做的?

候选人:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF

面试官:这两种持久化方式有什么区别呢?

候选人:RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。

AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据

面试官:这两种方式,哪种恢复的比较快呢?

候选人:RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

相关推荐
CoderYanger5 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
廋到被风吹走5 小时前
【数据库】【MySQL】InnoDB外键解析:约束机制、性能影响与最佳实践
android·数据库·mysql
C++业余爱好者5 小时前
Java 提供了8种基本数据类型及封装类型介绍
java·开发语言·python
想用offer打牌5 小时前
RocketMQ如何防止消息丢失?
java·后端·架构·开源·rocketmq
皮卡龙5 小时前
Java常用的JSON
java·开发语言·spring boot·json
掘根5 小时前
【消息队列】交换机数据管理实现
网络·数据库
初辰ge5 小时前
2025年12月高质量简历模板平台深度解析
面试
Logic1015 小时前
《Mysql数据库应用》 第2版 郭文明 实验6 数据库系统维护核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
利刃大大6 小时前
【JavaSE】十三、枚举类Enum && Lambda表达式 && 列表排序常见写法
java·开发语言·枚举·lambda·排序
float_六七6 小时前
Java反射:万能遥控器拆解编程
java·开发语言