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

Redis——持久化

文章目录

  • Redis持久化
    • Redis的两种持久化的策略
      • 定期备份:RDB
        • 触发机制
        • rdb的触发时机:
        • 手动执行save&bgsave保存测试
        • 不手动执行bgsave测试
        • bgsave操作流程测试
        • 通过配置,自动生成rdb快照
        • RDB的优缺点
      • 实时备份:AOF
        • AOF是否会影响到redis的性能
        • AOF的重写机制
          • 重写触发方式
          • AOF重写的流程
      • 总结

Redis持久化

在这之前要提及到Mysql的事务的四个比较核心的特性

原子性 一致性 持久性 隔离性

这里mysql的持久性就是把数据存储在硬盘上,而redis数据是存在内存里的,要想做到持久,就需要让redis把数据存储到硬盘上

Redis相比于Mysql这样的关系型数据库,最明显的特点/优势就是 快,所以为了保证速度快,数据肯定还是得在内存中,但是为了持久,数据还得办法存储在硬盘上

Redis决定 内存中也存数据,硬盘上也存数据,这样的两份数据,理论上是完全相同的

  • 当要插入一个新的数据的时候,就需要把这个数据同时写入到内存和硬盘(说是两边都写,但是实际上具体怎么写硬盘还有不同的策略,可以保证整体的效率还是足够的高)
  • 当查询某个数据的时候,直接从内存读取
  • 硬盘的数据只是在redsi重启的时候,用来恢复内存中的数据
  • 代价就是消耗了更多的空间,同一份数据,存储了两遍(但是毕竟硬盘比较便宜,这样的开销并不会带来太多的成本)

Redis的两种持久化的策略

  1. RDB => Redis DataBase 定期备份:每隔一段时间,进行一次备份
  2. AOF => Append Only File 实时备份:只要有数据变动,立即备份

定期备份:RDB

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发自动触发

触发机制
  • 手动触发:通过redis客户端执行特定的命令,来执行快照生成 (手动触发分别对应 save 和 bgsave 命令)

• save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例造成长时间阻塞,基本不采用
• bgsave 命令:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,⼀般时间很短。

Redis 内部的所有涉及 RDB 的操作都采用类似 bgsave 的方式。

在这里插入图片描述

  1. 执行 bgsave 命令,Redis 父进程判断当前进是否存在其他正在执行的子进程,如 RDB/AOF 子进
    程,如果存在 bgsave 命令直接返回。
  2. 父进程执行 fork 创建子进程,fork 过程中父进程会阻塞,通过 info stats 命令查看latest_fork_usec 选项,可以获取最近⼀次 fork 操作的耗时,单位为微秒。
  3. 父进程 fork 完成后,bgsave 命令返回 “Background saving started” 信息并不再阻塞父进程,可以继续响应其他命令。
  4. 子进程创建 RDB 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行 lastsave 命令可以获取最后⼀次生成 RDB 的时间,对应 info 统计的 rdb_last_save_time 选项。
  5. 进程发送信号给父进程表⽰完成,父进程更新统计信息。
  • 自动触发:在Redis配置文件中,设置一下,让Redis每隔多长时间/每产生多少次修改 就触发

Redis生成的RDB文件,是存放在redis的工作目录中的,也是在redis的配置文件中进行设置的

在这里插入图片描述

这里的dump.rdb文件,就是rdb机制生成的镜像文件,redis服务器默认就是开启了rdb的,这个镜像文件,是一个二进制的文件,把内存中的数据,以压缩的形式,保存到这个二进制文件中

后续redis服务器重新启动,就会尝试加载这个rdb文件,如果发现格式有错误,就可能会加载数据失败

rdb文件,虽然我们没有主动去动他,但是也有可能会出现一些意外问题,一旦通过一些操作(比如网络传输)引起这个文件被破坏,此时redis服务器就无法启动

  • redis提供了rdb文件的检查工具 redis-check-rdb

