当前位置: 首页 > news >正文

一篇解决Redis:持久化机制

目录

认识持久化

持久化方案

RDB(Redis DataBase)

手动触发

自动触发

小结

AOF(Append-Only File)

AOF缓冲区刷新机制

AOF重写机制

AOF重写流程

​编辑

混合持久化


认识持久化

我们都知道Mysql有四大特征,原子性,持久性,隔离性,一致性。其中持久性就是因为mysql会把数据存到硬盘中,即使计算机掉电数据也不会丢失。如果把数据存储到内存中,那么就是不持久的了。而我们的redis刚好就是这样,所以要想让redis持久化,就要想办法把redis的数据存储到硬盘上。

但是redis的一个很重要的特点就是效率高,而效率高又离不开将数据存储到内存,所以该怎么办呢?答案就是‘我全都要’,将数据同时存储在内存和硬盘中,当重新打开机器后只需要从硬盘中把数据读取到内存即可,这样既保证了效率右让redis可以持久化储存数据,不过这样的方法必然会付出更大的硬盘资源。 

持久化方案

redis提供的持久化方式主要有两种RDB和AOF

RDB(定期备份):redis会定期将内存里的所有数据都写入硬盘中,并生成一个快照。

AOF:redis会将每个写操作记录下来当重启后会将这些操作自动再执行一遍

RDB(Redis DataBase)

 redis会定期将内存里的所有数据都写入硬盘中,并生成一个快照。这个快照就类似于一张照片,将这一时刻的数据和状态以文件的形式写到硬盘上

这个定期又分为两种方式手动触发和自动触发

手动触发

程序员通过特定的命令来手动触发快照

  • save:当redis执行save操作时,就会全力以赴的进行快照生成,也就会阻塞其他redis的客户端命令,就可能会使redis直接阻塞(一般不建议使用)
  • bgsave(background save):这个操作的效果和save一样,但是不会阻塞其他命令,因为此处redis采取了多进程的方式,会单独生成一个子进程来完成快照生成的操作,而父进程则继续处理客户端的请求

bgsave的执行过程

  1. 首先判定当前是否还存在其他的子进程,如果已经在执行一个bgsave命令的话,这个bgsave就会直接返回,保证只有一个子进程
  2. 如果没有其他子进程,就会通过fork操作创建出一个子进程来
  3. 子进程复制写文件,生成快照的过程,而父进程则是继续接受客户端请求
  4. 最后zjc完成持久化后,会通知父进程,父进程更新一些统计信息后,子进程就可以销毁了

//fork是linux提供的创建子进程的api,如果在其他系统上则行不通,fork会直接将父进程克隆一份,包括pcd,内存中的数据,文件描述符表等等,所以克隆出来的子进程就和父进程是完全一样的,此时就可以让父进程继续处理客户端请求,让子进程去进行持久化操作,因为内存数据完全一样,所以将子进程持久化就相当于持久化了父进程。而克隆完后的两个进程是互相独立,互不干扰的。

但是你会不会有疑问,完全拷贝下来如果有100G的内存那么开销岂不是很大?实际上,redis这里并不是直接无脑的拷贝,而是利用’写时拷贝‘,也就是如果子进程和父进程的内存数据完全一样,那么这两个进程共用一份内存,也就是不会触发真正的拷贝操作,只是在效果上像是两份,当有一方对内存数据进行了修改才会触发真正的拷贝操作,比如当fork拷贝进程时父进程来了一条指令对数据进行了修改,那么就会将数据拷贝到子进程。

举个例子假如父进程有一个int i = 1;那么子进程并不会拷贝而是和父进程共用这个数据的内存地址,如果在拷贝的过程中父进程发生了修改变成了int i = 2;那么fork就会触发真正的拷贝,将原来的int i = 1复制到一个新的内存空间,而原来的则被修改为int i = 2。(一般整个持久化过程很快,父进程不会有很多数据发生改变)

这样既不会有很大的开销,也让这两个进程可以互相独立。

