Redis 持久化详解:RDB 与 AOF 的配置、触发机制和实际测试

什么是持久化?

就是 Redis 将内存数据持久化到硬盘,避免从数据库恢复数据。之所以避免从数据库恢复数据是因为后端数据通常有性能瓶颈,大量数据从数据库恢复可能会给数据库造成巨大压力。

Redis 持久化通常有 RDB 和 AOF 两种方式,RDB 相当于快照备份,AOF 相当于追加形式的备份。

Redis 重启的时候,恢复数据的优先级 RDB > AOFAOF 恢复的优先级 appendonly.aof.{x}.base.rdb>appendonly.aof.{x}.incr.aof

一、RDB

1.1、什么是 RDB?

RDB 是 Redis DataBase 的缩写,RDB 就是将当前进程数据生成的快照保存到磁盘(相当于某一时刻的快照),因此磁盘中的值 <= 内存中的值。

1.2、RDB 怎么配置?怎么用?

触发 RDB 分为手动触发和自动触发两方式。

手动触发

手动触发有 save 和 bgsave 两个方式的命令

  • save 命令:阻塞当前 Redis 服务器,直到 RDB 操作完成为止。如果 Redis 中数据比较多,会造成长时间的阻塞,线上不建议使用此命令。此命令通常主动执行 save 命令或者手动停止重启 redis 服务的时候触发。
  • bgsave 命令:Redis 进程执行 fork 操作创建子进程,RDB 的持久化由子进程负责,完成后自动结束。阻塞只会发生在 fork 阶段,时间通常很短。此命令通常在 redis.conf 中配置 save m n 触发。

bgsave 流程如下

  1. Redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令。
  2. 主进程判断当前是否存在正在执行的子进程,如果存在,主进程直接返回。
  3. 如果不存在正在执行的子进程,fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完以后,主进程去执行其他操作。
  4. 子进程先将数据写入到临时的 rdb 文件中,待快照数据写入完成以后,替换旧的 rdb 文件。
  5. 同时子进程发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息。
graph TD
    A[开始] -->|执行 bgsave 命令| B(判断是否存在执行的子进程)
    B -->|存在| C[主进程直接返回]
    B -->|不存在| D[fork 新的子进程]
    D -->|fork 完成| E[主进程继续其他操作]
    D -->|写入数据到临时 RDB| F[写入完成]
    F -->|替换旧的 RDB 文件| G[发送信号给主进程]
    G -->|主进程更新统计信息| H[结束]

img

自动触发

在下面 4 种情况下会自动触发

  1. redis.conf 中配置 save m n,即在 m 秒中有 n 次修改,自动触发 bgsave 生成 rdb 文件。
  2. 主从复制的,从节点从主节点全量复制的时候。
  3. 执行 debug reload 命令的时候。
  4. 执行 shutdown 命令的时候。

关闭 RDB 持久化 redis.config 文件中设置 save "" 就会关闭 redis 的 rdb 持久化(redis.config 文件更改以后,需要重启 redis,redis 的配置才会生效),除非手动执行 save/bgsave 命令,否则 redis 不会进行 rdb 操作。

1.3、实际测试
  1. 停止 redis,redis 自动执行 save 命令,保存数据。

img

img

  1. 通过几秒内几个键更改,自动 rdb。

img

img

img

二、AOF

2.1、什么是 AOF?

AOF 是 Redis 以追加形式备份 Redis 数据的一种方式。

AOF 持久化的工作机制:

  1. 当 Redis 执行了一个写命令(SET、LPUSH、SADD)时,它会将该命令以文本协议的形式追加导 AOF 文件的末尾。
  2. 为了保证 Redis 在发生故障的时候,数据也不会丢失,Redis 会不断地将这些命令写入硬盘。
  3. 当 Redis 重启的时候,它会读取 AOF 文件中所有的命令并重新执行它们,一次来回复数据。

AOF 的三种同步频率:

  1. always:每个 Redis 写命令都会立刻同步到 AOF 文件中,这种模式提供了非常高的数据安全性,但是由于每次写入都需要进行磁盘 IO,性能可能会受到影响。
  2. everysec(默认配置):每秒钟同步一次,这种模式下,如果发生故障,最多丢失一秒钟的数据。这通常是一种很好的这种方案,提供了良好的性能和合理的数据安全性。
  3. no:由操作系统决定何时进行同步,这种模式可能会导致数据的丢失,因为在发生故障时,系统可能还没有来的及将数据写入磁盘。

AOF 文件的重写(压缩):

随着时间的推移,AOF 文件可能会变得非常大,因为每次写操作都会追加到文件中。Redis 提供了 AOF 重写的功能,这个过程可以创建一个新的 AOF 文件,文件中只包含了恢复当前数据状态所需要的最小命令集。这样可以减少磁盘的占用空间,并提高 Redis 的恢复速度。

Redis 的 AOF 重写是一个后台操作,它不会阻塞主 Redis 进程。在重写的过程中,对数据库的新写入会同时记录在旧的 AOF 文件和一个重写缓冲区中。当新的 AOF 文件准备好后,Redis 会将重写缓冲区中的所有命令追加到新的 AOF 文件中,并进行原子的替换旧的 AOF 文件。

AOF 持久化对应的文件:

img

2.2、AOF 怎么配置?怎么用?

在 Redis 的配置文件(通常是 redis.conf)中,可以通过以下配置启用 AOF 持久化:

appendonly yes

重写 aof 文件的命令(压缩)

bgrewriteaof

然后根据需要设置 AOF 的同步频率

appendfsync everysec

还可以配置自动重写的触发条件

