Redis系列之持久化机制RDB和AOF

Redis系列之持久化机制RDB和AOF

文章目录

  • 1. 为什么需要持久化?
  • 2. 持久化的方式
  • 3. RDB机制
    • 3.1 RDB机制介绍
    • 3.2 配置RDB
    • 3.3 什么时候触发
    • 3.4 操作实例
    • 3.5 RDB优势和不足
  • 4. AOF机制
    • 4.1 什么是AOF机制?
    • 4.2 同步机制
    • 4.3 重写机制
    • 4.4 AOF的优势和不足
  • 混合模式
  • 参考资料

1. 为什么需要持久化?

Redis的数据是保存在内存中的,如果每次关闭或者机器断电,就会出现数据丢失,所以需要进行持久化保存处理

2. 持久化的方式

Redis进行持久化保存的方式主要有两种:RDB和AOF,在redis官网也有进行介绍: https://redis.io/docs/manual/persistence/

3. RDB机制

3.1 RDB机制介绍

RDB,Redis Database快照,是Redis默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写到磁盘,生成一个快照文件,默认的文件名为dump.rdb

3.2 配置RDB

可以在redis.conf配置RDB文件的文件名和路径

  # The filename where to dump the DB
  dbfilename dump.rdb 
  
  # 文件路径
  dir ./

3.3 什么时候触发

  • 自动触发

    • 配置触发

      # 在redis.conf配置,配置300s检查一次,至少有1个key被修改就触发
      save 300 10 
      
    • shutdown关闭触发

      在redis执行shutdown正常关闭的时候会去持久化数据到磁盘

    • flushall命令触发

      清空数据操作会触发RDB操作,并且生成一个空的RDB文件,所以,如果没有开启其它持久化方式的时候,使用flushall是很危险的,在生产环境慎用

  • 手动触发

    • save

    • bgsave

      redis-cli使用savebgsave命令

    127.0.0.1:6379> save
    OK
    127.0.0.1:6379> bgsave
    Background saving started
    127.0.0.1:6379>
    

    save和bgsave对比

    命令savebgsave
    IO类型同步异步
    阻塞是(发生在fork)
    复杂度O(n)O(n)
    消耗内存不会消耗额外内存fork消耗内存
    备份主线程去进行备份,备份期间不会去处理其它的指令,其它指令必须等待子线程去进行备份,其它指令正常执行

3.4 操作实例

添加一些数据

127.0.0.1:6379>set k1 1
127.0.0.1:6379>set k2 2
127.0.0.1:6379>set k3 3

查询验证数据是否保存成功

127.0.0.1:6379>keys *

shutdown操作触发RDB进行快照

127.0.0.1:6379>shutdown

在redis目录里对dump.rdb文件进行备份,备份一份新的dump.rdb.backup,然后重新启动redis

然后再来模拟一些删库跑路

127.0.0.1:6379>flushall

然后关闭redis服务端,再启动,发现数据已经丢失,要恢复数据,只能先删了dump.rdb,再将备份的dump.rdb.backup改为dump.rdb,重启redis,发现数据已经恢复

3.5 RDB优势和不足

  • RDB的优点:

    Redis官网总结归纳的redis RDB的优点

    在这里插入图片描述

    • RDB是个紧凑型的文件,适合容灾备份,恢复速度非常快

    • RDB最大限度的提高性能,会fork一个子进程,父进程不会产生磁盘io

    • 可以做到很快的重启

      简而言之,RDB备份与恢复都非常的快

  • RDB的不足:

    在这里插入图片描述

    • 数据安全性不是很高,因为是根据配置的时间来备份,假如每5分钟备份一次,就可能会有5分钟数据的丢失

    • 经常fork子线程,所以会比较耗CPU,对CPU不是很友好

4. AOF机制

由于RDB的数据安全性不是很好,所以redis又提供了另外一种持久化方案,AOF

4.1 什么是AOF机制?

AOF:Append Only File,顾名思义,就是一种追加文件的意思,工作机制比较好理解,redis会将每一个收到的写命令通过write函数追加到文件中,通俗理解就是日志记录

AOF机制默认是关闭的,你可以在配置文件中开启,找到redis.conf

# 默认是关闭的,可以进行开启
appendonly no
# The name of the append only file (default:"appendonly.aof")
appendfilename "appendonly.aof"

4.2 同步机制