当子进程写入数据时会把数据写入redis的工作目录里的dump.rdb文件,这个文件是rdb机制生成的镜像文件,而且只一个二进制的文件无法用一般的文本编辑器查看,当写入完成后就会把新的rdb文件替换旧的rdb文件。如果是save则不会触发文件替换而是直接在当前进程中往刚才的文件中写入数据

具体过程是当执行rdb镜像操作时,会把要生成的快照数据,先保存到一个临时文件中,当快照整成完毕后,再删除之前的rdb文件,把新生成的临时的rdb文件名字改成刚才的dump.rdb文件

自动触发

RDB会在Redi数据发生修改时自动保存快照进行持久化操作,不过生成一次rdb快照是一次成本比较大的操作,所以肯定不能每次修改都生成一次快照。redis是根据配置文件中的save选项来决定什么时候自动触发持久化操作的,当达到选项中的条件后redis就会自动进行快照生成

解释:

save选项有三个,分别是

  • 距离上次更新超过了900秒在这段时间内进行1次修改操作后进行自动触发
  • 距离上次更新超过了300秒在这段时间内进行10次修改操作后进行自动触发
  • 距离上次更新超过了60秒在这段时间内进行10000次修改操作后进行自动触发

//如果给save设置成' ',就代表取消自动触发

从选项中可以看到,最快的生成快照的时间是60秒,换句话说redis每两次快照之间的最短时间是60秒,假如现在完成一次快照生成,此时快照和内存的数据是一样的,但是redis突然进行了大量的修改,不过时间还没到60秒,如果这时redis突然挂了或者机器掉电,那么在这段时间内的数据因为还没来得及进行持久化操作就会直接丢失掉

//如果是通过正常流程重新启动redis服务器,此时redis服务器会在退出的时候自动触发生成rdb操作,但是如果是异常重启(kill-9或者服务器掉电)此时服务器来不及生成rdb,内存中尚未保存到快照中的数据就会随着重启丢失

小结

  • RDB是一个紧凑的二进制文件,代表redis某一个时间点上的数据快照,非常适用于备份,全量复制等场景。比如固定时间执行bgsave,并把RDB文件复制到远程机器或者文件中用于灾难恢复
  • redis加载RDB文件的速度比AOF的方式快,因为RDB使用的是二进制的方式组织数据,可以直接把数据读到内存中,按照字节的格式取出来,而AOF则是使用文本的方式。
  • RDB没法做到实时持久化,因为redis每次都要执行fork创建子进程,开销较大,也因此RDB可能会有数据丢失的风险,当数据来没来得及持久化redis就挂掉或者掉电,这部分数据就会丢失

AOF(Append-Only File)

AOF是Redis的一种替代的、完全持久化的策略。AOF机制的作用是,每当redis客户端执行写操作时,都会被记录再aof文件里通过特殊符号区分,如果发生服务器挂掉或者掉电后重启,redis就可以通过将这些命令再执行一遍而达到恢复数据的效果。

AOF的启动需要在配置文件里将appendonly.aof选项改成yes默认情况下是no,而且当启动aof机制时rdb机制是关闭的

AOF缓冲区刷新机制

引入AOF之后,redis既要写内存,又要写硬盘会不会影响效率?

AOF并不会对效率有太大的影响,实际上AOF机制并不是直接将数据写入硬盘,而是先写入内存中的一个缓冲区,积累了一定量的数据后再一次性写入硬盘,这样做就大大降低了redis写硬盘的次数(写硬盘的次数要比一次写多少数据对效率的影响大得多)。而且AOF是把每次的操作写在文件的末尾是顺序写入,要比随机写入快得多。

虽然通过刚刚的方法大大提高了AOF的效率,但是同时也带来了一个问题,缓冲区说到底还是在内存中,如果AOF正在将指令写入缓冲区时,redis挂掉或者掉电,那么此时缓冲区中的数据还没来得及写入硬盘中,也就全部丢失掉了。虽然缓冲区的方法可以提高效率,但是相应的也会来带来一些数据可靠性的问题,所谓鱼和熊掌不可兼得。

