Redis持久化

为什么需要Redis持久化?

redis的数据是存储在内存上的,而设备发生断电等故障的时候内存上的数据会消失,写入磁盘的数据不会受到断电的影响,因此我们需要将redis的数据持久化到磁盘上

redis官方提供了rdb(redis database),aof(append only file)两种持久化方式

rdb类似于我们虚拟机的快照,将某一时刻的数据和状态以文件的方式保存,aof则是将每一条写操作记录到一个文件中

rdb

什么是rdb

一句话说就是在指定的时间间隔,执行数据集的时间点快照,把数据和状态以快照文件的方式保存到磁盘,这个快照文件就是rdb文件

rdb备份文件是全量备份,每次备份将整个数据库的数据都进行备份

如何使用rdb

rdb分为自动触发手动触发两种方式

自动触发

从redis配置文件中可以看到redis自动触发rdb备份的条件:

  1. 1小时内发生至少一次键变化
  2. 5分钟内发生至少100次键变化
  3. 1分钟内发生至少10000次键变化

把433行的#号去掉即开启rdb自动触发,其中的数值可以按需修改

同样的,我们可以在配置文件中设置rdb文件的保存路径以及rdb文件的名称

手动触发

redis提供了两种命令来手动生成rdb文件,分别为save和bgsave

两种都可以保存数据,区别在于save是阻塞的,而bgsave是非阻塞

save会导致redis服务器无法响应其他请求,必须等待数据备份成功了才能解除阻塞

bgsave会fork一个子进程,通过子进程去备份redis的数据,在后台完成备份,允许主进程修改数据

因此在生产环境中不要使用save命令

恢复数据

当我们flushdb/flushall清空了redis数据的时候应该如何将数据恢复?

首先我们需要明确的是当我们使用flushdb/flushall命令的时候我们的rdb会和我们的最新状态保持一致,也就是说rdb文件也是空的,如果我们没有事先保存rdb文件的备份或者aof文件的话,那就是寄了

如果有事先保存rdb文件备份,那么将该文件放到redis安装路径下,在下一次重启的时候,redis会自动读取rdb的数据,数据将自动恢复

禁用rdb

  1. 在配置文件中启用save ""
  2. 执行命令redis-cli config set save ""

rdb的优缺点

优点

  1. 适合大规模的数据恢复
  2. 可以按照业务定时备份
  3. 适合对数据完整性和一致性要求不高的
  4. 在内存中加载速度比aof快
  5. 提高redis的性能

 缺点

  1.  快照之间会丢失数据(有部分数据会因为没达到自动触发rdb的条件而丢失)
  2. 数据量太大时全量备份会使用大量I/O影响服务器性能
  3. 数据量大的时候fork可能会导致服务请求的瞬间延迟,因为fork会将内存数据克隆

什么情况会触发rdb快照

  1. 配置文件中设置的自动触发条件
  2. 手动save/bgsave
  3. 执行flushall/flushdb命令生成空的rdb文件
  4. 执行shutdown且没有设置aof持久化
  5. 主从复制时,主节点自动触发

 aof

什么是aof

aof就是以日志的形式来记录每一个写操作,将redis执行过的所有写操作记录下来保存为aof文件

数据恢复时redis从头开始执行aof文件中的每一条指令以完成数据恢复工作

使用aof需要在配置文件中将appendonly 改为yes,默认不开启aof

aof缓冲区写回策略

为避免频繁的I/O,aof引入了缓冲区,何时将缓冲区的数据写入到文件中自然涉及到我们的写回策略

写回策略分三种:always,everysec,no,看名字就能知道是什么意思

在配置文件中可以设置启用哪种写回策略

 redis7中aof的新特性

redis7中aof采用了multi part aof的设计方式,将原来的一个aof文件拆分成base,incr,history三个部分

拆分出来的文件将存放在aof目录下,这个目录和rdb文件在同一级目录中

同时我们可以通过配置文件修改aof文件目录名以及保存路径

aof的优缺点

优点

 性能高,可做紧急修复,更好地保护数据不丢失

缺点

文件大,恢复速度慢于rdb,运行效率慢于rdb,每秒同步策略效率较好,不同步时效率和rdb相同

aof重写机制

当aof文件达到一定大小时就会触发redis的重写机制,将aof压缩成可以恢复数据的最小指令集

举个例子:

set k1 v1

set k1 v2

set k1 v3...

当文件达到一定大小时,文件只会保留最后一条有用的指令set k1 v3,其他无用指令统统删除

重写机制分为自动触发手动触发

自动触发

当满足上面两个条件时系统将会自动重写aof文件,且重写过程是由子进程进行的,重写完成后aof文件的序号将会改变,base存储最小的指令集,incr文件继续记录每一条指令,manifest不会改变

这里的旧aof可以理解为incr1,新aof可以理解为incr2 

手动触发 

执行命令 bgrewriteaof

rdb-aof混合持久化

当磁盘中同时存在rdb和aof文件,系统会优先读取aof文件来恢复数据

rdb适合用来备份数据库 

 一旦使用了混合模式,重启服务时将从rdb和aof两部分来恢复数据:rdb快照+aof记录的快照后产生的数据

纯缓存模式

同时关闭rdb和aof

在配置文件中设置save "" 和 appendonly no 

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久化的可能面试问题: 1. Redis持久化有哪些方式? Redis持久化有两种方式,一种是 RDB 持久化,一种是 AOF 持久化。 2. RDB 持久化和 AOF 持久化有什么区别? RDB 持久化是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久化则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久化可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久化可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久化机制是如何保证数据一致性的? Redis持久化机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久化可以在运行时进行吗? 可以,Redis持久化可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久化,或者从 AOF 切换到 RDB 持久化。 5. Redis持久化会对性能产生影响吗? 会,Redis持久化会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久化可以与 Redis 集群一起使用吗? 可以,Redis持久化可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久化是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久化方式,并进行合理的配置和优化。在面试中,还需要了解 Redis 持久化的原理、机制、优缺点、与集群的结合等方面的知识。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值