在这里插入图片描述

  • appendfsync always:表示每次写入都执行fsync刷新函数,性能会非常慢,但是非常安全
  • appendfsync everysec: 每秒执行一次fsync函数,可能丢失1s的数据
  • appendfsync no:由操作系统保证数据同步到磁盘,速度最快,你的数据只需要交给操作系统就行

4.3 重写机制

由于AOF是追加的形式,所以文件就会越来越大,越大的话,数据加载越慢,所以我们需要对AOF文件进行重写

  • 重写流程:

以redis7之前的版本为例

  1. Redis fork一个子进程,在一个临时文件中写入新的数据
  2. 如果在写入新的文件的过程中,主进程还会有指令进入,那么主进程会在内存缓存区中累计新的指令
  3. 如果子进程重写完成,主进程会收到完成信号,并且将缓存中的指令追加到新的aof文件中
  4. 替换旧的aof文件,并且将新的指令附加到重写好的aof文件中
  • 什么时候重写?

    需要配置文件redis.conf

    # 配置达到百分比大小就触发重写
    auto-aof-rewrite-percentage 100
    # 配置达到文件大小就触发重写,就算达到第一个百分比大小,也必须大于64M才触发重写
    auto-aof-rewrite-min-size 64mb
    

举例,在aof文件达到64mb的时候就重写1次,重写后的aof文件大小假如为50mb,上面第一个配置auto-aof-rewrite-percentage为100,即aof文件到了100mb的时候,进行再次重写

4.4 AOF的优势和不足

  • 优势

    1. 安全性高,就算是使用默认的持久化同步机制,也最多只会导致1s的数据丢失

    2. AOF文件相对安全,AOF文件由于某些原因,比如磁盘满了等导致追加失败,也可以通过redis-check-aof工具来修复

      [root@localhost src]$ ./redis-check-aof --fix append
      
    3. 数据格式都是追加的日志,所以可读性更高

  • 不足

    1. 数据集一般比RDB大
    2. 持久化和加载都比RDB慢
    3. 在redis7.0版本之前,重写的时候,新的指令会缓存到内存区,所以会导致占用大量的内存
    4. 在重写期间,会跟磁盘进行两次IO,一个是写入旧的AOF文件,一个是写入新的AOF文件

混合模式

看了上面的介绍,我们知道RDB和AOF两种方式各有优缺点,RDB会有数据丢失的风险,但是备份和恢复的速度很快,AOF虽然可以保证数据的一致性,但是恢复数据时候会很慢。

所以从Redis4.0之后加了一种混合RDB和AOF的模式,这种模式,前部分是使用RDB格式 作为全量备份,后面部分使用AOF追加的写命令数据作为增量备份

在这里插入图片描述

混合模式开启,在redis.conf里修改配置

aof-use-rdb-preamble yes 

参考资料

  • https://redis.io/docs/management/persistence/
  • Redis进阶 - 持久化:RDB和AOF机制详解
  • Redis两种持久化机制RDB和AOF详解

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

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

相关文章

SQL注入攻击 - update注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、MySQL UPDATE语句复习: UPDATE语句用于修改表中的数据,基本形式为:UPDATE 表名称 SET 列名称新值 WHERE 更新条件;语…

SpringCloud Ribbon 负载均衡服务调用

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第三篇,即介绍 Ribbon 负载均衡服务调用 二、概述 2.1 Ribbon 是什么 Spring Cloud Ribbon…

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的: 熟悉yum和编译安装操作 锻炼关联性思维,便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…

PCL不同格式点云读取速度(Binary和ASCII )

首先说明一点:Binary(二进制)格式点云文件进行读取时要比Ascll码格式点云读取时要快的多,尤其是对于大型的点云文件,如几百万、甚至几千万个点云的情况下。 今天遇到了一种情况,在写项目的时候进行点云读取,读取的时候…

3.5作业

课程代码复习&#xff1a; 使用select完成TCP并发服务器&#xff1a; #include<myhead.h> #define SER_IP "192.168.244.140" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接…

6. 虚拟机及Linux安装

虚拟机及Linux安装 进行嵌入式项目开发&#xff0c;第一步就是要建立嵌入式开发环境&#xff0c;主要包括安装 Bootloader 工具、不同平台的交叉编译器&#xff08;如ARM 平台的arm-linux-gcc&#xff09;、内核源码树&#xff08;在需要编译和配置内核时&#xff09;、在调试…

docker学习进阶

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

第11周,第三期技术动态

