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文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

相关推荐
huanmieyaoseng1003几秒前
Mybatis常见面试题
java·开发语言·mybatis
u0107475462 分钟前
HTML5中SVG描边虚线Stroke-dasharray的配置技巧
jvm·数据库·python
Dontla6 分钟前
JWT认证流程(JSON Web Token)
前端·数据库·json
無限進步D5 小时前
Java 运行原理
java·开发语言·入门
難釋懷5 小时前
安装Canal
java
是苏浙5 小时前
JDK17新增特性
java·开发语言
不光头强5 小时前
spring cloud知识总结
后端·spring·spring cloud
Mike117.5 小时前
GBase 8a 日期边界写法和时间窗口取数偏差
数据库
SPC的存折7 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
GetcharZp8 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端