Redis7——基础篇(三)

 前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。

基础篇:

  1. Redis(一)
  2. Redis(二)

接上期内容:上期完成了Redis的基本命令学习。下面开始学习Redis的持久化,话不多说,直接发车。

一、持久化定义

1、什么是持久化?

持久化,简单来说,就是将数据从易失性存储(如内存)保存到非易失性存储(如硬盘)的过程。在计算机系统中,内存虽然读写速度极快,但一旦断电,数据就会丢失。而硬盘等非易失性存储设备可以长期保存数据,即使在系统断电后,数据依然存在,除非硬盘损坏。


2、redis为什么要持久化?

Redis作为一款高性能的内存数据库,数据默认存储在内存中。这使得它在处理读写操作时能够达到极高的速度,但也带来了一个问题:一旦 Redis 服务器重启或者发生故障,内存中的数据就会全部丢失。为了避免这种情况,Redis 需要持久化机制,将内存中的数据保存到硬盘上,以便在需要时能够快速恢复数据,保证数据的完整性和可用性。


二、持久化方式

1、RDB(Redis Database)

1、定义

RDB是Redis默认的持久化方式。它会在指定的时间间隔内,对当前内存中的数据进行快照,生成一个二进制文件(dump.rdb)。实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使服务器故障宕机,快照文件也不会丢失,数据的可靠性得到了保证。


2、实操

2.1、自动触发
1、修改配置
save <seconds> <changes> [<seconds> <changes> ...]

 用vim 打开/myredis/redis.conf文件

本次案例修改为5秒2次


2、修改保存路径

同样用vim 打开/myredis/redis.conf文件,修改备份文件存储路径为/myredis/dumpfiles,记得新建目录文件夹。后续在redis客户端通过config get dir命令来查看保存路径。


3、修改保存文件名

同样用vim 打开/myredis/redis.conf文件,改为端口号加文件名,方便后续查看日志。


4、触发备份
  • 5秒内连续2次修,会触发备份。

  • 设置第三个key后,停留超过5秒,依旧触发备份。


5、恢复备份
  • 先拷贝一份完整的rdb文件。原因是:执行FLUSHDBFLUSHALL 命令也会产生rdb文件

  • 执行FLUSHDB清空redis,并关机。

  • 重启redis服务,验证数据是否成功恢复。