查看一下RDB文件里面是什么内容

在这里插入图片描述

里面都是二进制内容,当我们对redis文件中的数据进行增删查改时,这里的RDB文件并不会立即更新

rdb的触发时机:
  1. 手动(save,bgsave)
  2. 自动(配置文件中,进行设置)

在这里插入图片描述

在这里插入图片描述

save //seconds之内至少存在changes次key的修改

虽然此处的这些数值,都可以自由修改配置,但是此处修改上述数据的时候,要有一个基本规则

生成一次rdb快照,这个成本是一个比较高的成本,不能让这个操作执行的太频繁

正因为rdb不能生成的太频繁,这就导致,快照里的数据,和当前实时的数据情况可能会存在偏差

save 60 10000 (两次生成rdb之间的间隔,至少得是60s)

假设当前

12:00:00生成了rdb(硬盘上的快照数据和内存中一致)

12:00:01开始,redis收到了大量的key的变化请求

12:01:00生成下一个快照文件

在上述过程之间,redis服务器挂了,此时就会导致,12:00:00之后的这些数据,就丢了(数新的据只是在内存里,还没存到rdb)

手动执行save&bgsave保存测试

由于这里执行的数据比较少,所以瞬间就完成了,立即查看应该是有结果的,如果数据比较多,执行bgsave就需要消耗一定的时间,立即查看不一定就是生成完毕了

在这里插入图片描述

保存后查看rdb文件可以看到已经发生了修改

在这里插入图片描述

持久化验证,可以看到,通过上述操作,redis服务器在重新启动的时候,加载了rdb文件的内容,恢复了内存中之前的状态

在这里插入图片描述

redis生成快照操作,不仅仅是手动执行命令才触发,也可以自动触发~

  1. 通过配置文件中save执行M时间内,修改N次…
  2. 通过shotdown命令(redis里的一个命令)关闭redis服务器,也会触发
  3. redis进行主从复制的时候,主节点也会自动生成rdb快照,然后把rdb快照文件内容传输给从节点
不手动执行bgsave测试

插入新的key,不手动执行bgsave,重新启动redis服务器

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

bgsave操作流程测试

bgsave操作流程是创建子进程,子进程完成持久化操作,持久化会把数据写入到新的文件中,然后使用新的文件替换旧的文件

而子进程完成持久化的速度太快了(数据少),难以观察到子进程,但是我们可以通过文件的inode来验证bgsave操作流程

在这里插入图片描述

在redis客户端执行bgsave后

在这里插入图片描述

可以看到Inode从18685044变为了18685080

通过配置,自动生成rdb快照

这里执行flashall也会自动生成rdb快照

在这里插入图片描述

将时间设置为60秒 设置两次保存rdb

在这里插入图片描述

在这里插入图片描述

如果rdb文件故意改坏了,会怎样

如果改的是结尾的位置,基本没什么影响,如果改的hi中间的位置,那么redis服务器就会挂掉

  • redis提供了rdb文件的检查工具,可以先通过检查工具,检查一下rdb文件格式是否符合要求

在这里插入图片描述

运行的时候,加入rdb文件作为命令行参数,此时就是以检查工具的方式来运行,不会真的启动redis服务器

redis-check-rdb dump.rdb

RDB的优缺点
  • RDB 是⼀个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景。比如每 6 小时执行 bgsave 备份,并把 RDB 文件复制到远程机器或者文件系统中 (如 hdfs)用于灾备。

  • Redis 加载 RDB 恢复数据远远快于 AOF 的方式。

  • RDB 方式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运行都要执行 fork 创建子进程,属于重量级操作,频繁执行成本过高。

  • RDB 文件使用特定二进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有风险。

实时备份:AOF

Append Only File

类似于mysql的binlog,会把用户的每个操作,都记录到文件中,当redis重新启动的时候,就会读取这个aof文件中的内容,用来恢复数据

在这里插入图片描述

