Redis基础系列-持久化

Redis基础系列-持久化

文章目录

  • Redis基础系列-持久化
    • 1. 什么是持久化
    • 2. 为什么要持久化
    • 3. 持久化的两种方式
      • 3.1 持久化方式1:RDB(redis默认持久化方式)
        • 3.11 配置步骤-自动触发
        • 3.12 配置步骤-手动触发
        • 3.12 优点
        • 3.13 缺点
        • 3.14 检查和修复RDB快照文件
        • 3.15 哪些情况会触发RDB快照
        • 3.16 如何禁用快照
        • 3.17 RDB优化配置项详解
      • 3.2 持久化方式2:AOF
        • 3.2.1 AOF持久化工作流程
        • 3.2.2 三种写回策略
        • 3.2.3 AOF配置说明
        • 3.2.4 AOF文件说明
        • 3.2.5 AOF恢复
        • 3.2.6 AOF文件修复
        • 3.2.7 AOF重写机制
        • 3.2.8 总结
      • 3.3 持久化方式3:混合模式RDB+AOF
        • 3.3.1 混合模式介绍
        • 3.3.2 开启混合方式设置
        • 3.3.3 数据的加载流程
      • 3.4 纯缓存模式
    • 4. 参考和感谢

1. 什么是持久化

内存中的数据保存到磁盘中

2. 为什么要持久化

Redis持久化可以将内存中的数据保存到硬盘上,保证Redis的数据持久性和可靠性以避免数据在异常情况下丢失和损坏。持久化是保证Redis应用安全的重要手段。

3. 持久化的两种方式

redis持久化官网介绍

3.1 持久化方式1:RDB(redis默认持久化方式)

RDB(Redis DataBase)模式是Redis的默认持久化模式。它会将Redis在某个时间点上的数据生成一个快照,并将快照以二进制形式保存在磁盘上。RDB模式的优点在于快速且紧凑,适合用于备份和恢复数据。然而,由于定期生成快照的特性,可能会导致在两次快照之间的数据丢失。

适用场景: 对数据的实时性要求不高,可以接受一定程度的数据丢失,同时对于需要频繁备份和恢复数据的场景。

3.11 配置步骤-自动触发
  • 操作步骤:

1.修改5秒2次变更

save 5 2


2.修改快照文件保存路径(需优先创建:dumpfiles目录)

dir /myredis/dumpfiles

3.修改快照名称

dbfilename dump6379.rdb

  1. 重启redis验证配置是否成功(略)
127.0.0.1:6379> config get save
1) "save"
2) "5 2"
127.0.0.1:6379> config get dir
1) "dir"
2) "/myredis/dumpfiles"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump6379.rdb"
127.0.0.1:6379>
  • 触发配置
// 变更两次,查看是否会生产快照文件
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> 

  • 备份恢复
    • redis 执行flushall也会产生dump文件,不过是空的
    • redis 执行shutdown也会产生dump文件,不过是空的
    • redis 直接重启就会加载备份的快照文件
3.12 配置步骤-手动触发
  • save命令

在主程序中执行会阻塞当前redis服务器,直到持久化工作完成执行save命令期间,Redis不能处理其他命令,线上禁止使用

  • bgsave(Background Save)命令(默认)

Redis会使用bgsave对当前内存中的所有数据做快照这个操作是子进程在后台完成的,这就允许主进程同时可以修改数据

可以通过lastsave命令获取最后一次成功执行快照的时间

127.0.0.1:6379> lastsave
(integer) 1701683772
127.0.0.1:6379> 
[root@Docker110]# date -d @1701683772
2023年 12月 04日 星期一 17:56:12 CST
3.12 优点
  • 适合大规模的数据恢复按照业务定时备份
  • 对数据完整性和一致性要求不高
  • RDB文件在内存中的加载速度要比 AOF 快得多
3.13 缺点
  • 在一定间隔时间做一次备份,所以如果redis章外down掉的话,就会丢失从当前至最近一次快照期间的数据,快照之间的数据会丢失
  • 内存数据的全量同步,如果数据量太大会导致I/O严重影响服务器性能RDB依赖于主进程的fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。fork的时候内存中的数据被克隆了一分,大致2倍的膨胀性,需要考虑
3.14 检查和修复RDB快照文件
redis-check-rdb /myredis/dumpfiles/dump6379.rdb

3.15 哪些情况会触发RDB快照
  • 配置文件中默认的快照配置
  • 手动save/bgsave命令
  • 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
  • 执行shutdown且没有设置开启AOF持久化
  • 主从复制时,主节点自动触发
