【基于Raft的KV共识算法】-序:Raft概述
本文目录
- 1.为什么会有Raft?
- CAP理论
- 2.Raft基本原理
- 流程
- 为什么要以日志作为中间载体?
- 3.实现思路
- 任期
- 领导选举
- 日志同步
1.为什么会有Raft?
简单来说就是数据会随着业务和时间的增长,单机不能存的下,这个时候需要以某种方式切片分成多个分片(Shard、Partition、Region)
。分片之后可以将单个数据集分散到多个机器上面。
但是随着集群的使用,单个机器的故障的概率会增大,所以为了保证CAP
理论中的可用性,会将分片冗余多份
在多个机器上面,每个冗余称之为一个副本,但如果有分片持续写入进来,从属该分片的多个副本,可能会由于网络问题、故障问题等导致数据不一致,这个时候需要引入共识算法,所以也就是为了保证多个副本之间的数据一致性
。在Redis的相关主从问题上我们能够看到一些Raft的影子。
CAP理论
一致性(Consistency)
指系统中的所有节点在任何时刻看到的数据都是最新的,或者是一致的。例如,当一个节点更新了数据后,其他节点立即看到更新后的数据。
可用性(Availability)
指系统能够持续对外提供服务,即使部分节点出现故障,用户仍然可以访问系统并获得响应。
分区容错性(Partition Tolerance)
指系统能够容忍网络分区故障,即在部分网络通信失效的情况下,系统仍然能够正常运行。
根据CAP理论,一个分布式系统在设计时最多只能同时满足其中的两个特性。
2.Raft基本原理
首先Raft会把客户端的请求
序列化成操作序列
,也就是操作日志 Operation log
,然后会确保Raft所有的服务器都会看到相同的日志。
每个Raft Server就是一个进程,运行在各自的服务器机器上,后续我们通过多线程来模拟这个点。Raft Server
,很多地方也叫做Raft Peer
、Raft Instance
,是同一个意思。
通常业务中一个Raft Server
会包含多个数据分片的状态机
,即数据分片的一个副本
,不同机器上的同一个数据分片的副本联合起来就是一个Raft Group
,这样一个集群中就有多个Raft Group
。比如下面这个图,绿色的Raft Group
在node 1 2 4
中联合起来了。
当某个Server宕机重启之后,Raft算法会负责将日志进行追评。
有超过一半的Sever存活,并且可以互相通信,Raft就可以正常运行,否则就会停止,不接受客户端来的新的请求。当Server超过一半了,就可以继续工作。
流程
在论文中可以看到对应的流程图,Raft
的客户端就是Client
。服务器Raft Server
,组成Raft集群的单个进程。 状态机State Machine
:每个Raft Serve
r中都会有一个本地的状态机,可以理解为一个小型的KV存储,客户端的读取请求会转为操作日志Log,然后打到状态机里面。
简单来说就是:
- 客户端发送请求:客户端向服务器发送一个请求(例如,设置变量的值)。
- 日志记录:服务器的共识模块接收到请求后,将其作为日志条目追加到日志中。
- 状态机应用:一旦日志条目被共识并持久化存储,服务器的状态机将应用这些日志条目,更新其内部状态。
- 响应客户端:状态更新完成后,服务器将响应发送回客户端,告知操作结果。
为什么要以日志作为中间载体?
这里有几个点:
- 顺序保证:日志确保所有节点以相同的顺序执行相同的操作。这是实现
一致性
的关键,因为分布式系统中的节点可能在不同时间接收到相同的请求
。 - 持久化存储:日志条目被持久化存储,这意味着即使节点发生故障,日志中记录的操作也不会丢失。这保证了
系统的容错性
。 - 可复制性:日志条目可以被复制到其他节点,确保所有节点最终都能达到相同的状态。
这是实现高可用性和分区容错性的关键
。 - 简化状态机操作:通过将操作记录在日志中,
状态机只需要顺序地应用这些操作,而不需要处理并发操作的复杂性
。这简化了状态机的设计和实现。 - 一致性检查:日志可以用于检查节点之间的一致性。例如,Raft算法中的领导者会检查跟随者节点的日志是否与自己的日志一致,以确保所有节点的状态一致。
- 故障恢复:在节点故障后,日志可以用于恢复状态机的状态。通过从日志中重新应用操作,故障节点可以快速恢复到与其他节点一致的状态。
3.实现思路
将每个Raft实例化一个定义好的结构体,每个Raft实例在逻辑上会维护一个操作序列,每个操作都有下标,从而完成共识的一个设计。
每个操作就是 日志条目 log entry
,一旦日志条目在多个机子上达成了共识,就可以进行提交,然后就可以被应用在状态机,这样状态机就可以修改保存的数据了。
正常的Raft有几个关键的环节:领导者选举、日志同步、状态持久化、日志压缩、配置变更
。
在论文中还有配置变更
,这个部分通常是Server的个数进行增加或者删除,通常也是用于多个Raft Group的分裂和合并,这部分如果实现了Raft也被成为Multi-Raft
。
任期
任期其实大家很好理解,比如班长半个学期选一次这个意思。
如果通信的时候网络有分区,那么某些Server被隔绝,就不知道其他的Server到了哪个任期,所以等重新通信之后,第一个要做的就是对齐任期
,才能进行后期的通信。所有的RPC通信都必须对齐任期。
这里还有几个点,也侧面说明了任期的重要性和优先级。
1、低任期的 Peer 收到高任期的 Peer 任何信息后,会自动“跟上”(Follow)任期变成跟随者(Follower)。
2、高任期的 Peer 收到低任期 Peer 的任何请求时,会直接拒绝。
领导选举
Raft的领导拥有绝对的话语权,在任期内,日志里面是什么内容都是领导说了算。一个任期必须只有一个领导。同一个时刻可能会有多个领导,但是这些领导一定处于不同的任期中(可能会因为时间分区的原因导致有多个领导)。
因为权力很大,所以选举领导的时候需要慎之又慎,以此能够选出一个优秀的领导,也就是具备所有已提交日志的候选者才有可能作为领导(这个领导必须非常全面,可以这么理解)。
所以想选领导的时候一般都是比谁的日志更全面,更新。当某些跟随者投票之后,就需要重置选举钟,表示在这个时间段内不会再发起新的选举。
领导当选了之后,就要开始通过发送心跳的方式告诉其他节点,让其他节点收到心跳之后,重置选举时钟。
然后领导就会周期性的发出某些信息,直到某一时刻收到更高“任期”的消息,也就是需要换领导了。任期高,优先级就越高。比如说 Leader 与多数 Follower 发生了网络隔离后,也自动交权出去。
日志同步
领导收到客户端的请求之后,会将其序列化为日志,然后附带到周期性的广播心跳上,传给每个跟随者。
最简单的一种方式就是领导会把自己本地的所有日志都附加到心跳上,所有跟随者收到之后直接替换本地即可,但是这样会带来很大的通信代价,因此采用一种乐观+回撤
的方法进行同步。
乐观
:也就是一开始心跳不带任何的日志,只带一些标志信息
过去,跟随者通过这些标志信息发现自己的日志跟领导完全一样,就直接回复领导一致即可,之后的心跳也不需要加任何的日志了。
回撤
:如果跟随者发现自己的日志和领导不一样,就告诉领导下次发送心跳的时候需要附带日志了,下次领导就会附加一些末尾的日志,如果还是不一样,就要回撤更多,也就是多向前发送一些日志信息,直到跟随者回复肯定的消息。
这个标志信息
就是领导 所附带日志 的 前一条日志信息的二元组<下标,任期>
,如果心跳没有任何附加日志,那么这个标志信息就是领导最后一条日志的相关信息
。
为了保证领导附带日志前总有一条日志,对日志初始化的时候会放一条空日志,从而避免一些边界条件的判断。
来一张论文里面的图,这里有个很核心的点。
Leader 不能直接宣布前任的“政令”(日志)生效,而要在本任期内发布“政令”(日志)后,通过“生效”本任期“政令”来间接“追认”前序任期的相关“政令”。
这是由于选举时会通过比最后一条日志的“大小”
来决定是否 Leader 当选,因此前任的日志,如果没有通过本任期“盖棺定论”,是有可能被其他在 相同下标 具有更新日志的 Server 当选 Leader 后“冲掉的”
,也就是上图 c、d、e 的情况——没有 4 日志的“压一道”, S5 是可以当选 Leader 的,之后 S1~S3 的 2 日志是有可能被 S5 的 3 的日志冲掉。
图中的S1-5是5个Server,然后就是对应的任期123。
图中 d 和 e 的结果是互斥的。其意思是如果我们在 c 中提交 2 是不对的,因为可能发生 d 中 2 被冲掉的情况;但是我们在 e 中通过提交 4 间接提交 2 就没有问题
相关文章:
【基于Raft的KV共识算法】-序:Raft概述
本文目录 1.为什么会有Raft?CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体? 3.实现思路任期领导选举日志同步 1.为什么会有Raft? 简单来说就是数据会随着业务和时间的增长,单机不能存的下,这个时候需要以某种…...
windows下玩转vllm:在wsl下安装vllm后续,设置modelscope作为下载源
文章目录 前言所涉及的之前的关键步骤解决模型权重下载网络不通畅的问题vllm和modelscope整合后的bug附录 ImportError: cannot import name _try_login from modelscope.utils.hf_util 全部报错信息前言 之前,咱们说了,由于windows不支持直接部署vllm,所以要么采用wsl,要…...
redis --- 相关基础知识整理
目录 一、基本1、数据结构2、有序集合的编码1. 压缩列表(Ziplist)2. 跳跃列表(SkipList)3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化(RDB AOF)4、 RDB和AOF的对比…...
基于Rook的Ceph云原生存储部署与实践指南(下)
#作者:任少近 文章目录 6Ceph资源对像管理6.1查看services6.2查看Jobs6.3 查看deployments.apps6.4查看daemonsets.apps6.5查看configmaps6.6查看clusterroles.rbac.authorization.k8s.io6.7查看clusterrolebindings.rbac.authorization.k8s.io6.8通过cephclusters…...
计算机网络---TCP三握四挥
文章目录 TCPTCP 的核心特点TCP 与 UDP 特性对比TCP 标志位 TCP 的三次握手(建立连接)TCP 三次握手概述图解 TCP 三次握手为什么需要三次握手,而不是两次为什么要三次握手,而不是四次三次握手连接阶段,最后一次 ACK 包…...
linux基础知识
Linux版本 内核版和开发版 奇数为开发板 偶数为稳定版 Debian 属于自由开源稳定的linux发行版本,可以由用户进行维护,目前被教育机构、商业公司、非盈利组织和政府机构使用 Red Hat Enterprise Linux(RHEL) 由red hat公司开发的开源linux版本 RHEL服…...
快检查达梦库怎么了
扁鹊的弟弟来了 要求5分钟定位达梦数据库问题 #!/bin/bash## content 实例个数 告警日志 实例状态 用户连接 活动会话 锁 集群状态 服务状态 磁盘空间 cpu mem 侦听及日志 ## scope 单机、DW、DSC Linux 多实例 ## example 将脚本保存为d.sh,用root用执行&#…...
Python可视化大框架的研究与应用
## 摘要 随着数据科学和人工智能的快速发展,数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言,提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架,分析其特点、应用场景以及未来发展趋…...
【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】
智能音频眼镜,作为一款将时尚元素与前沿科技精妙融合的智能设备,这种将音频技术与眼镜形态完美结合的可穿戴设备,不仅解放了用户的双手,更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用,为音…...
jeecgboot项目idea启动项目(二)
文章目录 一、IntelliJ IDEA1.安装2.配置maven3.配置jdk 二、IDEA启动项目三、IDEA2024.1.4破解 一、IntelliJ IDEA IntelliJ IDEA是一款由JetBrains开发的集成开发环境(IDE),主要用于Java和Kotlin编程,但也支持多种其他编程语…...
【计算机网络基础】-------计算机网络概念
1.什么是计算机网络 定义: 图解: 2.最简单的计算机网络 其中: 结点可以是计算机、集线器、交换机、路由器等链路可以是有线链路、无线链路 2.1集线器 2.2交换机 3.互连网(internet)与 路由器 路由器 与 家用路由…...
MCAL-存储器驱动
存储器驱动由内部EEPROM驱动、内部Flash驱动、RAM测试和Flash测试四部分组成。 (1)内部EEPROM驱动 内部EEPROM驱动提供初始化服务,以及对内部EEPROM的读、写、擦除等操作。该驱动模块一次只能接受一个任务。这意味着在任何给定的时间点,只能有一个操作被处理 (2)内部F…...
爬虫系列之【数据解析之正则】《二》
目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中,我们主要会遇到两种类型的文本数据: JSON格式数据 HTML文档数据 对于JSON字符串数据,通常使用Python的字典操作进行键…...
【每日学点HarmonyOS Next知识】全局调整字体、h5选择框无法取消选中、margin不生效、Length转换为具体值、Prop和link比较
【每日学点HarmnoyOS Next知识】全局调整字体、h5选择框无法取消选中、margin不生效、Length转换为具体值、Prop和link比较 1、HarmonyOS 是否存在统一调整全局字体大小的方法? 是否存在统一调整全局字体大小的方法 可以用动态属性,自定义class实现At…...
ORM Bee V2.5.2.x 发布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片
Bee, 一个具有分片功能的 ORM 框架. Bee Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) 小巧玲珑!仅 940K, 还不到 1M, 但却是功能强大! V2.5.2 (2025・LTS 版) 开发中... **2.5.2.1 新年 ** 支持 Mong…...
【CVPR2024】基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复
论文信息 题目: Wavelet-based Fourier Information Interaction with Frequency Diffusion Adjustment for Underwater Image Restoration 基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复 源码:https://github.com/ChenzhaoNju/WF-Diff 论文创新点 基于频…...
《今日AI-编程-人工智能日报》
一、AI编程工具与行业动态 OpenAI推出GPT-4.5“猎户座”研究预览版 OpenAI发布了迄今为止“最大、最有知识”的模型GPT-4.5“猎户座”,面向Pro用户开放,并计划下周向Plus用户开放。该模型在自然对话中展现出情感智能,但在编程性能上不及深度研…...
计算机网络---SYN Blood(洪泛攻击)
文章目录 三次握手过程SYN Flood攻击原理防御措施协议层优化网络层拦截系统配置调整 TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。 TCP 协议…...
DeepSeek教unity------UI元素长按响应
主要功能说明: 长按检测:通过记录指针按下的时间,判断是否达到 longClickTime,从而触发长按事件。状态管理:使用 StateEnum 枚举管理点击项的当前状态(未按下、按下等待长按、长按已触发)。…...
virtualbox安装ubuntu,配置静态ip
一.安装virtualbox和ubuntu 在VirtualBox中安装无界面版Ubuntu(即Ubuntu Server)的步骤如下: 准备工作 下载Ubuntu Server镜像:从Ubuntu官网 https://ubuntu.com/download/server 下载ISO文件。 安装VirtualBox:确保…...
比较Spring AOP和AspectJ
1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗?在哪里可以实施AOP?它与我的应用程序集成的速度有多快?性能开销是多少? 在本文中,我们将着眼…...
DeepSeek掘金——DeepSeek R1驱动的PDF机器人
DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…...
大模型能给舆情分析带来哪些突破?
大模型在舆情分析领域带来了多方面的突破,具体体现在以下几个方面: 1.提升分析精度与效率 大模型通过深度学习和自然语言处理技术,能够高效地处理海量数据,并从中提取关键信息。例如,大模型可以自动识别文本中的情感倾…...
C++实现3D(EasyX)详细教程
一、关于3D 我们看见,这两个三角形是相似的,因此计算很简单 若相对物体的方向是斜的,计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…...
Mysql100道高频面试题
一、基础概念 1. 什么是数据库?DBMS的作用是什么? 数据库:是按照数据结构来组织、存储和管理数据的仓库。它允许用户高效地访问和管理数据。 DBMS(数据库管理系统):是一种软件系统,用于创建和…...
TCP长连接与短连接
TCP长连接与短连接 TCP(传输控制协议)中的长连接和短连接是两种不同的连接管理方式,各有优缺点: 短连接 短连接是指客户端与服务器完成一次数据交换后就断开连接。下次需要通信时,再重新建立连接。 特点࿱…...
【ISP】AF自动对焦
自动对焦方案主要有两种: 主动式对焦:通过TOF、双目进行主动测距,然后使用tuning数据进行对焦。 被动式对焦:利用sensor内容算法进行对焦。 被动式对焦有两种主要的方法: 反差对焦:通过前后推拉镜头找到…...
基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
探索Elasticsearch:认识与安装
目录 Elasticsearch的简介 Elasticsearch的定位 安装Elasticsearch 安装Kibana Elasticsearch的简介 Elasticsearch 是一款基于Apache Lucene的开源搜索引擎,在现代数据管理和分析领域占据重要地位。它以其高效的全文搜索、实时数据分析能力和灵活的分布式架构著…...
什么是DevOps
**DevOps** 是一种结合软件开发(**Development)和运维(**Operations)的方法论和文化,旨在通过自动化、协作和持续改进,缩短软件交付周期,提高系统可靠性和团队效率。其核心目标是打破开发与运维…...
Java类加载机制 双亲委派机制 八股速记版
JVM类加载机制是Java实现跨平台特性的核心机制之一,整个过程可分为以下五个阶段: 一、类加载流程 加载(Loading) 通过全限定名获取二进制字节流将字节流转换为运行时数据结构生成对应的java.lang.Class对象 验证(V…...
DeepSeek开源周Day6:DeepSeek V3、R1 推理系统深度解析,技术突破与行业启示
DeepSeek 在开源周第六天再次发文,中文原文、官方号在知乎 DeepSeek - 知乎DeepSeek-V3 / R1 推理系统概览 - 知乎deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development and community-driven innovation 引言 …...
校园快递助手小程序毕业系统设计
系统功能介绍 管理员端 1)登录:输入账号密码进行登录 2)用户管理:查看编辑添加删除 学生信息 3)寄件包裹管理:查看所有的包裹信息,及物流信息 4)待取件信息:查看已到达的…...
macOS - 使用 tmux
文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面,然后 输入 Control Option B 进入交互模式 输入 % 左右分栏," 上下分割 上一个窗格:{,下一个:} PS…...
【网络安全 | 渗透测试】GraphQL精讲一:基础知识
未经许可,不得转载, 文章目录 GraphQL 定义GraphQL 工作原理GraphQL 模式GraphQL 查询GraphQL 变更(Mutations)查询(Queries)和变更(Mutations)的组成部分字段(Fields)参数(Arguments)变量别名(Aliases)片段(Fragments)订阅(Subscriptions)自省(Introspecti…...
配置后端验证功能之validation
哈喽,好久不见。最近项目内网开发导致断更了好久。今天介绍一个简单且有意思的开发技巧吧。之前用过validation后端验证功能但没进一步了解,都只是简单用一下。假如开发中要求传参必须按照规则 不能毫无底线什么都能传,本篇介绍的就是针对此功…...
C# 多线程
概述 进程和线程 进程:指在系统中运行的一个应用程序。 线程:进程中的一个执行任务。一个进程至少有一个线程,一个进程可以有多个线程,多个线程可共享数据。 多线程 多线程:在一个程序中同时运行多个线程࿰…...
钉钉MAKE AI生态大会思考
1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…...
自然语言处理:文本表示
介绍 大家好,博主又来给大家分享知识了。今天给大家分享的内容是自然语言处理中的文本表示。 在当今数字化信息爆炸的时代,自然语言处理作为人工智能领域的重要分支,发挥着越来越关键的作用。 而文本表示,则是自然语言处理的基…...
flutter 网络请求封装与json序列化与反序列化
一、用到的工具库 网络请求库 dioflutter pub add diojson序列化与反序列化库 json_annotation//终端直接键入下命令安装 flutter pub add json_annotation dev:build_runner dev:json_serializable二、返回结果泛化封装 以 https://www.wanandroid.com/ api 接口返回结果为例…...
生成网页链接二维码
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>生成二维码</title><script src"http…...
java关键字-instanceof
主要作用 A instanceof B主要判断以下三个内容(即左边的类型A能否转换为右边的B): 判断对象A是否是B类的对象;判断对象A实现了B接口;判断对象A是否继承了B类; A表示对象,B表示接口/类&#x…...
验证码识别:一文掌握手机验证码的自动化处理
文章目录 一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取验证码1.5 通过邮件接收验证码二、解析和提取验证码2.1 正则表达式提取2.2 JSON解析三、自动化输入验证码3.1 使用Selenium自动化Web应用3.2 使用Appium自…...
Uppy - 免费开源、功能强大的新一代 web 文件上传组件,支持集成到 Vue 项目
Uppy 这个优质的前端组件,可以解决几乎所有的文件上传问题,最近发布了 TS 重写的 4.0 新版本,实用性更强了。 Uppy 是一个 UI 外观时尚、模块化的 JavaScript 文件上传组件,这个组件可以与任何 web 技术栈集成,不仅轻…...
神经网络参数量计算
算一个只有两层的神经网络的参数量,我们需要考虑两层之间的连接权重和偏置项。以下是详细的计算步骤: 网络结构 输入层(第一层): 有 2 个神经元。 输出层(第二层): 有 3 个神经元。…...
如何为Java面试准备项目经验
1 提出问题 应届生朋友或Java程序员在找Java方面的工作时,一定会需要准备Java项目经验,但事实上不少求职者,是没有项目经验,或者只具有开源社区等的学习项目经验,这样的话,就很有可能在面试时无法有效地证…...
DeepSeek 与云原生后端:AI 赋能现代应用架构
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在当今快速发展的互联网时代,云原生(Cloud Native)架构已成为后端开发的主流趋势。云…...
自定义异常
在 Java 中,自定义异常是指根据特定需求创建的异常类。通过自定义异常,可以更好地表示应用程序中的特定错误情况,并提供更清晰的错误信息。以下是关于自定义异常的详细介绍和实现方法: 一、为什么需要自定义异常? 明确…...
题解:洛谷 P2199 最后的迷宫
题目https://www.luogu.com.cn/problem/P2199 显然,数据最大 ,数组我们开不下,动态开数组。 对于每一个查询,从起点开始,走一步判断是否能看到火焰杯。 如果已经没法走了,直接拆墙,输出 Poor…...
JDK包含内容的正确说法及API文档下载
JDK包含内容的正确说法及API文档下载 正确说法:JDK包含JRE和JDK开发工具,而JRE主要包含JVM和核心类库。 因为 旧版 JRE(Java 8 及之前):确实包含 Java 插件(Applet) 和 Java Web Start…...