【Redis】redis持久化

redis 持久化

所谓的持久化,就是把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。 redis 开始是将所有数据保持在内存中,对数据的更新将根据策略配置异步地保存在磁盘中。

持久化的方式

快照方式

快照是某时某刻对数据的完整备份。在以下数据持久化时被使用:

  • MySQL Dump
  • Redis RDB

日志

数据库做任何操作的更新就将它记录在日志中,当某时刻需要将数据恢复的时候,只需要将日志中的操作重新执行一遍,便得到某时某点的完整数据。在以下数据持久化时被使用:

  • MySQL Binlog
  • Hbase HLog
  • Redis AOF

redis持久化方式

RDB

经过RDB之后,redis会将内存中的数据创建一份快照到硬盘中,称为RDB文件(二进制,直接查看是乱码)。当redis重新启动时,会加载硬盘中的RDB文件,加载到内存中完成数据恢复。
在这里插入图片描述

RDB 的触发方式 - 主要三种方式

  • save(同步–命令)
  • bgsave(异步–命令)
  • 自动(配置文件中设置)

save(同步)
执行流程如下:
在这里插入图片描述

  • 在 save 的同时,其他命令会阻塞等待
  • 如果存在老的 RDB 文件,会先创建一个临时文件,然后对老文件进行替换
  • 时间复杂度,O(n)

bgsave(异步)
执行流程如下:
在这里插入图片描述

  • 调用 bgsave 后,会调用 linux 的 fork() 函数,创建一个子进程
  • 如果存在老的 RDB 文件,会先创建一个临时文件,然后对老文件进行替换
  • 时间复杂度,O(n)
  • 子进程名称:redis-rdb-bgsave

自动方式

  • 内部相当于bgsave
  • Redis(6.2.6版本)默认的save配置如下表:
配置secondchanges
save36001
save300100
save6010000

满足以上任一条件,将创建(bgsave)RDB 文件(二进制)。比如 60秒内,有10000 条数据发生改变,将自动生成 RDB 文件。此方式的优点是生成的二进制文件是紧凑型的,可按需备份,而且通过RDB恢复数据的速度远远快于AOF。缺点是不好控制 RDB 文件的生成,如果写入量很大的话 RDB 生成太过频繁,频繁写入硬盘,对硬盘负担很大;无法实时持久化(bgsave每次都要fork建立子进程,属于重量级操作),且生成的文件是二进制文件,新旧版本可能存在不兼容的情况。

RDB 相关配置

配置项默认值含义
dbfilenamedump.rdbRDB快照文件名
dir./RDB快照文件生成所在目录
stop-writes-on-bgsave-erroryesbgsave时发生错误是否停止写入
rdbcompressionyesRDB文件是否采用压缩
rdbchecksumyes是否对RDB进行校验

RDB 最佳配置

  • 不配置自动RDB操作
  • dbfilename dump-${port}.rdb
  • dir /redisDataPath
  • stop-writes-on-bgsave-error yes
  • rdbcompression yes
  • rdbchecksum yes

触发机制

以下几种情况会触发生成快照:

  • 客户端执行命令save和bgsave时会生成快照
  • 根据配置文件save m n规则进行自动快照
  • 主从复制时从节点执行全量复制,master 节点会执行 bgsave并将RDB文件发给从节点
  • debug reload命令重新加载redis
  • 默认执行shutdown时,如果没有开启AOF,则自动执行bgsave
  • 客户端执行shutdown关闭redis时,触发快照

AOF

通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中。日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中。当redis服务器启动时候,执行硬盘中的日志文件以恢复redis中的数据。如果日志文件很大(数据量大),恢复速度可能比较慢。

AOF 运行原理 - 创建
在这里插入图片描述
AOF 运行原理 - 恢复
在这里插入图片描述

AOF 的三种刷新策略

策略含义
always执行每条写命令都会将写命令写到磁盘中
everysec每秒将数据从缓冲区刷到磁盘中,可能会丢失一秒的数据(redis 默认使用该策略)
no写命令何时刷新的磁盘中,由操作系统来决定

AOF 重写

