Redis7——基础篇(三)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。
基础篇:
- Redis(一)
- 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文件。原因是:执行FLUSHDB 或 FLUSHALL 命令也会产生rdb文件。

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

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

没有数据的原因是:FLUSHDB命令执行成功后,因为save 5 2的规则存在,会触发RDB备份,本来之前的数据都已经成功清除了,所以RDB备份了空数据。
- 删除原有的rdb文件,使用备份的rdb进行数据恢复。(数据恢复成功)


2.2、手动触发
Redis提供了两个命令来生成RDB文件分别是save和bgsave。
1、save
在主程序中执行会阻塞当前redis服务器,直到持久化工作完成。执行save命令期间,Redis不能处理其他命令,线上禁止使用。


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


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


3、优劣势对比
- 优势
- 文件紧凑:RDB文件是一个紧凑的二进制文件,占用磁盘空间较小,方便进行数据备份和恢复。在恢复数据时,直接将 RDB文件读入内存即可,速度相对较快。
- 性能影响小:RDB在进行快照时,是通过fork子进程来完成的,主进程不需要进行任何磁盘 I/O 操作,因此对Redis的性能影响较小,非常适合大规模数据的恢复。
- 劣势
- 数据丢失风险:由于 RDB是按照一定的时间间隔进行快照的,如果在两次快照之间发生故障,那么这期间的数据将会丢失,数据丢失风险大。例如,设置每 5 分钟进行一次 RDB 快照,若在第 3 分钟时发生故障,那么从上次快照到第 3 分钟之间的数据都将丢失。
- 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文件。原因是:执行FLUSHDB 或 FLUSHALL的命令也会写入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:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。
相关文章:
Redis7——基础篇(三)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二) 接上期内容:上期完成了Redis的基本…...
ES12 weakRefs的用法和使用场景
ES12 (ECMAScript 2021) 特性总结:WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一个新特性,用于创建对对象的弱引用。弱引用不会阻止垃圾回收器回收对象,即使该对象仍然被弱引用持有。WeakRef 通常与 FinalizationRegistry 结合使…...
【Elasticsearch】搜索时分片路由
Elasticsearch 的Search Shard Routing(搜索分片路由)是一个核心机制,用于在分布式环境中高效地分发和执行搜索请求,确保查询能够快速、准确地返回结果,同时充分利用集群资源并保持系统的高可用性。以下是结合上述内容…...
MySQL登录问题总结
不管何种数据库,使用的第一步都是先登录。 MySQL命令行登录语句:mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈,常见报错原因分析如下,实例中的以test用户为例,登录环境为…...
一些耳朵起茧子的名词解释
1 web应用 1.1 web应用的概念 Web应用(Web Application) 是一种通过浏览器访问的软件程序,它运行在服务器上,用户通过网络(如互联网或内网)与它进行交互。与传统网站(主要提供静态内容&#x…...
Redis 持久化:从零到掌握
Redis 作为一款广泛使用的内存数据库,虽然核心功能是基于内存提供高性能的数据存取,但在实际应用中,数据的持久化是不可忽视的。毕竟,内存中的数据一旦出现故障或重启,就会面临数据丢失的风险。因此,Redis …...
Mybatis MyBatis框架的缓存 一级缓存
1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…...
第1章大型互联网公司的基础架构——1.6 RPC服务
你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务,两者的定位不一样。一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务;而HTTP服…...
多个用户如何共用一根网线传输数据
前置知识 一、电信号 网线(如以太网线)中传输的信号主要是 电信号,它携带着数字信息。这些信号用于在计算机和其他网络设备之间传输数据。下面是一些关于网线传输信号的详细信息: 1. 电信号传输 在以太网中,数据是…...
idea-gradle打包运行配置
最近接触了一个项目,使用gradle做为构建工具,这里记录一波,毕竟平时使用的都是maven idea 配置 这里有个坑,Gradle Wrapper,配置的地址gradle下载超时 这个配置修改成阿里的 第一张 第二张 第二张配置的jvm貌似没啥用…...
(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)
物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意:ESP-01sWIFI模块,去搜了一下这个小东西很有玩点,远程控制LED啥的,然后我就想…...
一键部署开源DeepSeek并集成到钉钉
一键部署开源DeepSeek并集成到钉钉 简介: DeepSeek发布了两款先进AI模型V3和R1,分别适用于对话AI、内容生成及推理任务。由于官方API流量限制,阿里云推出了私有化部署方案,无需编写代码即可完成部署,并通过计算巢AppF…...
【爬虫基础】第一部分 网络通讯 P1/3
前言 1.知识点碎片化:每个网站实现的技术相似但是有区别,要求我们根据不同的网站使用不同的应对手段。主要是常用的一些网站爬取技术。 2.学习难度:入门比web简单,但后期难度要比web难,在于爬虫工程师与网站开发及运维…...
ES10中Object.fromEntries(),trimStart() ,trimend()的使用方法和使用场景例子
ES10(ECMAScript 2019)新特性总结 ES10(ECMAScript 2019)引入了一些新的方法,增强了 JavaScript 的灵活性和易用性。以下是 Object.fromEntries(),trimStart() 和 trimEnd() 的使用方法、使用场景以及例子…...
车载音频配置(二)
目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…...
级联选择器多选动态加载
一.级联展示 注:因为级联选择器这里是动态加载,因此如果上来选中一级就需要加载出后面三级的全部数据,依然会很卡,因此,和产品协商把一二级多选框去掉了,这样也避免了你选择一级不能实现子级被全部选中的问…...
华为动态路由-OSPF-骨干区
华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议(IGP),用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组(IETF)定义的标准之一,被广…...
网络安全治理模型
0x02 知识点 安全的目标是提供 可用性 Avialability机密性 confidentiality完整性 Integrity真实性 Authenticity不可否认性 Nonrepudiation 安全治理是一个提供监督、问责和合规性的框架 信息安全系统 Information Security Management System ISMS 策略,工作程…...
企业软件合规性管理:构建高效、安全的软件资产生态
引言 在数字化转型的浪潮下,企业的软件使用方式日益多元化,涉及云端、订阅制、永久授权及浮动许可等多种模式。然而,随着软件资产的增多,企业面临着合规性管理的严峻挑战:非法软件使用、许可证管理不当、软件资产闲置…...
spring微服务+dubbo框架,某一服务启动时提示多个bean存在
在java的springboot项目中使用DubboService的注解的实现类中,在引用本模块的类时,使用的DubboRefrence注解,在启动项目时报错,提示该类需要以一个bean对象,但是存在了两个,把DubboRefrence的注解改成Autowi…...
跟着 Lua 5.1 官方参考文档学习 Lua (3)
文章目录 2.5 – Expressions2.5.1 – Arithmetic Operators2.5.2 – Relational Operators2.5.3 – Logical Operators2.5.4 – Concatenation2.5.5 – The Length Operator2.5.6 – Precedence2.5.7 – Table Constructors2.5.8 – Function Calls2.5.9 – Function Definiti…...
PyTorch 源码学习:阅读经验 代码结构
分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同,所以笔者在整理资料时尽可能按版本号升序,版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...
力扣-二叉树-501 二叉搜索树的众数
思路 二叉搜索树的特性就是中序遍历有序,所以思考时可以先按照有序数组思考 代码 class Solution { public:vector<int> result;TreeNode* pre nullptr;int count 1;int maxCount 0;void travesl(TreeNode* node){if(node nullptr) return;travesl(nod…...
vscode复制到下一行
linux中默认快捷键是ctrl shift alt down/up 但是在vscode中无法使用,应该是被其他的东西绑定了,经测试,可以使用windows下的快捷键shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…...
vscode将文件中行尾默认CRLF改为LF
安装prettier npm install --save-dev --save-exact prettier执行命令 npx prettier --write --end-of-line lf .即可将项目中的所有文件行尾序列格式改为lf *在你使用git拉取代码的时候,git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...
Windows 环境下配置多个不同版本的 Maven
在实际开发中,不同的项目可能需要使用不同版本的 Maven。例如,老项目可能依赖于 Maven 3.3,而新项目可能需要 Maven 3.8+ 才能正常运行。因此,在 Windows 下配置多个 Maven 版本并能方便地切换是非常必要的 1. 下载并安装多个 Maven 版本 1.1 下载 Maven 访问 Apache Mav…...
网络运维学习笔记 013网工初级(HCIA-Datacom与CCNA-EI)DHCP动态主机配置协议(此处没讲思科)
文章目录 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)网关配置DHCP服务器配置如果没有DHCP服务器,只在网关上做DHCP服务器: DHCP(Dynamic Host Configuration Protocol,动态主…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析④】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase04 作者:车端域控测试工程师 更新日期:2025年02月17日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-004测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
llama.cpp将sensor格式的大模型转化为gguf格式
前言 ollama本地只能导入gguf格式的大模型文件,将safetensors 文件转化为gguf格式。需要使用 llama.cpp 这个开源工具。以下是使用 llama.cpp 转换 .safetensors 格式模型到 .gguf 格式的详细步骤: 1. 首先克隆并编译 llama.cpp: 克隆项目 git clone https://gi…...
Fastgpt学习(5)- FastGPT 私有化部署问题解决
1.☺ 问题描述: Windows系统,本地私有化部署,postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions ",“ DETAIL: Permissions should be urwx (0700) or urwx,gr…...