Redis提供了多种AOF缓冲区刷新策略,由参数appedfsync控制,可配置项如下:

  • always:每写入一个命令到缓冲区,就放入硬盘,刷新缓冲区的频率最高,数据可靠性最高,性能最低
  • everysec(默认):每秒清理一次缓冲区,刷新缓冲区频率低一些,数据可靠性也降低,性能相应的也提高了
  • no:redis不进行刷新缓冲区,由操作系统自行刷新,刷新频率最低,数据可靠性最低,性能最高

AOF重写机制

随着我们的服务器一直运行,aof文件也会越来越大,虽然这个文件大小对aof效率没有什么影响,但是会影响redis的开机速度,redis启动就会读取这个文件里记录的指令操作如果文件较大,执行的操作就变多,启动之间也就变长。虽然aof文件变大是不可避免的,但是这个文件里会有很多多余的内容。比如

如果redis客户端执行指令,lpush key aaa,lpush key bbb,lpush key ccc,就相当于只执行了lpush key aaa bbb ccc。再或者一些数据插入后又删除,这样的操作对于结果显然是没用的,而redis启动时却会执行一遍,也就拖长了启动时间。所以实际上我们的aof不在乎中间过程,只在乎最终的数据结果

所以aof就针对上面问题做出了应对,也就是重写机制,可以将aof中一些多余的操作指令给剔除掉,并且合并一些操作,从而缩小aof文件。

重写机制的触发方式也分为手动触发和自动触发

  • 手动触发:调用bgrewriteaof命令redis就会对文件进行重写
  • 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage的参数决定触发时机,auto-aof-rewrite-min-size表示触发重写时AOF的最小文件大小(默认是64mb)。auto-aof-rewrite-percentage代表AOF占用大小相比上次重写时增加的比例。

AOF重写流程

aof重写的方法和rdb很像,也是先fork一个子进程,子进程负责AOF文件的重写父进程依旧继续负责处理redis客户端的命令。但是我们重写的时候并不关心当前aof文件里都有啥,而只在乎内存中的数据状态,子进程只需要获取当前内存中的数据,然后以aof的形式写入一个新的aof文件,然后替换掉旧的文件即可。

这里的方法和RDB的快照也挺像,都是记录当前时间点的内存状态。只不过RDB是以二进制的形式,而AOF是以文本形式。

在fork创建子进程的一瞬间,子进程就继承了父进程当前的内存状态,但是重写也要一定时间,可能在重写的时候redis客户端会对内存进行一些修改

换句话说,我们的子进程记录的是fork之前的内存,但是fork之后的数据并不会丢失,父进程会再准备一个缓冲区aof_rewrite_buf当创建完子进程后,父进程就会将一些aof数据先存储到这个缓冲区。

子进程完成重写后会通知父进程,然后父进程再将aof_rewrite_buf中的数据写入新的aof文件,最后再让新的aof文件代替旧的aof文件

假如在redis正在重写的时候,又来了一个重写操作会怎么样? 

答案是,新的重写操作会直接返回不执行,而且如果在要进行AOF操作时发现redis正在进行RDB快照操作,那么aof将会阻塞等待,等到RDB操作完成后再启动AOF操作。

父进程在重写的时候依然维护写入旧的aof文件是否有必要?

 答案是,有必要因为假如redis在进行重写操作时,这时redis服务器挂掉了的话,新的aof文件还没有写入完全,缓冲区里的数据也都丢失,如果旧的aof文件再被销毁的话就会造成一部分数据的丢失。

混合持久化

虽然aof是以文本方式写入,但是当我们查看aof文件时会发现这里是用二进制存储,这是因为aof原本按照文本方式写入文件但是这样的成本较高,于是redis就引入混合持久化,也就是同时结合了rdb和aof。

按照aof的方式每个请求操作都写入文件,触发aof重写后,就会把当前内存状态按照rdb的二进制格式写入到新的aof文件中,后续在进行的操作还是按照aof文本的方式追加到文件后面。

混合持久化在配置文件里默认开启,当同时存在aof文件和rdb快照时,则以aof为主

相关文章:

一篇解决Redis:持久化机制

