01-16Maven-SpringBoot入门
- Maven继承
- Maven高级
- Spring
- SpringBoot入门
Maven
一、概念及功能
概念:Maven是Apache软件基金会组织维护的一款专门为Java项目提供项目构建和依赖管理的工具
1.1作用:
- 项目构建
构建:是一个将代码从开发阶段到生产阶段的一个过程:清理,编译,测试,打包,安装,部署等
- 清理:清除上一次的构建结果
- 编译:将.java文件编译成.class文件
- 测试:运行编写单元测试程序
- 报告:针对刚才的测试结果生成全面的信息
- 打包
- Java工程:jar包
- Web工程:war包
- 安装:将当前项目打包之后安装到本地仓库中
- 发布:将项目发布到服务器上进行运行
- 依赖管理
- Jar包下载:使用Maven之后,Jar包的下载统一都是从Maven远程仓库中进行下载,Maven会管理所有已经上传的Jar包依赖
- Jar包依赖:Jar包本身是一个项目,项目也会依赖于其他Jar包,使用Maven只需要导入最核心的Jar包,其他依赖包会自动加载
- jar包冲突
- Jar包与依赖包之间版本已经搭配好,最大可能的减少了依赖版本冲突问题
- Jar包与Jar包之间依赖冲突了,那么可以通过对Jar包进行调整,从而解决依赖冲突问题
- 契约编程
- 约定大于配置,配置大于编码
1.2Maven工作流程
注意:Maven连接远程仓库是需要联网的,如果没有网络那么会构建失败,构建失败后会生成一个后缀lastUpdated的文件
1.首先会向Maven的本地仓库请求资源
2.如果有就直接引用,如果没有就会到远程仓库下载到本地仓库
二、Maven安装
1.官网下载压缩包
2.必须解压到没有空格、中文目录、特殊字符的目录,不建议放在C盘
3.配置环境变量
- 系统变量中点新建系统变量 变量名:MAVEN_HOME 变量值:解压后的文件夹的路径
- 系统变量中找到path,双击后,新建,输入%MAVEN_HOME%bin
4.mvn-v 测试是否成功安装
三、Maven仓库
3.1分为两大类:
- 本地仓库
计算机中的一个文件夹,位置需要我们通过conf中的settings.xml进行指定(在localRepository下写一对双标签,其中写路径),不写默认的本地仓库在C:/用户/当前用户/.m2/repository
- 远程仓库
- 中央仓库(Maven的默认远程仓库,在国外,下载会比较慢)
- 私服仓库(类似于中央仓库,用于存放Jar包)
- 镜像仓库(国内免费搭建了中央仓库的镜像仓库,如阿里云镜像仓库)
- 公司私服仓库(公司内部封装的一些自己的公共Jar包供所有团队使用)
3.2jar包查找流程
1.当工程需要某个依赖的jar包时,首先会去当前电脑的本地仓库中根据gav坐标查找jar包
- 如果找到了,就直接引用本地仓库的jar包或依赖包
- 如果没有找到就会去连网去远程仓库下载
2.默认远程仓库是Mavan的中央仓库,下载速度慢,有些jar包可能下载不下来。所以一般会配置一个镜像仓库
3.从远程仓库下载的jar包会下载到本地仓库缓存,然后将本地仓库jar包引用到项目中使用(下载一次,永久使用)
四、Maven配置
1.创建本地仓库文件夹
2.修改settings.xml配置文件中的本地仓库地址(localRepository下写一对双标签,其中写路径)
3.配置阿里云镜像
<mirror><id>nexus-aliyun</id><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> </mirror>
4.更改JDK版本(默认Java工程是使用的JDK1.5)
<profile><!-- 告诉maven我们用jdk17 --><id>jdk-17</id><!-- 开启JDK的使用 --><activation><activeByDefault>true</activeByDefault><jdk>17</jdk></activation><properties><!-- 配置编译器信息 --><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion></properties> </profile>
五、Maven坐标
组成:
- groupId:当前Maven项目隶属于组织名称,通常都是公司域名反写,例如:cn.itsource
- artifactId:项目或者是项目中的一个模块的名称
- version:当前Maven项目版本号,根据需求进行设定
- SNAPSHOT:快照版本,正在迭代过程中,不稳定的版本
- RELEASE:释放,表示正式版本,稳定版本
六、Maven命令
**mvn compile: ** 编译 - 将java源文件.java 编译成 字节码文件.class
mvn clean: 清理 - 将编译好的字节码文件删除掉
**mvn clean compile:**清理+编译
**mvn test: ** 测试 - 运行测试代码,测试代码编译在target的test-classes中
注意:src/test/java中的所有测试类的所有方法都会自动运行,但是测试类的类名有要求:TestXxx 或 XxxTest
mvn package: 打包【.class字节码文件】
mvn source:jar: 打源码包【.java文件】
mvn install: 安装 - 将项目打包然后将jar包安装到本地仓库中
**mvn package -Dmaven.test.skip=true:**打包的时候跳过测试类
七、IDEA导入Maven项目
第一步:点击Open
第二步:找到要导入的Maven工程
第三步:会提示让选择是否在当前窗口打开,还是新开一个IDEA创建打开导入的工程
第四步:测试导入的Maven项目
八、 IDEA创建Maven项目
8.1项目的创建
第一步:打开IDEA点击创建工程
第二步:选择Maven工程,输入相关信息,点击Create进行创建
第三步:Maven工程创建成功
8.2Maven配置
第一步:点击右侧Maven按钮,Maven Settings
第二步:配置Maven
第三步:配置创建新工程时的Maven配置,这样以后创建的Maven工程就默认使用此Maven配置了
8.3测试Maven项目
第一步:引入Junit依赖,在IDEA中修改了pom.xml一定要记得刷新Maven才会生效
第二步:在域名包下创建一个类
第三步:在测试包下创建测试类
8.4. IDEA执行Maven命令
九、依赖补充
9.1. 依赖传递
概念:Maven中依赖是具有传递性的)
查看依赖关系
好处:Maven具有依赖的传递性对我们来说是非常大的一个好处,因为这样就避免我们需要去自己引入间接依赖。
9.2. 依赖排除
场景:有时候我们在引入多个依赖时,间接依赖的版本不一致会导致依赖冲突,那么此时我们就需要阻断依赖。
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope><!--排除依赖标签,可以写多个--><exclusions><!--排除依赖标签,写具体要排除那个依赖,只需要写GA坐标即可--><exclusion><!--要排除依赖的G坐标--><groupId>org.hamcrest</groupId><!--要排除依赖的A坐标--><artifactId>hamcrest-core</artifactId></exclusion></exclusions></dependency>
9.3. 依赖范围
概念:在Maven中依赖是具有作用范围的,默认情况下依赖的Jar包在任何地方都可以使用,我们可以通过…进行依赖作用范围的指定:
- 主程序范围有效:main文件夹范围内
- 测试程序范围有效:test文件夹范围内
- 是否参与打包运行:package指令范围内
scope的取值范围
scope值 | 主程序 | 测试程序 | 打包/运行 |
---|---|---|---|
compile–默认 | Y | Y | Y |
test | N | Y | N |
provided | Y | Y | N |
runtime | - | Y | Y |
9.4. 清理Maven仓库
注意:如果依赖下载失败,Maven识别到以lastUpdated结尾的文件后就不会再重新帮你下载,需要你删除这些以lastUpdated结尾的文件,然后Maven才会再次自动下载这些Jar包,以后实际开发中如果项目引入了某Jar包刷新后依赖依然报错,那么就需要检查一下此Jar包是否下载成功
解决方案:
第一步:在桌面创建一个del_lastUpdated.bat文件,创建文本改后缀即可 (文件名可以改,后缀必须是.bat)
第二步:右键编辑bat文件,拷贝以下命令并修改本地仓库文件夹绝对地址
set REPOSITORY_PATH=本地仓库文件夹绝对地址 rem 正在搜索... del /s /q %REPOSITORY_PATH%\*.lastUpdated rem 搜索完毕 pause
第三步:双击执行脚本,即可清除本地仓库下所有lastUpdated文件
Maven高级
一、继承
概念:本质上Maven的继承就是pom.xml配置的继承
- A工程继承了B工程,那么A工程就继承了B工程的pom.xml所有配置
- Maven继承的层级是没有限制的,大型互联网项目中层级会非常多,我们只需要按照规则去梳理层级即可
1.1. 为什么需要继承
原因一:真实开发中,依赖动则几十上百个依赖,那么这些依赖的版本管理是非常复杂的,为了方便版本管理,那么可以在父工程中统一管理版本信息。子工程直接使用对应版本即可,SpringBoot框架就是使用了Maven继承手段进行开发简化
原因二:真实开发中,一个项目会有很多个子工程,这些子工程都有自己的依赖,那么肯定会有一些重复的依赖,为了减少子工程重复导如依赖坐标信息,可以放在父工程中进行依赖抽取,子工程通过继承的方式进行依赖的引入
1.2. 搭建Maven继承工程
第一步:创建一个Maven工程
第二步
- 删除父工程下的src文件夹,因为父工程只负责管理pom.xml,不负责编写代码,所以不需要src文件
- 修改打包方式为pom,只有打包方式为pom的工程,才能管理其他Maven工程
第三步:创建子工程/Maven模块
1.3. 父子工程解析
- 子工程创建好之后,会自动生成parent标签,指向父工程的GAV坐标
- 子工程是不需要写GV坐标的,因为继承自父工程,子工程只需要提供A坐标即可
- 父工程中有子工程后会自动生成modules标签,代表聚合配置
1.4. 父工程管理依赖
第一步:父工程管理依赖
- dependencyManagement:此标签用于在父工程中管理依赖,但是不负责引入此依赖到工程中,子工程需要使用什么依赖还是需要在自己的子工程中手动引入,只是不需要引入版本了,版本来自父工程
注意:子工程记住一定要自己引入依赖,否则无法使用其内容
1.5. 配置自定义属性
场景:父工程在真实开发中会管理众多的依赖,那么这些依赖的版本号如果都写在各自的GAV坐标中其实管理起来也颇为复杂,所以我们可以自定义属性进行管理
-
properties:此标签是配置标签,我们可以在标签内自定义标签来定义属性值,此属性值可以被引用
- itsource.junit.version:此标签是自定义的,标签名称就是属性引用名称,标签的值就是版本值
-
${}:通过此方式可以引入自定义属性,大括号中的值就是自定义标签的值
二、 聚合
2.1. 什么是聚合
概念:在父pom.xml中的modules标签就是聚合标签,他表示了此工程由哪些模块组成,modules下的module也代表了此父工程管理了哪些子模块
优点:
好处一:我们可以直接对父工程执行mvn install,那么整个工程就自动打包好了
好处二:配置聚合之后,各个子模块在父工程中展示一个列表,可以快速让我们知道整个项目的继承结构
Spring概述
- Java企业级开发的发展史
JavaEE/J2EE时代
复杂性和繁琐的配置,存在一些限制和挑战
Spring时代
Spring框架引入了依赖注入(DI)和面向切面编程(AOP)等新概念,以减少组件之间的耦合度、提高代码的可维护性和可测试性
Spring通过IoC容器(控制反转容器)来管理对象之间的依赖关系,不用new对象了,并提供了许多其他功能模块,如数据访问、事务管理、安全性等,使开发者能够更专注于业务逻辑的实现
需要配置繁琐
SpringBoot时代
约定大于配置的原则,通过自动配置和默认值设置,减少了繁琐的配置工作
SpringBoot入门
实现步骤
第一步:使用SpringBoot骨架搭建SpringBoot项目
第二步:
- SpringBoot依赖有很多版本,我们学习使用SpringBoot-2.6.13,如果改不了就去pom.xm里面改
- 勾选初始化依赖,SpringBoot项目必须需要Web依赖,所以我们需要勾选Web依赖。其他依赖在以后项目使用中根据实际需要进行勾选
第三步:Springboot创建需要联网下载资源,等待构建完成即可
第四步:使用SpringBoot骨架进行创建会默认生成一些我们暂时使用不到的文件,为了项目简洁我们删除即可
第五步:创建请求处理类
请求处理类:专门用来接收前端发起到后端的请求
存储规范:请求处理类按照规范必须放入到controller包下
第六步:运行SpringBoot项目
- SpringBoot项目中定义了一个启动类,运行这个启动类可以把整个SpringBoot项目运行起来
第七步:浏览器访问
输入localhost:8080/hello 可以到配置文件里面更改默认端口号
1. 运行启动类启动项目,SpringBoot内置Tomcat,启动成功会看到控制台的默认端口号8080
2. 当在地址栏输入http://localhost:8080/hello时,浏览器访问的就是当前项目
3. 然后是用/hello去匹配我们的控制器Controller,即匹配注解@RequestMapping请求映射注解
4. 匹配上之后就会自动执行hello方法中的内容
- Mavanjar包查找流程 先在本地仓库查找,没有就去远程仓库下载后存在本地仓库
- Maven的安装之后需要配置哪些内容,为什么要配置 阿里云镜像 速度快 JDK的版本,默认是jdk1.5的 本地仓库的位置,防止对c盘占用过多
- Maven常见命令分别有哪些,有什么作用 compile编译 test测试 package打成jar包
- Maven继承和聚合的好处 继承,方便管理坐标,避免子工程重复导入相同的依赖 聚合,方便统一打包,管理
- SpringBoot是什么?有什么优势 框架,简化开发,约定大于配置,很多东西不用手动配置了
- SpringBoot入门项目的编写流程步骤有哪些 新建SpringBoot项目 删除不必要的东西 main下建一个controller的包 其中写请求处理类
自动执行hello方法中的内容
> 1. Mavanjar包查找流程 先在本地仓库查找,没有就去远程仓库下载后存在本地仓库
> 2. Maven的安装之后需要配置哪些内容,为什么要配置 阿里云镜像 速度快 JDK的版本,默认是jdk1.5的 本地仓库的位置,防止对c盘占用过多
> 3. Maven常见命令分别有哪些,有什么作用 compile编译 test测试 package打成jar包
> 4. Maven继承和聚合的好处 继承,方便管理坐标,避免子工程重复导入相同的依赖 聚合,方便统一打包,管理
> 5. SpringBoot是什么?有什么优势 框架,简化开发,约定大于配置,很多东西不用手动配置了
> 6. SpringBoot入门项目的编写流程步骤有哪些 新建SpringBoot项目 删除不必要的东西 main下建一个controller的包 其中写请求处理类
相关文章:
01-16Maven-SpringBoot入门
Maven继承Maven高级SpringSpringBoot入门 Maven 一、概念及功能 概念:Maven是Apache软件基金会组织维护的一款专门为Java项目提供项目构建和依赖管理的工具 1.1作用: 项目构建 构建:是一个将代码从开发阶段到生产阶段的一个过程…...