注意这里的重写并不是说将 redis 命令重新抽象成新的 redis 命令,再写入 AOF 文件,而是执行 redis 命令后将内存中的数据进行回溯,重写成 AOF 文件。

  • 重写的作用:减少磁盘占用、加速AOF恢复速度
    例如一千次incr key 可以重写为 set key 1000
  • AOF 重写实现方式 - bgrewriteaof
    客户端发送出一条bgrewriteaof命令后,redis会fork一个子进程完成AOF重写操作逻辑。

AOP 重写实现方式 - AOF 重写配置

  • AOF配置项
配置默认值含义
auto-aof-rewrite-min-size64MBAOF文件重写需要的尺寸,AOF多大时开启重写
auto-aof-rewrite-percentage100AOF文件增长率(当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写)
  • AOF统计项
统计名含义
aof_current_sizeAOF当前尺寸(单位:字节)
aof_base_sizeAOF上次启动和重写的尺寸(单位:字节)
  • 自动触发时机
    • 当前 AOF 文件大小超过最小重写尺寸
    • 当前 AOF 文件大小超过上次重写完的 AOF 尺寸的百分之多少(auto-aof-rewrite-percentage)
aof_current_size > auto-aof-rewrite-min-size
(aof_current_size - aof_base_size) / aof_base_size > auto-aof-rewrite-percentage 

AOF 相关配置

配置项最佳取值含义
appendonlyyes开启AOF
appendfilenameaof-${port}.aofAOF文件名
appendfsync everysecAOF策略
dir/redisDataPathAOF文件所在目录
no-appendfsync-no-rewriteyes在执行重写时不进行AOF操作
auto-aof-rewrite-percentage100AOF重写配置(见上文)
auto-aof-rewrite-min-size64MBAOF重写配置(见上文)

AOF 重写原理

AOF 重写流程示意图如下:
在这里插入图片描述
说明:

  • bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。
  • 主进程fork出子进程执行重写操作,保证主进程不会阻塞。
  • 子进程遍历redis内存中数据到临时文件,客户端的写请求继续写入aof_buf 缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。
  • 子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。 主进程把aof_rewrite_buf中的数据写入到新的AOF文件。
  • 使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

RDB-AOF混合持久化

在redis4.0版本中,相对与之前的版本其中一个比较大的变化是4.0添加了新的混合持久化方式。所谓的混合持久化就是同时结合RDB持久化以及AOF持久化混合写入AOF文件。这样做的好处是可以结合 rdb 和 aof 的优点, 快速加载同时避免丢失过多的数据,缺点是 aof 里面的 rdb 部分就是压缩格式不再是 aof 格式,可读性差。

开启混合持久化

在6.0版本的redis中混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,默认是禁用的,可通过config set修改。

混合持久化过程

混合持久化同样也是通过bgrewriteaof完成的,不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件,然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据。

数据恢复

当我们开启了混合持久化时,启动redis依然优先加载aof文件,aof文件加载可能有两种情况如下:

  • aof文件开头是rdb的格式, 先加载 rdb内容再加载剩余的 aof。
  • aof文件开头不是rdb的格式,直接以aof格式加载整个文件。
127.0.0.1:6379> DBSIZE
(integer) 7
127.0.0.1:6379> CONFIG sET aof-use-rdb-preamble yes
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting starte

退出查看,或者另一个终端查看aof文件
在这里插入图片描述
也可以通过redis自带的检查命令去检查一下持久化文件是否正确。

[root@k8s-m2 redis]# ./src/redis-check-rdb dump.rdb 
[offset 0] Checking RDB file dump.rdb
[offset 26] AUX FIELD redis-ver = '6.2.6'
[offset 40] AUX FIELD redis-bits = '64'
[offset 52] AUX FIELD ctime = '1704348988'
[offset 67] AUX FIELD used-mem = '831144'
[offset 83] AUX FIELD aof-preamble = '0'
[offset 85] Selecting DB ID 0
[offset 107] Checksum OK
[offset 107] \o/ RDB looks OK! \o/
[info] 2 keys read
[info] 0 expires
[info] 0 already expired
[root@k8s-m2 redis]# ./src/redis-check-aof /appendonly.aof 
The AOF appears to start with an RDB preamble.
Checking the RDB preamble to start:
[offset 0] Checking RDB file /appendonly.aof
[offset 26] AUX FIELD redis-ver = '6.2.6'
[offset 40] AUX FIELD redis-bits = '64'
[offset 52] AUX FIELD ctime = '1709537259'
[offset 67] AUX FIELD used-mem = '872648'
[offset 83] AUX FIELD aof-preamble = '1'
[offset 85] Selecting DB ID 0
[offset 132] Checksum OK
[offset 132] \o/ RDB looks OK! \o/
[info] 7 keys read
[info] 0 expires
[info] 0 already expired
RDB preamble is OK, proceeding with AOF tail...
AOF analyzed: size=132, ok_up_to=132, ok_up_to_line=1, diff=0
AOF is valid