目录 认识持久化 持久化方案 RDB(Redis DataBase) 手动触发 自动触发 小结 AOF(Append-Only File) AOF缓冲区刷新机制 AOF重写机制 AOF重写流程 ​编辑 混合持久化 认识持久化 我们都知道Mysql有四大特征,原子性,持久…...

使用IDEA创建Maven版本的web项目以及lombok的使用

1.新建项目 2.修改pom.xml 3.修改项目结构 4.在main/java下面写一个Servlet测试一下 然后当前页面往下滑 -Dfile.encodingUTF-8编写一句输出语句,测试是否成功部署配置,并选择到正确的位置: 回车以后 再回到idea里面,发现控…...

2025年AI开发者在开发者占比?

AI开发者在全球开发者中的占比目前没有一个统一且精确的数值,但根据行业报告和调研数据,可以给出以下大致的范围和趋势分析: 1. 综合估算范围 全球范围:AI/ML(机器学习)开发者约占开发者总数的 5%-15%&…...

SpringBoot整合MQTT实战:基于EMQX构建高可靠物联网通信,从零到一实现设备云端双向对话

一、引言 随着物联网(IoT)技术的快速发展,MQTT(Message Queuing Telemetry Transport)协议因其轻量级、低功耗和高效的特点,已成为物联网设备通信的事实标准。本文将详细介绍如何使用SpringBoot框架整合MQTT协议,基于开源MQTT代理EMQX实现设…...

Windows更新暂停七天关键注册表

环境:windows10 工具:procmon 下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procmon 监控截图: 界面截图: 注: 1.北京时间差8小时 2.至少是从第二天恢复,即至少暂停…...

小白学习java第18天(上):spring