将这个appendonly的属性设置为 yes后,重启redis服务器,这里我执行两次set命令后查看 /var/lib/redis目录下的文件,发现多了一个文件appendonly.aof

在这里插入图片描述

由文件内容可以看到,AOF是一个文本文件,每次进行的操作都会被录到文本文件中,通过一些特殊的符号作为分隔符,来对命令的细节进行区分

AOF是否会影响到redis的性能

redis虽然是一个单线程的服务器,但是速度很快,引入AOF后,又要写内存,又要写硬盘,还能和之前一样快了吗?

实际上,是没有影响的

  1. AOF机制并非是直接让工作线程把数据直接写入硬盘,而是先写入一个内存的缓冲区,积累一波后,再统一写入硬盘(假设由100个请求,100个请求一次写入硬盘,比分100次写入一个请求要快得多,写硬盘的时候,写入硬盘的数据的多少,对于性能影响没有很大,但是写入硬盘的次数则影响很大)

在这里插入图片描述

  1. 硬盘上读写数据,顺序读写的速度是比较快的(还是比内存要慢得多)随机访问则速度是比较慢的,而AOF是每次把新的操作写到原有文件的末尾,属于 顺序写入

如果把数据写入缓冲区里,本质还是在内存中,万一这个时候,进程突然挂了,或者主机掉电了,咋办?是不是缓冲区中的数据就丢了?? 答案是的,缓冲区没有来得及写入硬盘的数据会丢的

redis给出了一些选项,让程序猿,根据实际情况决定怎么取舍,缓冲区的刷新策略

刷新频越越高,性能影响就越大,同时数据的可靠性就越高

刷新频率越低,性能影响就越小,数据的可靠性就越低~~

可配置值说明取舍情况
always命令写入aof_buf 后调用 fsync 同步,完成后返回频率最高,数据可靠性最高,性能最低
everysec命令写入aof_buf 后只执行 write 操作,不进行 fsync。每秒由同步线程进行 fsync。频率低一些,数据可靠性也会降低,性能会提高
no命令写入 aof_buf 后只执行 write 操作,由 OS 控制 fsync 频率。频率最低,数据可靠性也是最低的,性能是最高的

在这里插入图片描述

通过配置文件可以看到redis默认是everysec策略

AOF的重写机制

AOF文件持续增长,体积越来越大,会影响到redis下次启动的启动时间,redis启动的时候要读取aof文件的内容

redis存在一个机制,能够对aof文件进行整理操作,这个整理就是能够提出其中的冗余操作,并且合并一些操作,达到给aof文件瘦身这样的效果,例如lpush 111 ,lpush 222 合并为 lpush 111 222

重写触发方式
  • 手动触发:调用bgrewriteaof命令
  • 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机。
    • auto-aof-rewrite-min-size:表示触发重写时AOF的最小文件大小,默认为64MB
    • auto-aof-rewrite-percentage:代表当前AOF占用大小相比较上次重写时增加的比例
AOF重写的流程

创建子进程fork,父进程仍然负责接收请求,子进程负责针对aof文件进行重写

注意: 重写的时候,不关心aof文件中原来都有啥,只是关心内存中的最终的数据状态!

子进程只需要把内存中当前的数据,获取出来,以AOF的格式写入到一个新的AOF文件中

此处子进程写数据的额过程,非常类似于RDB生成一个镜像快照,只不过RDB这里是按照二进制的方式来生成的,AOF重写则是按照AOF这里的要求的文本格式来生成的

在这里插入图片描述

在创建子进程的一瞬间,子进程就继承了当前父进程的内存状态,因此子进程里的内存数据是父进程fork之前的状态,fork之后,新来的请求,对内存造成的修改,是子进程不知道的

此时父进程这里又准备额一个aof_rewrite_buf缓冲区,专门放fork之后收到的数据,子进程这边,把aof数据写完之后,会通过信号通知一下父进程,父进程再把aof_rewrite_buf缓冲区中的内容也谢入到新AOF文件里

