目录
6.1 redis做为缓存,数据的持久化是怎么做的?(一次性回答)
6.2 redis做为缓存,数据的持久化是怎么做的?(等面试官追问)
1. 什么是持久化
持久化,顾名思义,指的是将短暂的、易失的数据转化为长时间保存,且不易丢失的格式。在数据库的语境中,持久化常常指的是将内存中的数据保存到硬盘或其他长期存储介质中,从而确保即使在系统崩溃、断电或其他突发事件中,数据也不会丢失。
2. 持久化原理
3. 持久化的必要性:
数据安全性:技术世界并非总是完美的。系统可能会遭受故障、崩溃或遭受攻击。在没有持久化的情况下,所有存储在内存中的数据在这些情况下都可能丢失。持久化提供了一种机制,确保这些数据在发生故障后可以被恢复。
🔍例子: 想象一下你在电脑上工作了好几个小时,突然停电了。如果你没有定期保存你的工作,那么你可能会失去所有的努力。数据库持久化就像定期保存你的文件,确保即使发生意外,你的数据也不会丢失。
4. Redis 持久化的方案★
Redis 提供三种持久化的方式: 分别是 RDB(Redis Database Snapshot) 和 AOF(Append Only File)以及 混合持久化。
需要注意的是:
RDB 是 默认持久化方式,但 Redis 允许 RDB 与 AOF 两种持久化技术同时开启,此时系统会使用 AOF 方式做持久化,即 AOF 持久化技术的 优先级要更高。同样的道理,两种技术同时开启状态下, 系统启动时若两种持久化文件同时存在,则 优先加载 AOF持久化文件。
4.1 RDB
4.1.1 什么是RDB
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据
🔍例子: 想象一下相机的快门点击。每当你点击快门,你都会捕捉到那个特定时刻的场景。RDB的工作方式很相似,只不过它捕捉的是数据的状态。
理解 RDB 的本质后,你可能会问,我们如何生成这个快照呢?使用 SAVE 和 BGSAVE 命令即可。
4.1.2 触发RDB生成的方式
手动触发:通过执行 SAVE 或 BGSAVE 命令。
自动触发:基于 Redis 配置文件中的 save 指令设置的条件。(默认是通过 BGSAVE 命令来触发的)
手动触发
- save(由redis主进程来执行RDB,会阻塞其他所有命令)
- bgsave(开启子进程执行RDB,别的进程不受影响)
演示
(1) 手动 save 命令
通过在 redis-cli
客户端中执行 save
命令可立即进行一次持久化保存。 save
命令在执行期间会 阻塞 redis-server
进程,直至持久化过程完毕。而在 redis-server
进程阻塞期间, Redis 不能处理任何读写请求,无法对外提供服务。
(2) 手动 bgsave 命令
通过在 redis-cli 客户端中执行 bgsave 命令可立即进行一次持久化保存。不同于 save 命令的是,正如该命令的名称一样, background save ,后台运行 save 。 bgsave 命令会使服务器进程 redis-server 生成一个子进程,由该子进程负责完成保存过程 。在子进程进行保存过程中,不会阻塞 redis-server 进程对客户端读写请求的处理。
自动触发
Redis内部有触发RDB的机制,可以在redis.conf文件中找到, 默认配置如下:
可以根据需求,手动修改,如下:
redis 配置文件 save 指令设置:
save 3600 1 # 3600秒内如果超过1个key被修改则生成 RDB
save 300 100 # 300秒内如果超过100个key被修改则生成 RDB
save 60 10000 # 60秒内如果超过10000个key被修改则生成 RDB
自动条件触发的本质仍是 bgsave
命令的执行。只不过是用户通过在配置文件中做相应的设置后, Redis 会根据设置信息自动调用 bgsave
命令执行。具体配置方式,后面会详解
查看持久化时间
4.1.3 RDB的执行原理
bgsave开始时会fork(复制)主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。
4.2 AOF
4.2.1 什么是AOF
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
4.2.2 开启和配置AOF
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF
在redis.conf文件里修改以下配置:
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
4.2.3 AOF优化——重写功能
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
5. RDB和AOF对比
6. 面试回答★
6.1 redis做为缓存,数据的持久化是怎么做的?(一次性回答)
redis自身存在两种方案,分别叫RDB和AOF,以此来保障数据的持久化。其中RDB默认开启AOF默认关闭。
RDB全称Redis Database Backup file,即Redis数据备份文件,也被叫做Redis数据快照。它整个是个二进制文件,在保存的时候,文件体积是比较小,恢复数据的速度快,但是它有可能会丢数据。
AOF全称是Append Only File。Redis处理的每一个写命令都会记录在这个AOF文件中,可以看做是一个命令日志文件。它整个文件的体积会比较大,当redis实例岩机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据,所以恢复数据的速度会慢一些,但是它丢数据的风险要小很多。 一般在实际开发中我们都是结合两者去使用的。
6.2 redis做为缓存,数据的持久化是怎么做的?(等面试官追问)
候选人:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF
6.3 这两种持久化方式有什么区别呢?(等面试官追问)
候选人:RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。
AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据
6.4 这两种方式,哪种恢复的比较快呢?
候选人:RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令
文章参考:
后端 - 全面解析 Redis 持久化:RDB、AOF与混合持久化 - 个人文章 - SegmentFault 思否