大家好&#xff0c;才是真的好。 真没想到&#xff0c;本周是今年第十一周&#xff0c;2024年还有不到三百天就结束了。 今天周五&#xff0c;我们继续介绍与Domino相关产品新闻&#xff0c;以及互联网或其他IT行业动态等。 一、在Windows 10和Windows 11上运行Domino和Trav…

错误和异常之标准异常创建异常

标准异常 表 10.2 列出了所有的 Python 当前的标准异常集,所有的异常都是内建的. 所以它们在脚本启动 前或在互交命令行提示符出现时已经是可用的了. 表10.2 Python内建异常 异常名称描述所有异常的基类 python 解释器请求退出 用户中断执行(通常是输入^C) 常规错误的基类

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言&#xff1a; 最近OpenAI公司的新产品Sora的发布&#xff0c;正式掀起了AI在视频创作相关行业的革新浪潮&#xff0c;AI不再仅限于文本、语音和图像&#xff0c;而直接可以完成视频的生成&#xff0c;这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

仿牛客项目Day02:http、调试、日志、git

http状态码 后端调试 f8&#xff1a;逐行执行 f7&#xff1a;进入语句内部 f9&#xff1a;执行到下一个断点 前端调试 f10&#xff1a;逐行调试 f11&#xff1a;进入语句内部 f8&#xff1a;执行到下一个断点 日志 按照级别开启日志 日志的测试类 比如把application里…

基于交叉表生成风控规则(Python)

大家好&#xff0c;我是东哥。 规则是风控策略中最常用的工具之一&#xff0c;生成、筛选、监控、调优&#xff0c;几乎每天都在打交道&#xff0c;本篇来介绍如何基于交叉表来生成风控规则&#xff0c;并且如何基于评估指标进行筛选。 出品人&#xff1a;东哥起飞 专栏&#…

【字符串】【分类讨论】【KMP】1163. 按字典序排在最后的子串

作者推荐 视频算法专题 本文涉及知识点 字符串 字典序 分类讨论 本题无法使用KMP&#xff0c;因为t1不段变化。 LeetCode1163. 按字典序排在最后的子串 给你一个字符串 s &#xff0c;找出它的所有子串并按字典序排列&#xff0c;返回排在最后的那个子串。 示例 1&#xf…

图论入门题题解

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题_脑子不好的小菜鸟的博客-CSDN博客 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 拓扑排序 / 家谱…

基于Docker搭建Maven私服仓库(Linux)详细教程

文章目录 1. 下载镜像并启动容器2. 配置Nexus3. 配置本地Maven仓库 1. 下载镜像并启动容器 下载Nexus3镜像 docker pull sonatype/nexus3查看Nexus3镜像是否下载成功 docker images创建Nexus3的挂载文件夹 mkdir /usr/local/nexus-data && chown -R 200 /usr/local…

cadence 之 Allegro PCB封装 3D模型

Allegro PCB封装怎样赋3D模型 1、方式一 —— 设置器件高度 2、方式二 —— 指定STEP模型 2.1、Step 3D模型库 2.2、软件环境的设置和 STEP 模型库路径设置 D:\Cadence\Cadence_SPB_17.4-2019\share\local\pcb\step 2.3、指定STEP模型 即可打开 STEP 模型指定的对话框&…

【HarmonyOS】ArkTS-对象方法

目录 对象方法实例 对象方法 方法作用&#xff1a;描述对象的具体行为 约定方法类型 interface 接口名称 { 方法名: (参数:类型) > 返回值类型 }interface Person{dance: () > voidsing: (song: string) > void}添加方法&#xff08;箭头函数&#xff09; let ym: P…

服务器配置禁止IP直接访问,只允许域名访问

联网信息系统需设置只允许通过域名访问&#xff0c;禁止使用IP地址直接访问&#xff0c;建议同时采用云防护技术隐藏系统真实IP地址且只允许云防护节点IP访问服务器&#xff0c;提升网络安全防护能力。 一、Nginx 修改配置文件nginx.conf&#xff0c;在server段里插入正则表达式…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

LoadBalancer 客户端的负载均衡器+openFeign 请求转发

LoadBalancer Spring Cloud LoadBalancer是Spring Cloud中负责客户端负载均衡的模块&#xff0c;其主要原理是从nacos中获取服务列表通过选择合适的服务实例来实现负载均衡。 源码跟踪 可以看到这里的intercept()方法&#xff0c;拦截了用户的HttpRequest请求&#xff0c;然…