就可以用新的AOF文件代替旧的AOF文件了

如果,在执行bgrewriteaof的时候,当前redis已经正在进行aof重写了,会咋样呢?? ————此时不会再次执行aof重写,直接就返回了

如果,在执行bgrewriteaof的时候,当前redis已经正在进行生成rdb文件快照,会咋样呢?? ——此时aof重写操作就会等待,等待rdb快照生成完毕之后,再进行执行aof重写

rdb对于fork之后的新数据,就置之不理了,aof则对于fork之后的新数据,采取了aof_rewrite_buf缓冲区的方式来处理

父进程fork完毕之后,就已经让子进程写心得aof文件了,并且随着时间的推移,子进程很快就写完了新的文件 ,要让新的aof文件代替旧的,父进程此时还在继续写这个即将消亡的旧的aof文件是否还有意义??

这里就要考虑到一种极端的情况

假设重写过程中,重写了一半,服务器挂了,子进程内存的数据就会丢失,新的aof文件内容还不完整,所以如果父进程不坚持写旧的aof文件,重启就没法保证数据的完整性

在这里插入图片描述

打开aof文件可以看到所有的操作都被记录了下来

在这里插入图片描述

查看一下执行bgrewriteaof之前的aof文件信息

在这里插入图片描述

执行一下bgrewriteaof再查看aof文件信息

在这里插入图片描述

查看aof文件内容会发现已经变了, 并且会变成二进制

在这里插入图片描述

为什么会变成二进制呢?

AOF本来是按照文本的方式来写入文件的,但是文本的写入方式,后续的加载成本是很高的,redis就引入了“混合持久化的方式”,结合了rdb和aof的特点。按照aof的方式每一个请求/操作,都录入文件,在触发aof重写之后,就会把当前内存的状态按照rdb的二进制格式写入到新的aof文件中,后续再进行操作,仍然是按照aof文本的方式追加到文件后面的

在这里插入图片描述

在配置文件中,可以选择是否开启混合持久化

当redis上同时存在aof文件和rdb快照的时候,此时以谁为主?以aof为主!!rdb直接被忽略了(因为AOF中包含的数据比RDB更全)

在这里插入图片描述

总结

  1. Redis 提供了两种持久化方案:RDB 和 AOF。

  2. RDB 视为内存的快照,产生的内容更为紧凑,占用空间较小,恢复时速度更快。但产生 RDB 的开
    销较⼤,不适合进行实时持久化,⼀般用于冷备和主从复制。

  3. AOF 视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩 AOF 文件。

  4. RDB 和 AOF 都使用 fork 创建⼦进程,利用 Linux ⼦进程拥有⽗进程内存快照的特点进行持久化,
    尽可能不影响主进程继续处理后续命令。

相关文章:

Redis——持久化

文章目录 Redis持久化Redis的两种持久化的策略定期备份:RDB触发机制rdb的触发时机:手动执行save&bgsave保存测试不手动执行bgsave测试bgsave操作流程测试通过配置,自动生成rdb快照RDB的优缺点 实时备份:AOFAOF是否会影响到red…...

川字结构布局/国字结构布局

1.串字结构布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&g…...

2013年国赛高教杯数学建模C题古塔的变形解题全过程文档及程序

2013年国赛高教杯数学建模 C题 古塔的变形 由于长时间承受自重、气温、风力等各种作用&#xff0c;偶然还要受地震、飓风的影响&#xff0c;古塔会产生各种变形&#xff0c;诸如倾斜、弯曲、扭曲等。为保护古塔&#xff0c;文物部门需适时对古塔进行观测&#xff0c;了解各种变…...

web 0基础第一节 文本标签

这是一个html文件的基本结构 在vs code 中使用英文的 ! 可快捷设置这样的结构 <!-- --> 是在html写注释的结构 <!DOCTYPE html> <!--标识当前文档类型为html--> <html> …...

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…...