3.16 如何禁用快照
  • 命令方式:
redis-cli config set save ""
  • 修改配置文件:
3.17 RDB优化配置项详解
  • stop-writes-on-bgsave-error


默认yes
如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时,
也能确保redis继续接受新的写请求
  • rdbcompression

默认yes
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
  • rdbchecksum

默认yes
在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
  • rdb-del-sync-files

rdb-del-sync-files:在没有持久性的情况下删除复制中使用的RDB文件启用。默认情况下no,此选项是禁用的。

3.2 持久化方式2:AOF

AOF(Append Only File)模式是另一种常用的持久化模式。它会将每个写操作都追加到一个日志文件中,从而记录了Redis的所有操作命令。在恢复数据时,Redis会重新执行这些操作命令以还原数据。AOF模式的优点在于数据的持久化更加可靠,不会丢失任何写操作。然而,由于需要记录每一条写命令,相对于RDB模式,AOF模式的写入性能较差。

适用场景: 对数据的可靠性要求较高,需要最大程度地避免数据丢失的场景

3.2.1 AOF持久化工作流程

序号描述
1Client作为命令的来源,会有多个源头以及源源不断的请求命令。
2在这些命令到达Redis Server以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
3AOF缓冲会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件。
4随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
5当Redis Server服务器重启的时候会从AOF文件载入数据。
3.2.2 三种写回策略
配置项写回时机优点缺点
Always同步写回可靠性高,数据基本不丢失每个写命令都要落盘,性能影响较大
Everysec(默认)每秒写回性能适中宕机时丢失1秒内的数据
No操作系统控制性能好宕机时丢失数据较多
3.2.3 AOF配置说明
配置指令描述配置示例
appendonly是否开启AOFappendonly yes
appendfilenameAOF文件名称appendfilename “appendonly.aof”
dir+appenddirnameAOF文件路径dir /myredis+“appendonlydir”
appendfsyncAOF同步写回方式everysec/always/no
no-appendfsync-on-rewriteAOF重写期间是否同步写回no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
AOF重写触发配置,触发重写的比例阈值和最小文件大小阈值;
满足配置文件中的选项后,Redis会记录上次重写时的AOF大小
默认配置是当AOF文件大小是上次rewrite后大小的一倍目文件大于64M时
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
3.2.4 AOF文件说明

Redis7.0 Multi Part AOF的设计
顾名思义,MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件(redis6只有一个文件)。在MP-AOF中,我们将AOF分为三种类型分别为:
它一般由子进程通过重写产生,该文件最多只有一个

  • BASE: 表示基础AOF
  • INCR: 表示增量AOF,
    它一般会在AOFRW开始执行时被创建,该文件可能存在多个。
  • HISTORY: 表示历史AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY,HISTORY类型的AOF会被Redis自动删除为了管理这些AOF文件我们引入了一个manifest (清单) 文件来跟踪、管理这些AOF。同时,为了便于AOF备份和拷贝,我们将所有的AOF文件和manifest文件放入一个单独的文件目录中,目录名由appenddirname配置
    (Redis 7.0新增配置项) 决定。

// 如有下的aof文件存在
1.基本文件
appendonly.aof.1base .rdb
2.增量文件
appendonly.aof.1.incr.aof
appendonly.aof.2.incr.aof
3.清单文件
apendonly.aof.manifest

AOF路径说明

redis7.0 AOF文件路径:dir + appenddirname 其中

  • dir是RDB和AOF共用配置参数
  • appenddirname 是redis7新增的aof独特配置
// 几种类型文件的前缀,后跟有关序列和类型的附加信息
appendfilename"appendonly.aof
//新版本增加的目录配置项目
appenddirname "appendonlydir"
3.2.5 AOF恢复

采用 flushdb + shutdown模拟redis异常终止,需要注意的是:

  • flushdb也是写操作,也会写入aof文件,所以在执行flushdb之前备份aof文件,flushdb之后可以使用 备份的aof 覆盖掉aof文件
  • 也可以不备份,在执行完flushdb + shutdown操作之后,手动删除增量文件中的最后flushdb命令
  • 为了防止RDB文件的干涉,重启之前删除RDB文件,或者模拟整个过程中关闭RDB持久化

最后,重启reids便可加载aof文件进行数据恢复

3.2.6 AOF文件修复

故意破环aof增量文件

