Redis持久化

ops/2024/9/24 17:13:39/

为什么需要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 


http://www.ppmy.cn/ops/32205.html

相关文章

Redis集合 set 详解

Set简介 set 类似于 Java 中的 HashSet ,是redis中的一种数据结构,它是一个无序并且唯一的键值集合,并且储存时不会按照插入的先后顺序进行.一个集合中最多可以储存2^32 -1个元素。当你需要存储一个列表数据,又不希望出现重复数据时&#xf…

Podman相比Docker在轻量级部署上的优势是什么?

Podman在轻量级部署上的优势主要体现在无需守护进程、快速启动和低资源占用以及与Docker的兼容性。具体如下: 无需守护进程: Podman的设计不依赖于任何长期运行的后台服务或守护进程,这意味着它能够在没有root权限的情况下运行容器。这种设…

数据库学习之用户管理和权限问题

未完成 grant命令 grant命令用来管理权限,grant是集授权、创建用户、修改密码到等一系列权限于一身的一个命令。 语法 grant 权限列表 on 库名.表名 to 用户名客户端主机 [identified by 密码 with option参数]; 例子 任意数据库全部权限赋给123这个用户&…

Day43代码随想录动态规划part05:1049.最后一块石头的重量II、494.目标和、474.一和零

Day43 动态规划part05-01背包问题 1049.最后一块石头的重量II leetcode题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 题意:有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。…

14_Scala面向对象编程_属性

属性 1.类中属性声明 // 1.给Scala声明属性;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值,为了解决此问题可以采用下划线赋值,表示系统默认赋值 , –但是此方法局限于变量&…

如何使用SSH密钥克隆仓库

1.创建SSH Key 在用户目录下查看有没有.ssh目录。如果有且该.ssh目录下有id_rsa(私钥),和id_rse_pub(公钥)这俩文件,那么这一步就可以跳过。否则使用以下指令创建SSH Key ssh-keygen -t rsa -C "xxxqq.com" "xx…

Qt之信号与槽

槽的本质:对信号响应的函数。 信号函数和槽函数通常位于某个类中,和普通的成员函数相⽐,它们的特别之处在于: 信号函数⽤ signals 关键字修饰,槽函数⽤ public slots、protected slots 或者 private slots 修饰。sign…

使用Ruoyi的定时任务组件结合XxlCrawler进行数据增量同步实战-以中国地震台网为例

目录 前言 一、数据增量更新机制 1、全量更新机制 2、增量更新机制 二、功能时序图设计 1、原始请求分析 2、业务时序图 三、后台定时任务的设计与实现 四、Ruoyi自动任务配置 1、Ruoyi自动任务配置 2、任务调度 总结 前言 在之前的相关文章中,发表文章列…