持久化方式对比

RDB

  • 优点:RDB 是一个非常紧凑(compact)的文件,体积小,因此在传输速度上比较快,因此适合灾难恢复。
    RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
    RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
  • 缺点:RDB是一个快照过程,无法完整的保存所以数据,尤其在数据量比较大时候,一旦出现故障丢失的数据将更多。
    当redis中数据集比较大时候,RDB由于RDB方式需要对数据进行完成拷贝并生成快照文件,fork的子进程会耗CPU,并且数据越大,RDB快照生成会越耗时。
    RDB文件是特定的格式,阅读性差,由于格式固定,可能存在不兼容情况。

AOF

  • 优点:数据更完整,秒级数据丢失(取决于设置fsync策略)。
    兼容性较高,由于是基于redis通讯协议而形成的命令追加方式,无论何种版本的redis都兼容,再者aof文件是明文的,可阅读性较好。
  • 缺点:数据文件体积较大,即使有重写机制,但是在相同的数据集情况下,AOF文件通常比RDB文件大。
    相对RDB方式,AOF速度慢于RDB,并且在数据量大时候,恢复速度AOF速度也是慢于RDB。
    由于频繁地将命令同步到文件中,AOF持久化对性能的影响相对RDB较大,但是对于我们来说是可以接受的。

混合持久化

  • 优点:
    混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。
  • 缺点:兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件(兼容性问题),同时由于前部分是RDB格式,阅读性较差。

更多关于redis的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

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

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

相关文章

3dmax画图卡顿解决方法---模大狮模型网

当你在使用3D Max进行画图时遇到卡顿问题,可以尝试以下方法来解决: 减少模型复杂度:如果你的场景中有过多的高细节模型,可能会导致卡顿。尝试减少模型的复杂度,合并或简化多边形数量过多的模型。这将减轻计算机的负担&…

【UE 材质 Niagara】爆炸效果

