Post on: 2024-8-25Last edited: 2024-8-25Words 00 min

type
status
date
slug
summary
tags
category
icon
password

前言

由于 Redis 的数据都存放在内存中,如果没有配置持久化,redis 重启后数据就全部丢失了,这时候就需要 Redis 持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。

redis 提供两种方式进行持久化:

RDB 持久化(原理是将Redis在内存中的记录定时dump到磁盘的持久化) AOF 持久化(原理是将Redis的操作日志的写命令重新执行一遍)

RDB

RDB就是将某一时刻内存中的数据以快照的形式存储下来。[快照你可以理解为当前内存数据集的照片]
RDB持久化实际上就是在指定间隔时间内,将内存中的数据集快照存储到磁盘上。RDB也是Redis默认的持久化方式,以默认的方式将数据集快照存储到二进制文件中,默认文件名为:dump.rdb
RDB的同步的三种机制:save、bgsave、自动化 1.save save命令会将当前Redis的其他命令阻塞掉,执行save命令期间,Redis不能执行其他命令,直至所有数据全部写入RDB文件。执行完成后,会将之前的dump.rdb文件替换掉。
如果此时客户端数量庞大,会阻塞成千上万的请求。
2.bgsave bgsave是Redis后台进行异步快照操作。
具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
notion image
3.自动化 根据redis配置文件redis.conf中设置的规则自动触发

时间策略

文件名称
dbfilename dump.rdb RDB优缺点 优势    1、执行效率高,适用于大规模数据的备份恢复。自动备份不会影响主线程工作。
2、备份的文件占用空间小。其备份的是数据快照,相对于AOF来说文件大小要小一些。
劣势    1、可能会造成部分数据丢失。因为是自动备份,所以如果修改的数据量不足以触发自动备份,同时发生断电等异常导致redis不能正常关闭,所以也没有触发关闭的备份,那么在上一次备份到异常宕机过程中发生的写操作就会丢失。
2、自动备份通过fork进程来执行备份操作,而fork进程会将当前进程的内存数据完整的复制一份,所以这个过程占用的空间是原来的2倍,可能会导致内存不足

AOF

AOF(append only file):记录每次对服务器写的操作(命令),当服务器重启的时候会重新执行这些命令来恢复原始的数据。
开启AOF AOF是默认不开启的
可以通过修改redis.conf配置文件中的appendonly参数开启
AOF机制的实现原理
notion image
如上图所示,AOF 持久化功能的实现可以分为命令追加( append )、文件写入( write )、文件同步( sync )、文件重写(rewrite)和重启加载(load)。其流程如下:
  1. 所有的写命令会追加到 AOF 缓冲中。
  1. AOF 缓冲区根据对应的策略向硬盘进行同步操作。
  1. 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  1. 当 Redis 重启时,可以加载 AOF 文件进行数据恢复
AOF同步 Redis 每次结束一个事件循环之前,它都会调用 flushAppendOnlyFile 函数,判断是否需要将 AOF 缓存区中的内容写入和同步到 AOF 文件中
flushAppendOnlyFile 函数的行为由 redis.conf 配置中的 appendfsync 选项的值来决定。该选项有三个可选值,分别是 always、 everysec 和 no
 

AOF数据恢复

notion image
Redis 读取 AOF 文件并且还原数据库状态的详细步骤如下:
  1. 创建一个不带网络连接的的伪客户端( fake client),因为 Redis 的命令只能在客户端上下文中执行,而载入 AOF 文件时所使用的的命令直接来源于 AOF 文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行 AOF 文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样的。
  1. 从 AOF 文件中分析并取出一条写命令。
  1. 使用伪客户端执行被读出的写命令。
  1. 一直执行步骤 2 和步骤3,直到 AOF 文件中的所有写命令都被处理完毕为止。
  1. 当完成以上步骤之后,AOF 文件所保存的数据库状态就会被完整还原出来

小结

如果同时存在RDB和AOF的话,应该先执行哪个?
1.首先会判断AOF文件是否存在,AOF存在,执行AOF;
2.AOF不存在,判断RDB是否存在
3.RDB存在,执行RDB;
4.RDB不存在,redis重启失败
💡
有关本博客相关的任何问题,欢迎您在底部评论区留言,一起交流~
 

Loading...
关于作者

💛关于作者

关于作者

💛关于作者

Announcement
本博客纯属为爱发电,不收取任何费用,如果有任何问题,都可以联系作者本人
微信:18995157457
邮箱:2897718178@qq.com