【Sqlite】sqlite内部函数sqlite3_value_text特性

目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位&#xff0c;sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…...

树莓派应用--AI项目实战篇来啦-4.OpenCV读取、写入和显示视频

1. 介绍 视频是由一张一张图片组成的&#xff0c;所以读取视频就相当于读取很多张图片&#xff0c;然后将其连起来cv2.VideoCapture可以捕获摄像头&#xff0c;但是针对树莓派的CSI摄像头调用方式采用了之前介绍的Picamera2 库&#xff0c;所以在调用的时候是有区别的&#xff…...

智能电子后视镜,汽车驾驶更安全,会是一种趋势

相比于传统的后视镜&#xff0c;智能电子后视镜的确有很多的优点。在下雨天和夜晚场景&#xff0c;电子后视镜可以说是表现优秀。 我之前一直以为我们国内是有规定不能使用电子后视镜。没想到&#xff0c;偶然刷到享界S9的视频&#xff0c;这电子后视镜&#xff0c;妥妥的给安排…...

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…...

最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)

使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; SparkAi系统现已支持自定义添加官方GPTs&#xff08;对专业领域更加专业&#xff0c;支持多模态文档&#xff0…...

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架&#xff0c;已有多家游戏厂商在生产环境使用&#xff0c;官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力&#xff0c;但是UOS目前不支持自建的Dedicated servers 集群&#x…...

Chainlit集成Dashscope实现语音交互网页对话AI应用

前言 本篇文章讲解和实战&#xff0c;如何使用Chainlit集成Dashscope实现语音交互网页对话AI应用。实现方案是对接阿里云提供的语音识别SenseVoice大模型接口和语音合成CosyVoice大模型接口使用。针对SenseVoice大模型和CosyVoice大模型&#xff0c;阿里巴巴在github提供的有开…...

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…...

顺序表的定义

一.顺序表的定义 顺序表--用顺序存储的方式实现线性表 顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中&#xff0c;元素之间的关 系由存储单元的邻接关系来体现。 二.顺序表的实现--静态分配 #include<stdio.h> #define MaxSize 10 //定义最大长度 …...

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; CP1_1_1&#xff0e;在C中&#xff0c;下列变量名正确的是&#xff08; &#xff09;。 A&#xff0e;$123 B&#…...

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…...

uniapp 设置 tabbar 的 midButton 按钮

效果展示&#xff1a; 中间的国际化没生效&#xff08;忽略就行&#xff09; 示例代码&#xff1a; 然后在 App.vue 中进行监听&#xff1a; <script>export default {onLaunch(e) {// #ifdef APPuni.onTabBarMidButtonTap(()>{console.log("中间按钮点击回调…...

php 生成随机数

记录:随机数抽奖 要求:每次生成3个 1 - 10 之间可重复(或不可重复)的随机数,10次为一轮,每轮要求数字5出现6次、数字4出现3次、…。 提炼需求: 1,可设置最小数、最大数、每次抽奖生成随机数的个数、是否允许重复 2,可设置每轮指定数字的出现次数 3,可设置每轮的抽奖…...

MySQL 8.4修改初始化后的默认密码

MySQL 8.4修改初始化后的默认密码 &#xff08;1&#xff09;初始化mysql&#xff1a; mysqld --initialize --console &#xff08;2&#xff09;之后,mysql会生成一个默认复杂的密码&#xff0c;如果打算修改这个密码&#xff0c;可以先用旧密码登录&#xff1a; mysql -u…...

前端开发笔记--css 黑马程序员1

文章目录 1. css 语法规范2.css的书写风格3.基础选择器选择器的分类标签选择器类选择器类选择器的特殊使用--多类名 id 选择器 字体属性常见字体字体大小字体粗细字体倾斜字体的复合简写字体属性总结 文本属性文本颜色文本对齐装饰文本文本缩进文本间距文本属性总结 css的引入方…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...