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

相关推荐
喜欢打篮球的普通人5 分钟前
rust高级特征
开发语言·后端·rust
天天要nx13 分钟前
D68【python 接口自动化学习】- python基础之数据库
数据库·python
Allen Bright16 分钟前
Redis安装
数据库·redis·缓存
Ling_suu22 分钟前
Spring——单元测试
java·spring·单元测试
门牙咬脆骨22 分钟前
【MYSQL】数据库日志 (了解即可)
数据库·mysql
ModelBulider23 分钟前
十三、注解配置SpringMVC
java·开发语言·数据库·sql·mysql
豆 腐33 分钟前
MySQL【四】
android·数据库·笔记·mysql
苹果酱056738 分钟前
C语言 char 字符串 - C语言零基础入门教程
java·开发语言·spring boot·mysql·中间件
csucoderlee1 小时前
eclipse mat leak suspects report和 component report的区别
java·ide·eclipse
代码小鑫1 小时前
A032-基于Spring Boot的健康医院门诊在线挂号系统
java·开发语言·spring boot·后端·spring·毕业设计