Redis的持久化机制详解

前言

由于 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 命令。

3.自动化

根据redis配置文件redis.conf中设置的规则自动触发

redis.conf:
# 时间策略
save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
save 60 10000  # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB
 
# 文件名称
dbfilename dump.rdb

RDB优缺点

优势   

1、执行效率高,适用于大规模数据的备份恢复。自动备份不会影响主线程工作。   

2、备份的文件占用空间小。其备份的是数据快照,相对于AOF来说文件大小要小一些。   

劣势   

1、可能会造成部分数据丢失。因为是自动备份,所以如果修改的数据量不足以触发自动备份,同时发生断电等异常导致redis不能正常关闭,所以也没有触发关闭的备份,那么在上一次备份到异常宕机过程中发生的写操作就会丢失。   

2、自动备份通过fork进程来执行备份操作,而fork进程会将当前进程的内存数据完整的复制一份,所以这个过程占用的空间是原来的2倍,可能会导致内存不足

AOF

AOF(append only file):记录每次对服务器写的操作(命令),当服务器重启的时候会重新执行这些命令来恢复原始的数据。

开启AOF

AOF是默认不开启的

# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes 【yes开启/no关闭】

AOF机制的实现原理


 

如上图所示,AOF 持久化功能的实现可以分为命令追加( append )、文件写入( write )、文件同步( sync )、文件重写(rewrite)和重启加载(load)。其流程如下:

  • 所有的写命令会追加到 AOF 缓冲中。
  • AOF 缓冲区根据对应的策略向硬盘进行同步操作。
  • 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  • 当 Redis 重启时,可以加载 AOF 文件进行数据恢复

AOF同步

Redis 每次结束一个事件循环之前,它都会调用 flushAppendOnlyFile 函数,判断是否需要将 AOF 缓存区中的内容写入和同步到 AOF 文件中

flushAppendOnlyFile 函数的行为由 redis.conf 配置中的 appendfsync 选项的值来决定。该选项有三个可选值,分别是 always、 everysec 和 no

# appendfsync always    每执行一个命令保存一次 高消耗,最安全
appendfsync everysec    每一秒钟保存一次
# appendfsync no    只写入 不保存, AOF 或 Redis 关闭时执行,由操作系统触发刷新文件到磁盘

AOF数据恢复

 

Redis 读取 AOF 文件并且还原数据库状态的详细步骤如下:

  • 创建一个不带网络连接的的伪客户端( fake client),因为 Redis 的命令只能在客户端上下文中执行,而载入 AOF 文件时所使用的的命令直接来源于 AOF 文件而不是网络连接,所以服务器使用了一个没有网络连接的伪客户端来执行 AOF 文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样的。
  • 从 AOF 文件中分析并取出一条写命令。
  • 使用伪客户端执行被读出的写命令。
  • 一直执行步骤 2 和步骤3,直到 AOF 文件中的所有写命令都被处理完毕为止。

当完成以上步骤之后,AOF 文件所保存的数据库状态就会被完整还原出来

小结

如果同时存在RDB和AOF的话,应该先执行哪个?

1.首先会判断AOF文件是否存在,AOF存在,执行AOF;

2.AOF不存在,判断RDB是否存在

3.RDB存在,执行RDB;

4.RDB不存在,redis重启失败

  • 29
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值