微信小程序(二十七)列表渲染改变量名
注释很详细,直接上代码 上一篇 新增内容: 1.改变默认循环单元item变量名 2.改变默认循环下标index变量名 基础模板有问题可以先看上一篇 源码: index.wxml <view class"students"><view class"item"><te…...

k8s之安装部署及kuboard发布应用
目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm,kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…...

JProfiler for Mac:提升性能和诊断问题的终极工具
在当今的高性能计算和多线程应用中,性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具,旨在帮助开发者更好地理解其应用程序的运行情况,提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括:…...
力扣202-快乐数
快乐数 题目链接 解题思路: 两个指针,一快一慢,如果相遇,就会生成环如果环内元素为1,那么就可以返回 class Solution { public:int get(int n){int res 0;while(n){res (n%10) * (n%10);n / 10;}return res;}bool isHappy(int …...

牛客寒假训练营H题
思路:找出所有m的子集,加到价值中,找出最大价值即可。 代码: void solve(){int n, m;cin >> n >> m;vector<pii>a(n 1);for(int i 1;i < n;i )cin >> a[i].first >> a[i].second;int ans 0…...
ubuntu22.04@laptop 常用基础环境安装
ubuntu22.04laptop 常用基础环境安装 1. 源由2. 步骤2.1 安装ubuntu22.04 LTS系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 应朋友要求,整理下一个个人常用的工作笔记本常用开发环…...

Linux第41步_移植ST公司uboot的第2步_修改网络驱动_USB OTG设备树_LCD驱动_以及编译和烧写测试
移植ST公司uboot的第1步,创建配置文件、设备树、修改电源管理和sdmmc节点后,还需要进一部修改,如:网络驱动、USB OTG设备树、LCD驱动,以及编译和烧写测试。 一、在虚拟机中,使用VSCode打开my_uboot工作区 …...
瑞芯微1808模型转换(onnx到rknn)环境配置过程
瑞芯微1808模型转换(onnx → \to →rknn)环境配置 阅读本解决方案前,请读者确保已经根据官方的相关教程【rknn_model_zoo/common/rknn_converter at v1.5.0 airockchip/rknn_model_zoo (github.com)】完成其他配置文件的修改,以…...

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)
EasyCaching属于开源缓存库,支持基本缓存方式及高级缓存用法,提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型,本文学习最基础的InMemory方式的基本用法。 EasyCaching.InMemory包属于基于内存的缓存库,使用的…...

机器学习系列-2 线性回归训练损失
机器学习系列-2 线性回归&训练损失 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归: 举例:蝉(昆虫物种&…...
spring-boot-actuator 服务监控
1 概述 服务启动时,通过spring-boot-actuator 监控es等服务是否连接成功等 2 依赖 <!-- 服务监控 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…...

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算
在当今计算领域中,存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理,并探讨几个引人注目的代表性工作,如DPE、ISAAC、PRIME等,它们在神经网络和图计算应用中表现出色&…...

Python flask 表单详解
文章目录 1 概述1.1 request 对象 2 示例2.1 目录结构2.2 student.html2.3 result.html2.4 app.py 1 概述 1.1 request 对象 作用:来自客户端网页的数据作为全局请求对象发送到服务器request 对象的重要属性如下: 属性解释form字典对象,包…...

【Tomcat与网络3】Tomcat的整体架构
目录 1.演进1:将连接和处理服务分开 2演进2:Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理,本文我们结合Tomcat来分析一下如何设计一个大型…...

k8s中cert-manager管理https证书
前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…...

如何搭建私有云盘SeaFile并实现远程访问本地文件资料
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-hsDnDEybLME85dTx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
Centos7安装Nginx-1.21
一、编译前提,需要安装必要的包 yum install gcc pcre-devel openssl-devel zlib-devel wget -y 二、下载对应的NGINX包 wget http://nginx.org/download/nginx-1.21.0.tar.gz 三、解压nginx tar xf nginx-1.21.0.tar.gz 四、编译并安装nginx到/usr/local/ng…...

React 面试题
1、组件通信的方式 父组件传子组件:通过props 的方式 子组件传父组件:父组件将自身函数传入,子组件调用该函数,父组件在函数中拿到子组件传递的数据 兄弟组件通信:找到共同的父节点,用父节点转发进行通信 …...
Postgresql使用update
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 解决问题一、关联表更新1.关联一张表2.关联多张表 二、根据状态更新为不同的值 解决问题 通过多张关联表更新主表的字段,根据状态更新为不同的值。 一、…...

华为云Flexus+DeepSeek征文|Dify - LLM 云服务单机部署大语言模型攻略指南
前言:在当今人工智能快速发展的时代,华为云推出的 Dify - LLM 对话式 AI 开发平台为企业和开发者提供了便捷的大语言模型应用开发解决方案。 通过在华为云 Flexus 云服务器上单机部署 Dify,并成功集成 DeepSeek 模型,我们能够快速…...

three.js 零基础到入门
three.js 零基础到入门 什么是 three.js为什么使用 three.js使用 Three.js1. 创建场景示例 2.创建相机3. 创建立方体并添加网格地面示例 5. 创建渲染器示例 6. 添加效果(移动/雾/相机跟随物体/背景)自动旋转示例效果 相机自动旋转示例 展示效果 实现由远到近的雾示例展示效果 T…...
强化学习入门:交叉熵方法数学推导
前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东西,数学公式也不会太多,还望读者多多指教…...

CAN通信收发测试(USB2CAN模块测试实验)
1.搭建测试环境 电脑:安装 USB 驱动,安装原厂调试工具,安装cangaroo(参考安装包的入门教程即可) USB驱动路径:~\CAN分析仪资料20230701_Linux\硬件驱动程序 原厂调试工具路径:~\CAN分析仪资料2…...
Vue---vue使用AOS(滚动动画)库
AOS介绍 aos.js是一个轻量级的动画库插件,可以简单的实现页面滚动触发动画效果,可以让我们网页看起来更加生动(高大上) 官网演示地址:aos.js 安装 YARN, NPM, BOWER安装 yarn add aos npm install aos --save bower install aos --save CDN引入 <link href"https…...
Spark 之 AQE
个人其他链接 AQE 执行顺序https://blog.csdn.net/zhixingheyi_tian/article/details/125112793 AQE 产生 AQE 的 循环触发点 src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala override def doExecute(): RDD[InternalRow] = {withFin…...
时序数据库IoTDB与EdgeX Foundry集成适配服务介绍
一、背景介绍 EdgeX Foundry:由Linux基金会运维的开放源码边缘计算软件框架,自2017年开源后广泛应用于全球各行业场景。VMware自2018年起在中国社区推广EdgeX技术,拓展生态,并持续贡献代码。IoTDB:由Apache基…...
gopool 源码分析
gopool gopool是字节跳动开源节流的gopkg包中协程池的一个实现。 关键结构 协程池: type pool struct {// The name of the poolname string// capacity of the pool, the maximum number of goroutines that are actually working// 协程池的最大容量cap int32…...
测试 FreeSWITCH 的 mod_loopback
bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 个 channels 有 2 个 calls 比较有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以录音 这就是回环 有什么用呢? 除了做测试&#x…...
Redis 与 MySQL 数据一致性保障方案
在高并发场景下,Redis 作为缓存中间件与 MySQL 数据库配合使用时,数据一致性是一个关键挑战。本文将详细探讨如何保障 Redis 与 MySQL 的数据一致性,并结合 Java 代码实现具体方案。 数据不一致的原因分析 在分布式系统中,Redis…...