目录 效果 步骤 一、材质部分 二、Niagara部分 效果 步骤 一、材质部分 1. 创建一个材质,这里命名为“M_Burst” 打开“M_Burst”,设置混合模式为半透明,设置着色模型为无光照,勾选双面显示 在材质图表中首先创建扰动效果 其…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一,为什么需要智能指针 二,内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3,如何避免内存泄露 三,智能指针的使用与原理 1. RAII思想 2. 智能指针 (1. unique_ptr (2. shared_…

数据治理实战——翼支付金融板块业务数仓建设和数据治理之路

目录 一、数据治理背景 二、数据治理建设内容 2.1 组织协同 2.2 平台建设 2.3 数据应用治理 2.4 数据规范 2.5 数据安全 三、企业级数仓建设 3.1 调研阶段 2.2 平台护航 2.3 数仓分层 2.4 维度建模 2.4.1 维度建模四步曲 2.4.2 命名规范 2.4.3 资产沉淀 2.4.4 …

百度智能云发布专用向量数据库 VDB 1.0,全新设计内核开启性能狂飙

1 专用向量数据库应对未来业务挑战 向量数据库 向量检索 数据库 向量数据库大致可以分为 2 部分:向量数据的检索,以及向量数据的存储和管理。 向量数据库的性能,比如高 QPS、低延时等,使得业务能够更快的响应用户的查询请求…

2024 AI 辅助研发的新纪年

随着人工智能技术的持续发展与突破,2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计,从软件开发到材料科学,AI正逐渐渗透到研发的各个环节,变革着传统的研发模式。在这一背景下,AI辅助研发不仅…

【kubernetes】关于k8s集群中的ingress规则案例

目录 一、k8s 对外服务之 Ingress 1.1什么是ingress 1.2外部的应用能够访问集群内的服务有哪些方案? 1.3Ingress 组成 1.4Ingress-Nginx 工作原理 1.5ingress 暴露服务的方式 二、实操ingress暴露服务 前期.部署 nginx-ingress-controller 2.1基于host网络…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程(http://t.csdnimg.cn/5CYfC),当时使用的是Docker将RabbitMQ安装到虚拟机上,但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

flink重温笔记(十二): flink 高级特性和新特性(1)——End-to-End Exactly-Once(端到端精确一致性语义)

Flink学习笔记 前言:今天是学习 flink 的第 12 天啦!学习了 flink 高级特性和新特性之 End-to-End Exactly-Once(端到端精确一致性语义),主要是解决大数据领域数据从数据源到数据落点的一致性,不会容易造成…

官宣!百度智能云千帆产品发布会3月21日北京见!

回望2023大模型狂奔的一年,百度智能云千帆大模型平台无疑是浓墨重彩的一笔。自2023年3月27日正式问世后,百度智能云千帆大模型平台以突飞猛进的速度持续发展。从模型、应用到生态,“千帆”书写着自身在大模型时代的答卷。 作为全球首个一站式…

指针的学习5

目录 sizeof和strlen的区别 sizeof strlen 数组和指针笔试题解析 一维数组 字符数组 二维数组 指针运算笔试题解析 题目1: 题目2: 题目3: 题目4: 题目5: 题目6: 题目7: sizeof和…

Jmeter二次开发实现rsa加密

jmeter函数助手提供了大量的函数,像 counter、digest、random、split、strLen,这些函数在接口测试、性能测试中大量被使用,但是大家在实际工作,形形色色的测试需求不同,导致jmeter自带或者扩展插件给我们提供的函数无法…

Redis中的SCAN渐进式扫描底层原理

Scan渐进式扫描原理 概述 由于Redis是单线程再处理用户的命令,而Keys命令会一次性遍历所有key,于是在命令执行过程中,无法执行其他命令。这就导致如果Redis中的key比较多,那么Keys命令执行时间就会比较长,从而阻塞Re…

即插即用篇 | YOLOv8 引入 ParNetAttention 注意力机制 | 《NON-DEEP NETWORKS》

论文名称:《NON-DEEP NETWORKS》 论文地址:https://arxiv.org/pdf/2110.07641.pdf 代码地址:https://github.com/imankgoyal/NonDeepNetworks 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yaml

程序员常用的几种算法

程序员常用的几种算法 一、程序员算法汇总二、程序员常用的几种算法1.选择排序算法1.1 选择排序算法解析:1.2 示例代码: 2.插入排序算法2.1 插入排序算法解析:2.2 示例代码: 3.冒泡排序算法3.1 冒泡排序算法解析:3.2 示…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、Py…

微服务架构 | 多级缓存

INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…

(未解决)macOS matplotlib 中文是方框

reference: Mac OS系统下实现python matplotlib包绘图显示中文(亲测有效)_mac plt 中文值-CSDN博客 module ‘matplotlib.font_manager‘ has no attribute ‘_rebuild‘解决方法_font_manager未解析-CSDN博客 # 问题描述(笑死 显而易见 # solve 找到…

【Linux】 yum —— Linux 的软件包管理器

Linux 的软件包管理器 yum yum 是什么什么是软件包查看软件包 yum 命令行工具yum 配置文件yum 凭什么可以支持下载呢?yum 生态yum 社区yum 的故障排除和资源支持yum 的持续集成和持续交付 yum 是什么 Yum(Yellowdog Updater Modified)是一个…

【PCIe】TLP结构与配置空间

🔥博客主页:PannLZ 文章目录 PCIe TLP结构PCIe配置空间和地址空间 PCIe TLP结构 TLP 主要由3个部分组成: Header 、 数据(可选,取决于具体的TLP 类 型 ) 和 ECRC (End to End CRC, 可选)。TLP 都始于发送端的事务层,终…