[root@Docker110 appendonlydir]# vim appendonly.aof.1.incr.aof 
*2
$6
......
$1
0
jasitfgjwaior943q294r534jiosa(*(u

重启启动之后查看

居然启动失败,赶紧查看一下日志,日志文件

日志文件路径的配置

建议让我们修复一下aof文件

再次启动,成功恢复

3.2.7 AOF重写机制

AOF 文件的不断增长可能会导致性能问题。为了解决这个问题,Redis 实现了 AOF 重写机制。AOF 重写是一种优化技术,通过在后台进程中重构 AOF 文件的数据,来减小 AOF 文件的大小。
启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集

也就是说 AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,
然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。
AOF 文件重写触发机制: 过 redis.conf 配置文件中的 auto-aofrewrite-percentage: 默认值为100,以及auto-aofrewritemin-size: 64mb 配置,
也就是说默认Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍目文件大于64M时触发
  • 重写机制的配置

注意 ,同时满足,且的关系才会触发
1 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
2 重写时满足的文件大小
  • 触发方式
1. 自动触发:满足重写机制配置条件,就会自动后台执行重写,也就是压缩aof
2. 手动触发: 客户端向服务器发送 bgrewriteaof 命令
  • 重写原理
1.AOF 重写机制的原理是根据 Redis 进程内的数据生成一个新的 AOF 文件,只包含当前有效和存在的数据的写入命令,而不是历史上所有的写入命令 。
2.AOF 重写机制是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,并将每个键值对转换为相应的写入命令,然后写入到一个临时文件中 。
3.在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个缓冲区中,并通过管道通知子进程 。
4.子进程在完成 AOF 重写后,会将缓冲区中的写操作也追加到临时文件中,然后向主进程发送信号,通知主进程可以切换到新的 AOF 文件了 。
5.主进程在收到子进程的信号后,会将缓冲区中的写操作再次追加到临时文件中(以防止在此期间有新的写操作发生),然后用临时文件替换旧的 AOF 文件,并关闭旧的 AOF 文件 
  • 验证
文件大小调整为 1k 方便验证

反复多次设置k1

查看增量aof内容的的变化、aof文件名称以及大小的变化

可以清晰的看到重写之后的变化:

  1. base基础aof由0变成130、增量aof由384变成0、清单aof没有变化,整体大小进行了压缩
  2. 文件序号由1变成了
3.2.8 总结

更好的保护数据不丢失 、性能高、可做紧急恢复相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdbaof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

3.3 持久化方式3:混合模式RDB+AOF

3.3.1 混合模式介绍

我们首先看看官网对混合模式的介绍:

一般来说,如果你想要一个与PostgreSQL相媲美的数据安全程度,你应该使用这两种持久化方法。RDB镜像做全量持久化,AOF做增量持久化
结合了RDB和AOF的优点,既能快速加载又能避免丢失过多的数据

3.3.2 开启混合方式设置
设置aof-use-rdb-preamble的值为 yes   yes表示开启,设置为no表示禁用

先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。
简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式(AOF包括了RDB头部+AOF混写)

3.3.3 数据的加载流程

在同时开启rdb 和aof 持久化时,重启时只会加载 aof 文件,不会加载 rdb 文件,rdb做为一个万一的策略

3.4 纯缓存模式

同时关闭RDB+AOF

  • 禁用RDB(save "")
    禁用RDB持久化模式下,我们仍然可以使用命令save、bgsave生成rdb文件
  • 禁用AOF(appendonly no)
    禁用AOF持久化模式下,我们仍然可以使用命令bgrewriteaof生成aof文件

4. 参考和感谢

尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天一个Linux命令 -- (7)more命令

欢迎阅读《每天一个Linux命令》系列!在本篇文章中,将介绍Linux系统下的more命令,它用于逐屏显示文件的内容。 概念 more命令是Linux系统下的文件逐屏显示命令,用于逐屏显示文件的内容。 命令操作 more命令的语法如下&#xff1…

ubuntu22.04 安装cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU(图形处理单元)进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展,使得开发…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

2004-2021年上市公司环境规制强度相关数据

2004-2021年上市公司环境规制强度相关数据 1、时间:2004-2021年 2、指标:年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、所属省份-工业增加值_亿元、所属省份-治理废气…

Flink流批一体计算(24):Flink SQL之mysql维表实时关联

目录 1.维表 2.数据准备 创建源数据 创建维度表 创建Sink表 3.配置任务 Flink SQL创建kafka源表 Flink SQL创建MySQL维表 Flink SQL创建MySQL结果表 编写计算任务 核验数据 1.维表 目前在实时计算的场景中,大多数都使用过MySQL、Hbase、redis作为维表引擎…

PTA:计算总分

题干 请编写一个函数sum,函数的功能是:计算一个由结构体表示的包含多门课程成绩组成的学生的总成绩。 函数接口定义: double sumScore(struct student stu); 其中 stu是用户传入的参数。函数须返回学生的总成绩。 裁判测试程序样例&#x…

【华为数据之道学习笔记】3-7 报告数据治理

报告数据是指对数据进行处理加工后,用作业务决策依据的数据。它用于支持报告和报表的生成。 用于报告和报表的数据可以分为如下几种。 用于报表项数据生成的事实表、指标数据、维度。 用于报表项统计和计算的统计函数、趋势函数及报告规则。 用于报表和报告展示的…

AVFormatContext编解码层:理论与实战

文章目录 前言一、FFmpeg 解码流程二、FFmpeg 转码流程三、编解码 API 详解1、解码 API 使用详解2、编码 API 使用详解 四、编码案例实战1、示例源码2、运行结果 五、解码案例实战1、示例源码2、运行结果 前言 AVFormatContext 是一个贯穿始终的数据结构,很多函数都…

前后端分离项目跨域请求

一、前端vue项目 在项目中创建request.js文件,添加以下内容 import axios from "axios"; const api axios.create({ //这里配置的是后端服务提供的接口baseURL: "http://localhost:8080/web-demo",timeout: 1000} ); export default api; …

基于HSV空间色彩的图像分割方法(含python代码实现)

文章目录 1. 介绍2. HSV颜色空间3. python实现HSV图像分割3.1. 代码实现3.2. 运行结果 1. 介绍 HSV颜色系统简介: HSV 即使用色相(Hue)、饱和度(Saturation)、明度(Value)来表示色彩的一种方式…

HttpComponents: 领域对象的设计

1. HTTP协议 1.1 HTTP请求 HTTP请求由请求头、请求体两部分组成,请求头又分为请求行(request line)和普通的请求头组成。通过浏览器的开发者工具,我们能查看请求和响应的详情。 下面是一个HTTP请求发送的完整内容。 POST https://track.abc.com/v4/tr…

根据对数器找规律、根据数据量猜题目解法

题目一 小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1)能装下6个苹果的袋子2)能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须…

python门户网站文件爬取并显示

广西南宁政府门面网站 import requests import os import io import numpy as np from concurrent.futures import ThreadPoolExecutor from bs4 import BeautifulSoup import time import pdfplumber import pandas as pd from docx import Document import docx import win32…

WordCount 源码解析 Mapper,Reducer,Driver

创建包 com.nefu.mapreduce.wordcount ,开始编写 Mapper , Reducer , Driver 用户编写的程序分成三个部分: Mapper 、 Reducer 和 Driver 。 ( 1 ) Mapper 阶段 ➢ 用户自定义的 Mapper 要继承自己的父…

文件服务器搭建

文件服务器搭建 文件服务器有四个选择: httpd(apache) 稳定,使用广泛,服务器一般自带,对于开发人员来说强烈推荐。 nginx 稳定高效,使用广泛,linux命令可直接下载,对…

STM32CubeIDE串口空闲中断实现不定长数据接收

STM32F051空闲中断实现串口不定长数据接收 目的编程软件配置串口开中断中断程序运行结果目的 在串口输入不定长数据时,通过串口空闲中断来断帧接收数据。 编程软件 STM32CubeIDE STM32CubeMX配置MCU。通过对端口配置,自动生成程序,减少编程量。 配置串口开中断 配置串口…

redis中序列化问题,value包含全路径类名解析

1. 问题 redis中保存的key-value格式 value直接存入的是实体对象,值中包含全路径类名,在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer解析器时报错 报错内容: com.fasterxml.jackson.databind.exc.InvalidTypeI…

《师兄啊师兄》第二季确认定档!海神扬名,稳健回归!

近日,《师兄啊师兄》第二季的定档海报和PV终于发布,确认将于12月14日上午10点强势回归!这部备受瞩目的国漫作品自第一季播出以来,便以其独特的剧情设定和唯美的画风,赢得了广大观众的喜爱。如今,动画第二季…

第一课【习题】给应用添加通知和提醒

构造进度条模板通知,name字段当前需要固定配置为downloadTemplate。 给通知设置分发时间,需要设置showDeliveryTime为false。 OpenHarmony提供后台代理提醒功能,在应用退居后台或退出后,计时和提醒通知功能被系统后台代理接管…