没有数据的原因是:FLUSHDB命令执行成功后,因为save 5 2的规则存在,会触发RDB备份,本来之前的数据都已经成功清除了,所以RDB备份了空数据。

  • 删除原有的rdb文件,使用备份的rdb进行数据恢复。(数据恢复成功


2.2、手动触发

Redis提供了两个命令来生成RDB文件分别是savebgsave


1、save

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


2、bgsave

Redis会在后台异步进行快照操作(不阻塞),同时还可以响应客户端请求。该触发方式会fork一个子进程由子进程复制持久化过程。

LASTSAVE命令可以查看上一次备份时间(返回的是时间戳)。


3、优劣势对比

  • 优势
  1. 文件紧凑:RDB文件是一个紧凑的二进制文件,占用磁盘空间较小,方便进行数据备份和恢复。在恢复数据时,直接将 RDB文件读入内存即可,速度相对较快
  2. 性能影响小:RDB在进行快照时,是通过fork子进程来完成的,主进程不需要进行任何磁盘 I/O 操作,因此对Redis的性能影响较小,非常适合大规模数据的恢复
  • 劣势
  1. 数据丢失风险:由于 RDB是按照一定的时间间隔进行快照的,如果在两次快照之间发生故障,那么这期间的数据将会丢失,数据丢失风险大。例如,设置每 5 分钟进行一次 RDB 快照,若在第 3 分钟时发生故障,那么从上次快照到第 3 分钟之间的数据都将丢失。
  2. fork子进程开销:在进行快照时,fork子进程会消耗一定的内存和 CPU 资源,特别是在数据量较大时,可能会导致 Redis 服务器短暂的卡顿。

4、其他说明

1、修复RDB文件


2、禁用RDB备份数据

两种方式都没法禁用save和bgsave命令进行手动备份


方式一:动态禁用
redis-cli config save ""

这样设置后,save规则失效不会进行RDB备份,redis服务重启后恢复


方式二:修改配置文件,将save ""注释打开,重启服务。


5、RDB其他配置项说明

  • stop-writes-on-bgsave-error:默认yes,如果配置成no,表示不在乎数据不一致,那么在快照写入失败时,能确保redis继续接收新的写请求。
  • rdbcompression:默认yes,对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
  • rdbchecksum:默认yes,在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
  • rdb-del-sync-files:默认no,用于控制在没有持久化功能开启的情况下,是否同步删除在主从复制过程中使用的RDB文件。

6、小总结


2、AOF(Append Only File)

1、定义

AOF是另一种持久化方式,它以日志的形式记录Redis服务器所执行的每一个写操作。当Redis服务器启动时,会读取AOF文件并重新执行其中的写操作,从而恢复数据到最新状态。


2、工作流程

Client作为命令的来源,会有多个源头以及源源不断的请求命令。
在这些命令到达Redis Server 以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
AOF缓冲会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件。
随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
当Redis Server 服务器重启的时候会从AOF文件载入数据。

3、AOF回写策略

3.1、Always

同步写回,每个写命令执行完立刻同步地将日志写回磁盘。


3.2、everysec

redis默认的回写策略,每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入磁盘。


3.3、no

操作系统控制的写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。


3.4、三种回写策略总结
配置项写回时机优点缺点
Always同步写回可靠性高,数据基本不丢失每个写命令都要落盘,性能影响较大
Everysec每秒写回性能适中宕机时丢失1秒内的数据
NO操作系统控制的写回性能好宕机时丢失数据较多

4、实操

4.1、正常恢复
1、修改配置文件

开启AOF

修改aof文件存储名字和路径(提前创建好目录)

重启redis服务

base.rdb:表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。

incer.aof:表示增量AOF,它通常用于记录 Redis 执行的所有写操作命令。

manifest:一个文件清单,该文件用于记录 AOF 重写过程中各个文件的元信息,包括 base.rdb 文件和 incr.aof 文件的相关信息,如文件名、文件大小、生成时间等。Redis 可以通过读取这个清单文件,了解各个文件的状态和顺序,从而正确地进行数据恢复操作。


2、修复数据

先拷贝一份完整的aof文件。原因是:执行FLUSHDBFLUSHALL的命令也会写入aof中,会导致恢复的数据为空。

清空并关闭redis服务

修改aof文件名,重启redis服务,恢复数据成功


4.2、异常恢复

模拟redis在进行AOF备份时,redis宕机,导致AOF文件写入命令不完整场景。

1、修改aof文件

使用vim 打开/myredis/appendonlyfiles/appendonly6379.aof.1.incr.aof文件,随便输入。


2、重启reids服务,(无法成功启动)。

原因:是因为redis无法通过aof文件进行数据恢复,导致redis启动失败。


3、修复aof文件

拷贝aof文件到 /usr/local/bin目录下,使用 

redis-check-aof --fix  xxxx.aof

修复文件。 

在将修复的文件放回原始目录,重启redis服务。

恢复成功。


5、AOF重写机制

5.1、是什么

随着 Redis服务的持续运行,不断有新的写命令被追加到 AOF 文件中,这会导致 AOF 文件变得越来越大。过大的 AOF 文件不仅会占用大量的磁盘空间,还会在 Redis 重启恢复数据时,因为需要执行大量的命令而导致恢复时间变长。

为解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的峰值时,Redis就会自动启动AOF文件压缩,只保留可以恢复数据的最小指令集


5.2、实操
1、自动触发

官方默认配置。触发条件:同时满足,且的关系才会触发。

  • 根据上次重写后的aof大小判断当前aof大小是否增长了1倍
  • 重写时是否满足的文件设置的大小

修改配置为1kb

关闭rdb和aof的混合模式

删除以前的rdb和aof文件,重启redis服务

不停设置key,修改key,使得aof文件达到重写的条件

查看.2.incr.aof文件

压缩后aof文件里面就只剩下了最小指令集,aof文件的大小也变小了。


2、手动触发
BGREWRITEAOF

3、总结

也就是说AOF文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的AOF文件。


5.3、重写原理

1、在重写开始前,redis会创建一个“重写子进程”,这个子进程会读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。

2、与此同时,主进程会将新接收到的写指令一边积累到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。

3、当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新的AOF文件中。

4、当追加结束后,redis就会用新的AOF文件代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中。

5、重新AOF文件的操作,并没有读取旧AOF文件,而是将整个内存中的数据内容用命令的方式重写了一个新AOF文件,这点和快照有点类似。


6、小总结


三、AOF+RDB混合模式

1、AOF vs RDB可否共存

答:可以共存。如共存优先加载AOF文件。


2、AOF和RDB共存时加载数据流程


3、推荐方式

推荐:AOF+RDB混合方式,结合了RDB和AOF的优点,既能快速加载又能避免丢失过多的数据。

1、开启方式

设置aof-use-rdb-preamble的值为yes,yes表示开启,no表示禁用。

开启后,Redis 在进行 AOF 重写时,会将 AOF 文件的开头部分替换为 RDB 格式的数据快照,后续再以常规的 AOF 格式记录重写之后的写操作。

2、结论

RDB镜像做全量持久化,AOF做增量持久化。

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


四、纯缓存模式

同时禁用AOF + RDB

1、禁用RDB

配置文件开启 save "",去掉注释。但是仍可以通过命令bgsave和save进行RDB备份


2、禁用AOF

配置文件设置appendonly no。但是仍可以通过命令BGREWRITEAOF生成AOF文件。


五、总结

RDB 和 AOF 持久化方式各有优劣,混合模式则在一定程度上弥补了两者的不足。而纯缓存模式则适用于对数据可靠性要求不高,但对性能要求极高的场景。在实际应用中,我们需要根据具体的业务需求和场景,合理选择 Redis的持久化方式和应用模式,以充分发挥 Redis 的优势,提升系统的性能和稳定性。


ps:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。

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

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

相关文章

[LeetCode]day25 151.翻转字符串里的单词

题目链接 题目链接 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

Visual Studio Code的下载安装与汉化

1.下载安装 Visual Studio Code的下载安装十分简单&#xff0c;在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型&#xff08;14B、32B&#xff09;全过程与测试结果。 NPU&#xff1a;910B3 (65GB) * 8 &#xff08;910B 有三个版本 910B1、2、3&#xff09; 模型&#xff1a;DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法 A Solution to Solve Error - mysql: command not found After The Installation of MySQL Community Server By JacksonML 本文简要介绍如何在macOS安装完毕MySQL数据库服务器后&#xff0c;针对无…

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言&#xff08;官网是&#xff1a;https://open.bigmodel.cn&#xff09;的案例&#xff0c;回答响应流式输出显示&#xff0c;这里使用的是免费模型&#xff0c;需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…

STM32 HAL库 UART串口发送数据实验

一、实验目标 通过STM32的UART串口发送字符串数据到PC端串口调试助手&#xff0c;验证通信功能。 二、硬件准备 主控芯片&#xff1a;STM32F103C8T6。 串口模块&#xff1a;USB转TTL模块。 接线说明&#xff1a; STM32的USART1_TX&#xff08;PA9&#xff09; → USB-TTL模…

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…

平板作为电脑拓展屏

有线串流&#xff08;速度更快&#xff09; spacedesk 打开usb对安卓的连接 用usb线直接连接电脑和平板 无线串流&#xff08;延迟高&#xff0c;不推荐&#xff09; todesk pc和手机端同时下载软件&#xff0c;连接后可以进行远程控制或扩展屏幕 spacedesk 连接到同一个…

深度学习05 ResNet残差网络

目录 传统卷积神经网络存在的问题 如何解决 批量归一化BatchNormalization, BN 残差连接方式 ​残差结构 ResNet网络 ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获当年ImageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得CO…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…

千峰React:脚手架准备+JSX基础

组件化->封装性 React提供函数组件实现组件化 React和传统JS的区别就是JS需要手动管理DOM操作&#xff0c;React: 采用组件化开发&#xff0c;通过虚拟DOM提升性能。 MVC 是一种软件设计模式&#xff0c;全称为 Model-View-Controller&#xff08;模型-视图-控制器&#x…

springmvc(13/158)

太感动了&#xff0c;搞了半天以为是 这个dispatcherservlet报错的问题&#xff0c;结果是我第一次改springmvc-servlet.xml里面的后缀出了问题。 <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.D…

节目选择器安卓软件编写(针对老年人)

文章目录 需求来源软件界面演示效果源码获取 对爬虫、逆向感兴趣的同学可以查看文章&#xff0c;一对一小班教学&#xff1a;https://blog.csdn.net/weixin_35770067/article/details/142514698 需求来源 由于现在的视频软件过于复杂&#xff0c;某客户想开发一个针对老年人、…

图解循环神经网络(RNN)

目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同&#xff0c…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…