Spring :是一个轻量级(一个小依赖就可以实现还不是轻量级)的控制反转(IOC)和面向切面编程(AOP)的框架! 优点: 1.Spring 是一个开源免费的框架(容器&#xf…...

用Array.from实现创建一个1-100的数组

一、代码实现 let arr Array.from({length: 100}, (_, i) > i 1); 二、代码分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 类数组对象(如 { length: 100 })本身没有索引属性(如 0: undefined, 1: undefi…...

什么是物联网 IoT 平台?

目录 物联网IoT平台的定义 物联网 IoT 平台发展历程 物联网IoT平台数据的特征 物联网IoT平台的处理流程 专为物联网 IoT 平台处理而生的时序数据库 物联网 IoT 平台时序数据处理面临的挑战及解决方案 收益与价值 物联网 IoT 平台企业案例 至数摇光 x TDengine 华自科技…...

PostgREST:无需后端 快速构建RESTful API服务

在现代 Web 开发中,API 已成为连接前后端的核心桥梁,传统的做法是通过后端框架来构建API接口,然后由前后端人员进行联调。 PostgREST是基于无服务器的一种实现方案,允许开发者将PostgreSQL数据库直接暴露为RESTful API&#xff0…...

3天北京旅游规划

北京 第一天应该集中在故宫和市中心区域,比如天安门、人民广场。这样可以体验到北京的历史和政治文化。午餐推荐烤鸭,因为这可是北京的特色。下午可以安排南锣鼓巷,既有古色古香的胡同,又有丰富的美食选择。 第二天的话&#xff0…...

MySQL--day1--数据库概述

(以下内容全部来自上述课程) 概述 1. 为什么要用数据库 持久化:内存中的数据断电之后就不存在了,所以需要持久化–>需要相关介质。 其中的一个介质就是数据库:存储数据量大、存储数据类型多 2. 数据库与数据库…...

[思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?

一、什么是事物的关系? 事物的关系是指不同事物之间存在的各种联系和相互作用,它反映了事物之间的相互依存、相互影响、相互制约等特性。以下从不同维度为你详细阐述: 1、关系的类型 因果关系 定义:一个事件(原因&a…...

图像识别与 OCR 应用实践

图像识别是一种让计算机具备“看”与“理解”图像能力的人工智能技术,其目标是从图像或视频中提取有意义的信息,如物体、人物、场景或文字。在现实生活中,这项技术被广泛应用于面部识别、自动驾驶、安防监控、医疗诊断、图像搜索等多个领域。…...

深入理解卷积神经网络:从基础原理到实战应用

在人工智能领域,卷积神经网络(Convolutional Neural Network,简称 CNN)凭借其强大的图像识别、处理能力,成为深度学习中不可或缺的技术。无论是自动驾驶汽车识别道路标志,还是医学影像分析辅助疾病诊断&…...

51单片机——交通指示灯控制器设计

设计目标 1、设计一交通灯控制,控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。 2、可手动控制和自动控制,设置两个输入控制开关。 手动/自动开关,通过P11的按键输入控制 3、手动:设置开关P11,两种情况&#x…...

vue2 头像上传+裁剪组件封装

背景:最近在进行公司业务开发时,遇到了头像上传限制尺寸的需求,即限制为一寸证件照(宽295像素,高413像素)。 用到的第三方库: "vue-cropper": "^0.5.5" 完整组件代码&…...

面向对象设计模式之代理模式详解

文章目录 面向对象设计模式之代理模式详解面向对象思想:现代软件开发的基石代理模式:巧妙的中间层设计JavaScript 语法点与代理模式的结合JavaScript 实现代理模式示例代理模式的应用场景 面向对象设计模式之代理模式详解 在现代软件开发的浩瀚领域中&a…...

Leetcode209做题笔记

力扣209 题目分析:想象一个窗口遍历着这个数组,不断扩大右边界,让r。往窗口中添加数字: 此时我们找到了这个窗口,它的和满足了大于等于target的条件,题目让我求最短的,那么我们就尝试来缩短它&…...

SVG 知识详解:从入门到精通

SVG 知识详解:从入门到精通 作为一名前端开发者,我经常会被SVG的魅力所折服。这种基于XML的矢量图形格式,不仅能完美适配各种屏幕分辨率,还能通过CSS和JavaScript进行灵活控制。今天,就让我们一起来深入探索SVG的世界…...

编译openssl源码

openssl版本 1.1.1c windows 安装环境 perl 先安装perl,生成makefile需要 https://strawberryperl.com/releases.html nasm nasm 也是生成makefile需要 https://www.nasm.us/ 安装完perl输入一下nasm,看看能不能找到,找不到的话需要配…...

土壤温湿盐分传感器用于节水农业灌溉引领者三针设计原理便于安装维护

土壤温度部分是由精密铂电阻和高精度变送器两部分组成。变送器部分由电源模块、温度传感模块、变送模块、温度补偿模块及数据处理模块等组成,彻底解决铂电阻因自身特点导入的测量误差,变送器内有零漂电路和温度补偿电路,对使用环境有较高的适…...

Kotlin Compose 与传统 Android UI 开发对比

在移动应用开发领域,Android 开发一直是技术演进的前沿阵地,而 UI 开发作为用户与应用交互的核心环节,其技术体系的变革更是备受瞩目。 技术演进背景 Android UI 开发体系发展脉络 原生 View 体系阶段 在早期的 Android 开发中,原生 View 体系占据了主导地位。开发者通…...

docker-compose——安装redis

文章目录 一、编写docker-compose.yaml文件二、编写redis.conf文件三、启动docker-compose 一、编写docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…...

MFC 调用海康相机进行软触发

初始化相机类文件 #pragma once #include "MvCameraControl.h" class CMvCamera { public:CMvCamera();~CMvCamera();//初始化相机int InitCamera();int SaveCurrentImage(CString filePath);//关闭相机void CloseCamera();//设置int SetEnumValue(IN const char* s…...

第二章 变量和运算符

主要内容 关键字和标识符变量和常量八大基本数据类型Scanner键盘输入基本数据类型的类型转换算术运算符赋值运算符扩展赋值运算符比较运算符逻辑运算符三目运算符运算符的优先级别 学习目标 知识点要求关键字和标识符理解变量和常量掌握八大基本数据类型掌握Scanner键盘输入…...

【starrocks】StarRocks 常见 HTTP 操作与导入错误排查指南

文章目录 一、Stream Load:通过 HTTP 导入数据二、导入状态查询三、取消导入任务四、节点状态监控查看所有 Backend 状态:查看所有 Frontend 状态: 五、导入失败的排查方式1. 查询导入任务状态2. 下载详细错误日志3. 查看 FE/BE 节点日志FE 日…...

网络协议分析 实验七 FTP、HTTP、DHCP

文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下,上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…...

ET ProcessInnerSender类(实体) 分析

ProcessInnerSender 作用是进程内部发送Actor消息 字段 TIMEOUT_TIME 超时时间RpcId 用来累加requestCallback 存储RPC的回调事件list 用来获取MessageQueue中的Actor消息 方法 Awake 初始化在MessageQueue中注册待处理的消息队列Destroy 移除在MessageQueue中的消息队列U…...

远程连接工具

绿色轻便ToDesk https://www.todesk.com/download.html 向日葵 https://sunlogin.oray.com/download...

MySQL库级管理:数据库管理与存储引擎剖析

引言 各位数据库爱好者们好!今天我们要深入探讨MySQL数据库的基本操作,这是每位开发者必须掌握的"内功心法" 💪。无论你是刚接触MySQL的小白,还是需要复习基础的老手,这篇教程都将带你系统学习数据库的核心…...

MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?

MongoDB 是一个面向文档的数据库,它的核心概念与传统的关系型数据库(RDBMS)有所不同。以下是它的四个主要核心概念: 文档 (Document) 定义: 文档是 MongoDB 中的基本数据单元。它类似于关系型数据库中的一行记录&#…...

占位符读取标准输入缓冲区规则

1、如果标准输入缓冲区中的前若干个字符都是空白字符,%s,%d,%f都能直接跳过并且从第一个非空白字符开始读取,但%c不能,而是直接读取。 2、%s遇到空白字符时停止,不会读取遇到的空白字符。 3、%d遇到非数字…...

使用Docker部署MongoDB

使用Docker部署MongoDB 使用Docker部署MongoDB是一种快速、便捷的方式,以下是详细步骤: 1. 基本部署 拉取MongoDB镜像 docker pull mongo:latest运行MongoDB容器(最简单方式) docker run --name mongodb -d -p 27017:27017 m…...

如何通过命令提示符(CMD)检查虚拟化是否已启用

想确认 Windows 11 或 10 电脑或笔记本上的虚拟化是否已启用,可以使用命令提示符或 PowerShell 中的 systeminfo 命令。之前已经介绍过使用图形界面的检查方法。在大多数现代系统中,虚拟化默认在 BIOS 中启用,但我们无需打开 BIOS/UEFI 固件菜单即可确认这一点。 虚拟化是一…...

【氮化镓】AlGaN合金中成分相关的辐射响应

2025年,美国宾夕法尼亚州立大学Miaomiao Jin等人基于分子动力学模拟方法,研究了AlGaN合金中成分依赖的辐射响应。研究结果表明,AlGaN合金的辐射损伤特性与铝含量密切相关:随铝含量增加,单次碰撞事件产生的缺陷减少,但由于累积效应,富铝系统更易形成扩展间隙缺陷簇,导致…...

『 测试 』软件测试全流程与Bug管理核心要点解析

文章目录 1 软件测试生命周期2 Bug2.1 Bug 的概念2.2 提出清晰的 Bug2.3 Bug 级别2.4 Bug 的生命周期2.5 作为测试人员与开发人员发生冲突怎么办 1 软件测试生命周期 软件测试贯穿于软件的整个生命周期; 需求分析 测试前需要对需求进行分析, 分析通常站在三个角度去考虑, 即用…...

【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) (一)Feign的理解 前面文章【springcloud学习(dalston.sr1)】服务消费者通过restTemplat…...

嵌入式Linux Qt开发:2、Qt creator简单配置、Qt Designer使用以及信号槽机制使用

一、前言 Qt creator比较轻量,而且是Qt自带的IDE,基本可以开箱即用,个人使用起来感觉还是比较舒服的,并且其自带的FakeVim也可以做一些Vim的配置,其主界面可以简单配置显示很多的窗口,让开发更加顺畅。 Q…...

【Vue 3 + Vue Router 4】如何正确重置路由实例(resetRouter)——避免“VueRouter is not defined”错误

在使用 Vue 3 和 Vue Router 4 开发中大型 SPA 应用时,我们经常会遇到需要动态添加或删除路由的场景。尤其是在权限控制和用户登出后重置路由的需求中,正确地实现 resetRouter 非常关键。 然而,许多开发者在迁移或初始化项目时,会…...

企业内部通讯,企业级即时通讯软件选择

企业内部的沟通往往涉及大量敏感信息,如商业机密、财务数据、客户信息等。BeeWorks IM即时通讯平台采用全私有化部署,企业可以将服务器部署在自己的数据中心或私有云环境中,确保所有数据的存储和传输都在企业可控的网络内完成。这种部署方式从…...

300. 最长递增子序列

理解最长递增子序列(LIS)是解决该问题的关键。子序列是从给定数组中按顺序选取的元素序列,例如数组 [1, 2, 3, 4, 5] 的子序列可以是 [2, 3, 4]。需要注意的是,子序列的元素在原数组中不一定是连续的。因此,最长递增子…...

MongoDB入门

1.MongoDB 基本概念详解 2.MongoDB 快速实战 3.MongoDB 核心操作与原理详解 Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译 成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库…...

MySQL基础原理

目录 一、MySQL架构 1、四层架构 2、MySQL运行机制 二、MySQL存储引擎 1、不同存储引擎对比 2、InnoDB存储结构 2.1 内存结构 2.2 磁盘结构 3、日志先行策略 3.1 核心思想 3.2 关键组件与流程 3.3 数据安全保证 3.3.1 崩溃恢复 3.3.2 持久性保障 一、MySQL架构 …...

Python刷题练习

文章目录 1.寻找相同字串2.密钥格式化3.五键键盘的输出4.单词重量5.输出指定字母在字符串的中的索引6.污染水域7.九宫格按键输入8.任务最优调度9.高效的任务规划 1.寻找相同字串 题目描述: 给你两个字符串t和p,要求从t中找到一个和p相同的连续子串,并输…...

基于GPUGEEK 平台进行深度学习

一、平台简介 GPUGEEK 是一个专注于提供 GPU 算力租赁服务的平台,在人工智能与深度学习领域为用户搭建起便捷的算力桥梁。它整合了丰富多样的 GPU 资源,涵盖 RTX - 4090、RTX - 3090、A100 - PCIE 等多种型号,满足不同用户在模型训练、数据处…...

基于Matlab的非线性Newmark法用于计算结构动力响应

基于Matlab的非线性Newmark法用于计算结构动力响应,主要针对材料非线性或几何非线性问题。 ​1. Newmark法基本原理​ Newmark法是一种隐式时间积分方法,通过预估-校正步骤更新位移、速度和加速度: ​预测步​: un1​un​Δtvn​…...

Oracle — PL-SQL

介绍 Oracle PL/SQL是专为Oracle数据库设计的过程化编程语言,深度融合SQL语句与结构化编程逻辑,旨在高效处理复杂数据操作与业务规则。其核心特征为“块结构”,程序由声明、执行、异常处理三部分组成,支持模块化开发,显…...

第七节第二部分:接口的综合案例

案例分析 代码: Student类 package com.Interface_Demo;public class Student {private String name;private char sex;private double score;public Student() {}public Student(String name, char sex, double score) {this.name name;this.sex sex;this.scor…...

【AI古风美学渲染】:淡雅光影中的细腻呈现

“顶作AI”作为国内首个深度融合中文语义的生成式AI平台,以近百亿级参数的Lens跨模态模型为核心,开创了“自然语言即生产力”的创作模式。该平台突破传统工具对专业术语的依赖,用户仅需输入如“水墨风格的山间庭院,晨雾中若隐若现…...

JVM学习专题(二)内存模型深度剖析

目录 1.JVM结构体系 ​编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧: 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器: 3.方法区 ​4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…...