当 AOF 文件增长到原始大小的 100% (翻倍)时,且文件至少有 64MB 时,Redis 会自动触发重写过程。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
2.3、实际测试

开启 aof 持久化

img

设置 aof备份的频率

img

查看 aof 的日志文件

img

测试压缩后的 aof 文件

img

img

最后

我是 xiucai,一位后端开发工程师。

如果你对我感兴趣,请移步我的[个人博客](),进一步了解。

  • 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊

  • 本文首发于个人博客,未经许可禁止转载💌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…

一道CTFsql注入的问题

打开页面一个登录框&#xff0c;我甚至都没先弱口令登录&#xff0c;直接开始sql测试&#xff0c;结果测到最后发现没有&#xff0c;直接admin/admin就就去了&#xff0c;下次遇到登录框请先测试弱口令&#xff0c;ok&#xff1f; 登录成功后&#xff1a; 这句话提示中提到了…

linux(进程概念)

目录 前言&#xff1a; 正文 冯诺依曼体系结构 操作系统 &#xff08;Operator System&#xff09; 概念 目的 定位 如何理解“管理” 进程组织 基本概念 内核数据结构 代码和数据 查看进程 ps指令 top指令 父子进程 fork创建进程 小结&#xff1a; 前…

【Web】云服务器的购买与使用

目录 一、云服务器的选择 二、配置 一、云服务器的选择 腾讯云、阿里云都可以 有首次试用、学生打折啥的。 租借时间、配置都可以自行选择 二、配置 先进行重置密码、拍摄快照

HCS 华为云Stack产品组件

HCS 华为云Stack产品组件 Cloud Provisioning Service(CPS) 负责laas的云平台层的部署和升级是laas层中真正面向硬件设备&#xff0c;并将其池化软件化的部件。 Service OM 资源池(计算/存储/网络)以及基础云服务(ECS/EVS/PC)的管理工具。 ManageOne ManageOne包括服务中心…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

python tkinter 界面开发基本结构

python tkinter 界面开发基本结构 # -*- coding:utf-8 -*- import tkinter as tkroot_window tk.Tk() # 设置窗口title root_window.title(tkinter 界面开发) # 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x" root_window.geometry(600x500) # 更改…

C++: 内联函数

目录 概念&#xff1a; 与宏的对比&#xff1a; 函数膨胀&#xff1a; 内联函数的特性&#xff1a; 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数…

Git分布式版本控制工具

1、目标 了解Git基本概念 能够概述git工作流程 能够使用Git常用命令 熟悉Git代码托管服务 能够使用idea操作git 2、概述 2.1、开发中的实际场景 场景一&#xff1a;备份 小明负责的模块就要完成了&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突然蓝屏&…

算法基础课-数据结构

单链表 题目链接&#xff1a;826. 单链表 - AcWing题库 思路&#xff1a;AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head&#xff0c;idx表示当前的点&#xff0c;意思是将当前的点链到头结点的后面&#xff0c;再将头结点链在当前idx的前面。 #inc…

2024-01-24-redis4

秒杀活动 需求&#xff1a;库存中有10件商品 商品的信息自定义 同时有100个人去抢购&#xff08;这里100个人的抢购由jmeter来模拟&#xff09; jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

goland课程管理(6)

项目目录结构如下图所示&#xff1a; core包下面&#xff1a; class.go package coreimport "github.com/gin-gonic/gin"func Class1(ctx *gin.Context) {}course.go package coreimport (. "cookie/database". "cookie/model""fmt"…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目&#xff0c;是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目&#xff0c;基于archetype可以创建多种类型的java项目&#xff1b;Maven仓库…

华为三层交换机与防火墙对接配置上网示例

三层交换机与防火墙对接上网配置示例 组网图形 图1 三层交换机与防火墙对接上网组网图 三层交换机简介配置注意事项组网需求配置思路操作步骤配置文件 三层交换机简介 三层交换机是具有路由功能的交换机&#xff0c;由于路由属于OSI模型中第三层网络层的功能&#xff0c;所以…

VMware 虚拟机环境下的ubuntu 上安装mysql,并能远程访问数据库

需求&#xff1a;为了实现在linux上模拟服务器跑代码&#xff0c;并存储在mysql上&#xff0c;通过远程可视化mysql数据库软件查看linux上mysql数据库数据的实时动态。 1. 虚拟机和ubuntu的安装 这里我选择的是VMware workstation-v14, ubuntu-18.04.1。至于体流程网上很多&a…

基于Java的高校运动会管理系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

Django ORM 框架中的表关系,你真的弄懂了吗?

Django ORM 框架中的表关系 前言 Django ORM 框架中的表关系 为了说清楚问题&#xff0c;我们设计一个 crm 系统&#xff0c;包含五张表&#xff1a; 1.tb_student 学生表 2.tb_student_detail 学生详情表 3.tb_salesman 课程顾问表 4.tb_course 课程表 5.tb_entry 报名表…

Vue2.0+Element实现日历组件

(壹)博主介绍 &#x1f320;个人博客&#xff1a; 尔滨三皮⌛程序寄语&#xff1a;木秀于林&#xff0c;风必摧之&#xff1b;行高于人&#xff0c;众必非之。 (贰)文章内容 1、安装依赖 npm install moment2.29.4 --savenpm install lunar0.0.3 --savenpm install lunar-java…

C语言数据结构——链表

&#xff08;图像由AI生成&#xff09; 0.前言 在计算机科学中&#xff0c;数据结构是存储和组织数据的一种方式&#xff0c;它不仅影响数据的存储&#xff0c;也影响数据的检索和更新效率。C语言&#xff0c;作为一种经典的编程语言&#xff0c;提供了灵活的方式来处理数据…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…