❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」 ☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基 分布式系统中,分布式锁是一种常用的同步机制,通过MongoDB提供的findAndModify原子操作,可以有效地实现分布式锁的功能。
文章目录 一、MongoDB的锁机制二、分布式锁的需求三、基于MongoDB的分布式锁实现原理1. 锁集合的创建2. 尝试获取锁3. 锁的重入和超时4. 释放锁MongoDB findAndModify原理 四、Spring Boot中简单实现1. 定义锁文档2. 实现锁服务3. 使用锁服务 五、注意 一、MongoDB的锁机制 MongoDB的锁机制主要用于保护数据的一致性和正确性。当多个客户端同时对同一文档进行操作时,MongoDB通过锁机制来确保每个操作的顺序和结果都是正确的。锁机制通过对文档进行加锁来实现,包括读锁和写锁。读锁允许多个客户端同时读取文档,但写锁则是互斥的,即同一时间只能有一个客户端持有写锁。
findAndModify是MongoDB提供的一个非常强大的命令,它允许你同时执行查询和更新操作,并且这个操作是原子的。这意味着在findAndModify执行期间,没有其他客户端可以修改被查询的文档,直到该命令完成。这个特性使其成为实现分布式锁的理想选择。
二、分布式锁的需求 在分布式系统中,分布式锁需要满足以下几个基本要求:
互斥性:在任意时刻,只有一个客户端能够持有锁。不会死锁:客户端在持有锁期间如果崩溃或断开连接,锁必须能够被释放,以防止死锁。容错性:在分布式环境下,部分节点或网络故障不应影响锁的正常工作。高性能:锁的获取和释放操作应该尽可能快,以减少对系统性能的影响。 三、基于MongoDB的分布式锁实现原理 1. 锁集合的创建 首先,在MongoDB中创建一个专门的集合(如locks)来存储锁信息。每个锁由一个文档表示,文档中包含了锁的关键信息,如锁名(lockName)、持有者(holder)、锁定时间(lockedAt)、过期时间(expiresAt)等。
2. 尝试获取锁 当客户端需要获取锁时,它执行以下步骤:
使用findAndModify命令查询locks集合中的对应锁文档。查询条件包括锁名和当前持有者为空(表示锁未被占用)且当前时间小于过期时间(如果存在过期时间字段)。更新操作设置持有者为当前客户端的标识,设置锁定时间,并可选地设置过期时间。如果findAndModify命令成功更新了文档,则表示客户端成功获取了锁;如果更新失败(因为其他客户端已经设置了持有者或已过期时间已过),则表示锁已被占用或已过期。 3. 锁的重入和超时 重入性:可以通过在文档中增加一个重入计数器来实现锁的重入性。当客户端尝试重新获取已被自己持有的锁时,重入计数器增加。超时机制:设置过期时间(expiresAt)来防止客户端在持有锁期间崩溃而无法释放锁。当过期时间到达时,其他客户端可以清除该锁(通过检查并更新expiresAt和holder字段)。 4. 释放锁 当客户端完成操作后,它执行以下步骤来释放锁:
再次使用findAndModify命令查询并更新locks集合中的对应锁文档。更新操作将文档的持有者设置为空(或某个特定的释放标识),并可能更新锁定时间或重入计数器(如果实现了重入性)。如果需要,还可以更新过期时间字段以清除过期的锁。 在分布式系统中,实现锁机制是一项关键任务,用于控制对共享资源的访问,防止数据不一致。MongoDB的findAndModify命令是一种强大的原子操作,可以用于实现简单的分布式锁。下面详细介绍其原理,并在Spring Boot环境中给出一个实现案例。
MongoDB findAndModify原理 findAndModify是MongoDB中的一个命令,它用于查找并更新一个文档,这个操作是原子的,意味着在查找和更新文档期间,不会有其他操作可以修改这个文档。利用这个特性,我们可以创建一个简单的分布式锁:
锁定机制:
在数据库中创建一个集合(例如locks),每个锁由一个文档表示。每个文档包含锁的关键信息,如锁名(lockName)、持有者(holder)、锁定时间(lockedAt)等。当需要锁定某个资源时,使用findAndModify尝试更新集合中的一个文档,设置holder和lockedAt。如果更新成功,则表示获得了锁;如果失败(例如,因为其他客户端已经设置了holder),则表示锁已被占用。 释放机制:
持有锁的客户端在完成操作后,需要释放锁。这通常通过另一个findAndModify操作来完成,将文档的holder设置为null或某个特定的释放标识。 四、Spring Boot中简单实现 Spring Boot中可以使用Spring Data MongoDB与MongoDB的交互。
1. 定义锁文档 import org.
博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。
主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。
🍅文末获取源码联系🍅
👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟
2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅
Java项目精品实战案例《100套》
Java微信小程序项目实战《100套》
大数据项目实战《100套》
Python项目实战《100套》
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
系统介绍: 广东省人口流动数据分析项目旨在通过Python技术对广东省的人口流动数据进行深入分析,以揭示人口流动的规律和趋势。该项目将收集广东省各地市的人口流动数据,包括流入人口、流出人口、常住人口等指标,并利用Python的数据处理和分析工具对这些数据进行处理和挖掘。通过对数据的可视化展示,可以直观地了解广东省各地区的人口流动情况,为政府决策提供科学依据。此外,该项目还将探索人口流动与经济发展、城市化进程等因素之间的关系,为制定相应的人口政策和城市规划提供参考。通过该项目的实施,可以有效提升广东省的人口管理水平,促进人口流动的有序发展,实现人口资源的优化配置。
系统开发主要在 Windows 系统下进行,采用支持跨平台的Python语言开发完成,因此可以运行在任意开发环境下。系统采用mysql数据库和B/S结构的方式,按照Django框架进行开发。
程序上交给用户进行使用时,需要提供程序的操作流程图,这样便于用户容易理解程序的具体工作步骤,现如今程序的操作流程都有一个大致的标准,即先通过登录页面提交登录数据,通过程序验证正确之后,用户才能在程序功能操作区页面操作对应的功能。
程序操作流程图
首先前端通过Vue和axios发送HTTP请求到后端的登录接口。在后端接收登录请求的Controller会使用`@RequestParam Map<String, Object> params`来接收前端传递的用户参数,用户名和密码。然后后端根据接收到的参数创建一个查询条件封装对象MyBatis的EntityWrapper用于构建查询条件。接着在业务层,调用相应的service方法来查询数据库中是否存在匹配的用户信息。这个查询方法Login()会将前端传递的对象参数传递到后台的DAO层,进行数据库的交互操作。如果存在符合条件的用户,则会返回相关的用户信息。最后在后端控制器中将查询结果封装成响应体,通过`return R.ok().put("data", userService.selecView(ew))`将用户信息返回给前端。前端收到响应后,可以通过调用Vue、ElementUI等组件来渲染登录结果,例如显示用户信息或者跳转到相应的页面。
系统架构设计 系统架构设计是软件开发过程中至关重要的一环。首先是模型层(Model),模型层通常对应着数据库或者其他数据源,它负责与数据库进行交互,执行各种数据操作,并将处理后的数据传递给控制器层。模型层的设计应该简洁清晰,尽可能减少与视图和控制器的耦合,以提高代码的可维护性和可重用性。
其次是视图层(View)通常是通过网页、移动应用界面或者其他用户界面来展示数据。视图层与用户交互,接受用户的输入,并将输入传递给控制器层进行处理。在MVC三层架构中,视图层应该尽量保持简单,只负责数据的展示和用户交互,不涉及业务逻辑的处理,以保持视图层的清晰度和可复用性,最后是控制器层(Controller),每个层都有特定的职责和功能,通过分层架构设计,实现代码模块化,为软件开发提供了一种有效的架构模式。系统架构如图4-1所示。
详细视频演示 请文末卡片dd我获取更详细的演示视频
功能截图: 在系统前台首页,调用`$route(newValue)`方法监听路由变化,根据当前的路由地址来确定活动菜单的索引,并且根据路由的哈希部分(即URL的`#`后面的部分)来判断是否需要滚动页面到顶部或者某个特定元素的位置。如果不是首页,会将页面滚动到指定元素处,否则滚动到页面顶部。另外通过`headportrait()`方法用于更新组件渲染点前用户头像。在用户登录后,后端返回了新的用户信息,需要及时更新页面上的用户头像信息。
5.1系统功能实现 当人们打开系统的网址后,首先看到的就是首页界面。通过注册后登录可以查看到首页、人口数据、公告资讯、意见反馈、个人中心等详细信息。系统首页界面如图5-1所示:
图5-1 系统首页界面
在注册流程中,用户在Vue前端填写必要信息(如用户名、密码等)并提交。前端将这些信息通过HTTP请求发送到Python后端。后端处理这些信息,检查用户名是否唯一,并将新用户数据存入MySQL数据库。完成后,后端向前端发送注册成功的确认,前端随后通知用户完成注册。这个过程实现了新用户的数据收集、验证和存储。用户注册页面如图5-2所示:
图5-2用户注册页面
# 用户注册接口,用于注册新用户账号
def register():
# 获取请求体中的用户注册信息
yonghu = request.json
# 查询数据库中是否已存在相同用户名的用户
# 假设使用一个名为users的字典来模拟数据库查询
users = {
"user1": {"id": 1},
"user2": {"id": 2}
}
if yonghu["yonghuzhanghao"] in users:
return {"error": "
基础概念
是一个基于分布式文件存储的开源数据库系统。 再高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。 MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
支持的数据库非常松散,类似于json的格式叫BSON,所以它即可以存储比较复杂的数据类型,又相当的灵活。最小存储的单位就是文档,文档对象对于关系型数据库的行,数据在MongDB中以(Binary-JSON)文档的格式存储在磁盘上。是一种二进制形式的存储格式,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
除了JSON类型,string,integer,bollean,double,array和object。
优点
面向文档存储 类JSON数据模式简单而强大动态查询全索引支持,扩展到内部对象和内嵌数组查询记录分析快速地更新高效存储二进制大对象复制和故障切换支持 缺点
不支持事务MongoDB占用空间过大
1.RabbitMQ-如何保证消息不丢失 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面考虑
第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据
第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化
第三个是开启消费者确认机制为auto,由spring确认消息处理成功后完成ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理
2.RabbitMQ消息的重复消费问题如何解决的 3. RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛) 我们当时的xx项目有一个xx业务,需要用到延迟队列,其中就是使用RabbitMQ来实现的。
延迟队列就是用到了死信交换机和TTL(消息存活时间)实现的。
如果消息超时未消费就会变成死信,在RabbitMQ中如果消息成为死信,队列可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。
我记得RabbitMQ还有一种方式可以实现延迟队列,在RabbitMQ中安装一个死信插件,这样更方便一些,我们只需要在声明交互机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死信交换机+TTL要省略了一些步骤
4. 如果有100万消息堆积在MQ , 如何解决 ?(消息堆积) 我在实际的开发中,没遇到过这种情况,不过,如果发生了堆积的问题,解决方案也所有很多的
第一:提高消费者的消费能力 ,可以使用多线程消费任务
第二:增加更多消费者,提高消费速度
使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息
第三:扩大队列容积,提高堆积上限
可以使用RabbitMQ惰性队列,惰性队列的好处主要是
①接收到消息后直接存入磁盘而非内存
②消费者要消费消息时才会从磁盘中读取并加载到内存
③支持数百万条的消息存储
5. RabbitMQ的高可用机制有了解过嘛 我们当时项目在生产环境下,使用的集群,当时搭建是镜像模式集群,使用了3台机器。
镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完成前,主节点就已经宕机,可能出现数据丢失
面试官:那出现丢数据怎么解决呢?
候选人:
我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,强一致。
并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是仲裁队列即可
题目
给定一个非空字符串S,其被N个-分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的串每K个用-分隔,并将小 写字母转换为大写
输入描述 正整数K和-分割的字符串,如: 2 25G3C-abc-d 输出描述 转换后的字符串
示例1输入输出示例仅供调试,后台判题数据一般不包含示例 输入 s-”5F3Z-2e-9–” 蓝-4 输出 “5F3Z-2E9W”
解释 字符串S被分成了两个部分,每部分4个字符; 注意,两个额外的破折号需要删掉。
示例2输入输出示例仅供调试,后台判题数据一般不包含示例 输入 s-“2-5g-3-J” 直-2 输出 “2-50-3J” 解释
字符串S被分成了3个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为2个字符。
思路
1:题目理解了之后,做起来还是比较简单的,第一步找到第一个-符号,找出第一个子串,然后将剩下的子串再分隔井转成大写即 可。
code
import java.util.Scanner; import java.util.*; import java.util.stream.Stream; import java.util.HashMap; public class Main { public static void main(String[] args) { // 处理输入 Scanner in = new Scanner(System.in); int k = in.nextInt(); String input_str = in.next(); String[] strs = input_str.split("-"); String first = strs[0]; String temp = "
说明 使用pycm3进行推断。
内容 1 环境搭建 使用conda创建对应的包环境,然后再通过jupyter运行
conda create -c conda-forge -n pymc_env "pymc>=5" conda activate pymc_env pip3 install ipython -i https://mirrors.cloud.tencent.com/pypi/simple pip3 install jupyter -i https://mirrors.cloud.tencent.com/pypi/simple nohup jupyter lab --allow-root --ip='*' --port=8888 > /dev/null 2>&1 & 嗯,我发现启动jupyter后竟然没有pymc,又重装了一下。最近阿里的镜像慢的不行了,腾讯快。
!pip3 install pymc -i https://mirrors.cloud.tencent.com/pypi/simple
2 实验 判定一个时间序列,产生突变点的位置
主要算是重启一下之前的记忆,确保新的环境搭建成功
%matplotlib inline from IPython.core.pylabtools import figsize import numpy as np from matplotlib import pyplot as plt import matplotlib as mpl mpl.style.use("ggplot") # figsize(11, 9) figsize(12.
前言:
前面我们已经学习了简单的数据结构,包括栈与队列、二叉树、红黑树等等,今天我们继续数据结构的学习,但是难度上会逐渐增大,在高阶数据结构中我们要学习的重点是图等
目录
一、并查集的原理
二、并查集的基本操作
三、并查集的实现(简略版)
四、并查集的实现方式和优化策略
五、并查集的实现(完整版)
六、总结
一、并查集的原理 在某些情况下,对于一组元素,我们会把它们划分成不同的集合。起初每个元素组成一个单元素集合,然后按照一定规律将归于同一种类型的集合合并,同时在这个过程中我们可能会反复用到查询某个元素属于哪个集合的运算,这种管理集合所对应的抽象概念就是并查集
并查集,也称为链接-切割数据结构,是一种用于管理集合的高效数据结构。它特别适用于处理“动态连接”的问题,即动态地合并集合或查询两个元素是否属于同一个集合。并查集在计算机科学中有着广泛的应用,如用于解决最小生成树问题(Prim算法和Kruskal算法)、解决网络连通性问题、解决图论中的问题等。
下面来看这样一个例子:某旅游团内有游客10人,其中西安4人,成都3人,武汉3人,10个人来自不同的地方,起先互不相识,每个游客都是一个独立的小团体,现给这些游客进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 给以下数组用来存储该小集体,数组中的数字代表:该小集团中具有成员的个数(负数的意义下文讲解)
旅行结束后,游客们要乘车回家,每个地方的游客自发组织成小分队一起上路,于是:西安游客小分队s1={0,6,7,8},成都游客小分队s2={1,4,9},武汉游客小分队s3={2,3,5}就相互认识了,10个人形成了三个小团体。假设右三个群主0,1,2担任队长,负责大家的出行。 一趟火车之旅后,每个小分队成员就互相熟悉,称为了一个朋友圈。 从上图可以看出:编号6,7,8游客属于0号小分队,该小分队中有4人(包含队长0);编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的游客属于2号小分队,该小分队有3个人(包含队长1)。 仔细观察数组中内融化,可以得出以下结论: 1. 数组的下标对应集合中元素的编号
2. 数组中如果为负数,负号代表根,数字代表该集合中元素个数
3. 数组中如果为非负数,代表该元素双亲在数组中的下标 回家一段时间后,西安小分队中8号游客与成都小分队1号游客奇迹般的走到了一起,两个小圈子的游客相互介绍,最后成为了一个小圈子: 现在0集合有7个人,2集合有3个人,总共两个朋友圈 通过以上例子可知,并查集一般可以解决一下问题: 1. 查找元素属于哪个集合 沿着数组表示树形关系以上一直找到根(即:树中中元素为负数的位置) 2. 查看两个元素是否属于同一个集合 沿着数组表示的树形关系往上一直找到树的根,如果根相同表明在同一个集合,否则不在 3. 将两个集合归并成一个集合 将两个集合中的元素合并 将一个集合名称改成另一个集合的名称 4. 集合的个数 遍历数组,数组中元素为负数的个数即为集合的个数。 二、并查集的基本操作 并查集主要支持以下三种基本操作:
查找(Find):确定一个元素属于哪个集合。合并(Union):将两个集合合并为一个集合。初始化(Init):为每个元素创建一个独立的集合。 三、并查集的实现(简略版) 根据上面讲的原理和预期功能,我们可以先来实现一个简略版的并查集: class UnionFindSet { public: // 初始时,将数组中元素全部设置为-1 UnionFindSet(size_t size) : _ufs(size, -1) {} // 给一个元素的编号,找到该元素所在集合的名称 int FindRoot(int index) { int root=index; // 如果数组中存储的是负数,找到,否则一直继续 while (_ufs[index] >= 0) { index = _ufs[index]; } //路径压缩 while(_ufs[root]>=0) { int parent=_ufs[root]; _ufs[root]=index; x=parent; } return index; } bool Union(int x1, int x2) { int root1 = FindRoot(x1); int root2 = FindRoot(x2); // x1已经与x2在同一个集合 if (root1 == root2) return false; //优化(合并后让子树多的做根) if(abs(_ufs[root1])<abs(_ufs[root2]) swap(root1,root2); // 将两个集合中元素合并 _ufs[root1] += _ufs[root2]; // 将其中一个集合名称改变成另外一个 _ufs[root2] = root1; return true; } // 数组中负数的个数,即为集合的个数 size_t Count()const { size_t count = 0; for (auto e : _ufs) { if (e < 0) ++count; } return count; } private: vector<int> _ufs; }; 四、并查集的实现方式和优化策略 并查集有两种常见的实现方式:路径压缩和按秩合并。
随着应用功能持续增加,应用规模不断扩大,依赖的模块文件逐渐变多,应用冷启动加载模块的时间也越来越长。而在实际冷启动过程中执行了很多应用整体依赖但当前未使用的文件,此时可以通过延迟加载 lazy-import 的方法延缓对这些冗余文件的加载,使待加载文件在冷启动阶段不被加载,而在后续导出变量被真正使用时再同步加载执行文件,节省资源以提高应用冷启动性能。
lazy-import与动态加载的区别 lazy-import与动态加载都可以实现主动延后特定文件的执行时间,帮助设备均摊性能消耗,缓解特定时段性能压力的能力。
动态加载lazy-import语法示例let A = await import("./A");import lazy { A } from "./A";性能开销1.创建异步任务开销
2.执行到动态加载时,触发依赖模块的模块解析+源码执行。1.lazy-import的模块解析在冷启动依旧会触发遍历。
2.导入的变量A被使用到时,触发模块的源码执行。使用位置代码块/运行逻辑中使用需要写在源码开头是否可以运行时拼接是否加载时序异步同步 开发者在使用动态加载时,需要将静态加载的代码(同步导入)改写成动态加载语法(异步导入),修改量较大。其次如果希望通过动态加载在冷启动阶段产生优化,需要开发者明确感知被动态加载文件不会在冷启动被执行才会有收益,否则会增大冷启动开销(放入异步队列等)。相较于动态加载,使用lazy-import延迟加载,开发者只需要在import语法中增加lazy关键字就可以实现延迟加载,使用更加方便。
使用场景 下述例子中A文件被引用,在应用启动到点击按钮的这段时间里,A文件并没有被实际执行,在冷启动阶段加载A文件的行为属于冗余。源码参考
// A为任意可以被引入的ets文件 import { A } from "./A"; @Entry @Component struct Index { build() { RelativeContainer() { Button('点击执行A文件') .onClick(() => { // 点击后触发A文件的执行 console.log("执行A文件", A); }) } // ... } } 通过抓取Trace图查看调用栈可发现,应用在冷启动时加载了A文件。
使用方法 ArkTS冗余文件检测工具 在规避冗余文件时,首先需要筛选出哪些依赖文件在冷启动时未被使用,此时可以使用ArkTS冗余文件检测工具,梳理出冷启动加载过程中未被使用的文件名单。
工具使用 打开模块化日志打印打点开关,重启设备。
hdc shell param set persist.ark.properties 0x200105c hdc shell reboot 启动应用,启动结束后关闭应用。
下载文件到本地,其中${bundleName}为应用名。
目录
一、MySQL简介
1.MySQL 的主要特点包括
2.MySQL 的主要用途包括:
二、MySQL 基础命令
1. 基本操作
1.1 进入
1.2 选择数据库
1.3 修改密码
1.4 所有命令后面都要加 “;”
2. 创建
2.1 创建数据库
2.2 创建数据表
2.3 常见字段
3. 修改/更新
3.1 添加表字段
3.2 删除表字段
3.3 修改表名
3.4 修改表选项
3.5 修改表字段类型
3.6 修改表字段位置
3.7 更新数据
4. 删除
4.1 删除数据库
4.2 删除表
4.3 删除索引
4.4 删除用户
4.5 删除数据
5. 插入
5.1 插入数据
5.2 从一个表中选择数据并插入到另一个表中
6. 查看
6.1 查看数据库
6.2 查看告警
6.3 查看创建的数据库
相信搜索这个的同学代码都已经拉取到本地了,并且已经在idea中打开了。
1.一般我们从远程colone下来的代码默认是在主分支下的,也就是说我们从远程的主分支拉取的代码并且在本地创建了一个主分支。 2.一般主分支是不允许修改的,所以我们可以基于主分支创建一个自己的分支 3.我创建的自己的分支是test123 4.然后在自己的分支下进行开发,开发完之后先点击commit,选择要提交的部分 5.选择好之后,点击commit 6.点击push 7.然后我们可以到我们的代码托管平台看到自己刚刚提交的分支和代码 8.基本上一个分支的提交已经算是完成,但还有一个问题是我们开发一般是多个人进行开发的,所以我们的分支,而且我们代码拉取下来进行开发需要一段的时间,所以可能出现我们分支的代码不是最新的,可能落后了主分支几个版本,所以我们需要将主分支的代码拉取下来,更新到我们的开发分支上。 9.首先选择pull,然后选择master分支 10.然后点击右下角,在开发分支test123上选择merge ‘master’ into 'test123',这时最新的master分支的代码会自动的合并到test123上 11.选择Push,将本地分支推送到远程分支上 12.然后我们就可以到代码托管平台上看到我们刚刚的提交的合并记录了,然后点击Create merge request 就可以申请合并代码自己刚刚提交的代码到主分支上了
更多内容前往个人网站:孔乙己大叔
在现代的Web开发中,HTTP请求已经成为应用程序与外部服务交互的主要方式。随着微服务架构的流行,一个应用可能需要同时与多个外部服务进行通信,这导致HTTP请求的数量显著增加。为了提升性能和资源利用率,HTTP连接池成为了一个不可或缺的工具。本文将深入探讨HTTP连接池的优势、原理,并通过Java代码实例详细展示如何在Spring Boot项目中实现和使用HTTP连接池。
一、HTTP连接池的优势 HTTP连接池通过复用HTTP连接,极大地优化了网络请求的性能和资源利用率。具体来说,其优势包括:
减少TCP连接建立和销毁的开销:
HTTP连接池通过复用连接,避免了每次请求都进行TCP的三次握手和四次挥手过程。这显著减少了网络延迟和CPU资源消耗。
提高系统吞吐量:
连接池能够支持更高的并发请求,因为不需要为每个请求都建立新的连接。在高并发场景下,这能有效避免端口资源耗尽的问题。
优化资源利用:
自动管理TCP连接,避免了因为频繁创建和销毁连接而导致的资源浪费。
提升请求响应速度:
复用连接减少了网络延迟,使得请求的响应速度更快。
二、HTTP连接池的原理 HTTP连接池的核心思想是在客户端维护一个连接池,池中的连接可以被多个请求复用。当发起一个新的HTTP请求时,连接池会尝试从池中获取一个可用的连接。如果池中有空闲连接,则直接使用该连接发起请求;如果没有空闲连接,则根据配置的策略(如阻塞等待、拒绝请求等)处理该请求。
连接池中的连接在完成请求后会被放回池中,以供后续请求复用。连接池会定期检查并关闭那些长时间未使用的连接,以避免资源泄露。
三、在Java中实现HTTP连接池 在Java中,我们可以使用Apache HttpClient库来实现HTTP连接池。Apache HttpClient是一个功能强大的HTTP客户端,它支持HTTP/1.1和HTTP/2协议,并且提供了丰富的配置选项,包括连接池管理。
1. 添加依赖 首先,你需要在项目的pom.xml中添加Apache HttpClient和Fastjson(用于JSON处理)的依赖。这里以Maven为例:
<dependencies> <!-- Apache HttpClient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <!-- Fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> </dependencies> 注意:Fastjson版本可能因时间不同而有所变化,请根据实际情况选择适合的版本。
2. 配置HTTP连接池 接下来,我们需要在Spring Boot项目中配置HTTP连接池。这通常涉及到创建一个配置类,用于设置连接池的各种参数,如最大连接数、连接超时时间等。
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.ssl.SSLContexts; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.util.RegistryBuilder; import org.apache.http.impl.conn.Registry; import org.
文章目录 1 go语言并发编程学习-mutex1.1 学习过程1.2 如何解决资源并发访问的问题?【基本用法】1.2.1 并发访问带来的问题1.2.1.1 导致问题的原因 1.2.2 race detector检查data race1.2.3 mutex的基本实现机制以及使用方法1.2.3.1 具体使用-11.2.3.1 具体使用-2 1 go语言并发编程学习-mutex 1.1 学习过程 1.2 如何解决资源并发访问的问题?【基本用法】 本小节主要为了解答以下问题:
为什么需要解决并发访问的问题?怎么通过race detector来查找程序中的data race?mutex的基本机制和基本使用方法? 1.2.1 并发访问带来的问题 1. 多个goroutine并发更新计数器
在多个goroutine的情况下并发更新计数器,得到的值可能不符合预期。
package main import ( "fmt" "sync" ) var counter int var wg sync.WaitGroup func increment() { defer wg.Done() counter += 100 } func main() { wg.Add(1000) // 这个可以先不管,理解为,main函数需要等待goroutine都执行完才能退出,可以把wg相关全去掉,在main函数后面加上time.sleep(time.second * 10) for i := 0; i < 1000; i++ { go increment() } wg.
哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你的工作效率翻倍?是智能的代码编辑器,强大的版本控制工具,还是那些让你事半功倍的自动化脚本?让我们一起分享、探讨,找到能让效率飞升的秘密武器。
提醒:在发布作品前,请将不需要的内容删除。
方向一:工具介绍
0 编程语言和开发工具蓬勃发展 随着计算机软件、硬件的不断发展,计算机网络的不断完善,特别是云计算和大数据技术的发展,编程语言和开发工具也持续更新,以不断适应新的需求,并让编程变得更加高效和易用,同时也为程序员提供了更多的选择和灵活性。例如,Python和R语言在数据科学领域获得了广泛应用;Docker和Kubernetes等容器技术为应用部署和管理提供了更便捷的方式。
一方面,随着运算能力的提升,特别是人工智能和机器学习的决然兴起和持续演进,脚本语言以其具有简洁、易学和灵活的特点,在一些快速开发和脚本任务中得到了广泛应用。Python、JavaScript和Ruby等脚本语言在各自领域中发展迅速,并成为非常受欢迎的编程语言。
另一方面,虽然面向对象编程(OOP)已经成为主流的编程范式,许多高级编程语言提都支持面向对象的特性。OOP 提供了封装、继承和多态等核心概念,使得程序员能够更好地组织和管理代码,但有时候需要使用低级语言进行更底层的控制。C语言和汇编语言仍然在一些领域中被广泛使用,如嵌入式系统和操作系统开发。
目前我最喜欢也最常用的编程语言和开发工具是MASM32 和 HTML & JavaScript。
1 MASM32:宝刀不老,历史弥香 MASM32使用微软汇编语言(MASM)作为主要的编程语言,并提供一系列的库和工具,方便开发者编写和调试汇编语言程序。MASM32支持32位和64位的Windows操作系统,并提供了丰富的API接口,可以访问操作系统的各种功能和资源。MASM32被广泛应用于系统级编程、驱动程序开发、嵌入式系统开发等领域。
2 HTML & JavaScript:无处不在,应用方便 HTML (Hypertext Markup Language) 是一种用于创建网页的标准标记语言。它包含一系列标签,用于标识和描述网页的结构和内容。作为创建Web页面的标记语言,HTML 定义了网页的结构和内容。几乎所有的网页都使用HTML来呈现和组织信息。
JavaScript 是一种用于在网页上添加交互性和动态特性的编程语言。它可以在网页上添加各种功能,如表单验证、动画效果、图像轮播、数据交互等等。JavaScript可以直接嵌入到HTML中,或者作为外部脚本文件引用。它可以通过网页上的脚本标签嵌入到HTML文档中,并与HTML和CSS一起使用。
HTML和JavaScript经常一起使用,以在网页上创建丰富的用户界面和功能。通过JavaScript,可以对网页上的元素进行操作和修改,响应用户的交互,并与后端服务器进行通信,实现动态数据的加载和更新等。
总的来说,HTML和JavaScript是Web开发中无处不在的两个技术,它们的使用范围非常广泛,几乎涵盖了整个互联网和移动应用的开发。
更为重要的是,所有的浏览器都支持HTML和JavaScript,不需要额外部署、安装、配置和调试,HTML和JavaScript代码拿来就能运行。
3 用 HTML & JavaScript 加速MASM32编程开发 我喜欢用MASM32编写Windows应用程序。MASM32内置的QEDITOR提供了比较完善的开发环境,集成了不少实用功能,但有些功能还是不够完备善,于是我就用 HTML & JavaScript 编程一些小程序来补充和完善,从而提升开展效率。
3.1 用HTML+JavaScript编程 实现 ANSI字符串转换为UniCode(WCHAR)字符串 MASM32 在QEDITOR 的 Conversions里提供了Text to DW UNICODE菜单项功能,可以将ANSI字符串转换为UniCode(WCHAR)字符串,不过这个菜单项还不能实现自动从类中提出成员属性名称并转换为MASM32的DW UNICODE字符串的格式,所以我们还是先得手工将AccountType、Caption……提取出来。成员少还行,成员多的话就太麻烦了。
于是我就用HTML+JavaScript写了一个简单的转换工具。
详见:
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具_javascript ansi2html-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/132238613
3.2 用HTML+JavaScript编程 实现 C++类定义 转换为 MASM32 定义 在使用MASM32编写Windows应用程序时,经常要调用Windows API接口函数 和 相应的数据结构,这些数据结构中有很多是类(Class),对于那些在MASM32没有定义的类,我们需要自己来转换。如果类定义中的成员数量少手工转换还行,成员多的话就太麻烦了。
多媒体信息共享平台
目录
基于SprinBoot+vue的多媒体信息共享平台
一、前言
二、系统设计
三、系统功能设计 系统前台功能模块
后台模块实现
四、数据库设计
五、核心代码 六、论文参考
七、最新计算机毕设选题推荐
八、源码获取:
博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️
主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。
🍅文末获取源码联系🍅
基于SprinBoot+vue的多媒体信息共享平台 一、前言 多媒体信息共享管理方式缺点逐渐暴露,对过去的武理多媒体信息共享管理方式的缺点进行分析,采取计算机方式构建武理多媒体信息共享系统。本文通过阅读相关文献,研究国内外相关技术,提出了一种以作品信息管理与信息共享于一体的系统构建方案。
本文通过采用B/S架构,springboot框架以及MySQL数据库技术,结合国内武理多媒体信息共享系统现状,开发了一个武理多媒体信息共享平台。多媒体信息共享平台分为个人中心、用户管理、作品分类管理、作品信息管理、私聊信息管理、系统管理等功能模块。通过系统测试,多媒体信息共享平台实现了系统设计目标,相对于人工管理方式,多媒体信息共享平台有效的减少了武理多媒体信息共享管理的经济投入,并且大幅度提升了武理多媒体信息共享管理的效率。
关键词:武理多媒体信息共享;springboot;MySQL数据库
二、系统设计 系统功能结构图
三、系统功能设计 系统前台功能模块 当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到武理多媒体信息共享平台的导航条,通过导航条导航进入各功能展示页面进行操作。系统首页界面如图5-1所示:
图5-1 系统首页界面
后台模块实现 后台用户登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。 图5-6后台登录界面
管理员模块实现
管理员进入主页面,主要功能包括对个人中心、用户管理、作品分类管理、作品信息管理、私聊信息管理、系统管理等进行操作。管理员主界面如图5-7所示:
图5-7管理员主界面
用户后台管理模块实现
用户进入系统后台可以对系统首页、个人中心、作品信息管理、私聊信息管理等功能进行操作。用户后台管理主界面如图5-12所示:
图5-12用户后台管理主界面
四、数据库设计 商品信息实体如图4-2所示。
图4-2商品信息实体属性图
数据库表的设计,如下表:
用户表
字段名称
类型
长度
字段说明
主键
默认值
id
bigint
主键
主键
username
varchar
100
用户名
password
varchar
100
密码
role
varchar
100
角色
管理员
addtime
timestamp
新增时间
CURRENT_TIMESTAMP
文章目录 Xcode安装及iphone模拟器的安装Xcode中Debug和Release的切换Xcode中控件的使用Xcode工程的基本组成Xcode UI基本设计及使用iOS开发项目中的日志系统静态库支持多种架构制作xcframeworklibuv库Xcode路径.pbxproj文件苹果平台的宏Leaks检测内存泄漏OC中的ARC和MRC小结 Xcode安装及iphone模拟器的安装 参考文章:
Xcode15离线安装各平台模拟器
Xcode15 安装iOS17模拟器 报错Could not download iOS
XCode的下载路径
Xcode中Debug和Release的切换 iOS开发技巧:使用Xcode DEBUG模式和RELEASE模式
Xcode中控件的使用 xcode没有显示控件区域(右下角控件显示区域不见了)
Xcode工程的基本组成 Xcode下熟练storyboard、xib等界面开发(新手)
其中AppDelegate里面有程序的入口用于初始化,而AppDelegate是在不断循环的程序和我们的代码之间进行通讯,AppDelegate对象是作为Application对象的委托属性还声明了一个NSwindow*window 的XIB文件的IBOutlet输出变量 这就让AppDelegate可以直接对window做一些操作 比如说windows的背景颜色等。ViewController就是UI界面的实现,所有的控件的具体实现都可以放在这里。Assets主要对工程中使用的图片资源进行统一管理,info里面是工程的配置文件,主要是对工程的一些配置进行设置。
Xcode UI基本设计及使用 Xcode9学习笔记24 - 文本标签的使用UILabel
Xcode使用介绍之二:创建UI界面+连线
ios快速入门教程4
iOS开发项目中的日志系统 如何使用os_log在Console应用程序中查看iOS设备日志
OSLog与NSLog,OSLog的实践
iOS输出日志到Console.app
静态库支持多种架构 判断IOS静态库(.a文件)是否支持模拟器和真机运行
制作xcframework 使用 Xcode 制作 Framework 与 XCFramework
XCFramework:一种跨平台的二进制库分发解决方案
libuv库 https://github.com/xtx1130/blog/issues/36
Xcode路径 ( S R C R O O T ) 和 (SRCROOT)和 (SRCROOT)和(PROJECT_DIR)和 ( i n h e r i t e d ) 和 (inherited)和 (inherited)和{PODS_ROOT}
在 Linux 系统中,.bashrc, .bash_profile, .profile 和 /etc/profile 这几个文件都有各自的用途,它们在不同的场景下被加载和执行。下面是对这几个文件的区别和作用的详细介绍:
1. ~/.bashrc 描述:这个文件是针对每个用户的 bash shell 的个人配置文件。加载时机:每当用户打开一个新的交互式终端窗口(或标签页)时,~/.bashrc 就会被读取并执行一次。用途:通常用于设置个人的环境变量、别名定义、shell 函数以及其他个性化配置。示例内容:# Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions alias ll='ls -l' 2. ~/.bash_profile 描述:也是针对每个用户的 bash shell 的个人配置文件,但是它的加载优先级高于 ~/.bashrc。加载时机:在用户登录系统时被读取和执行一次。用途:通常用于设置全局环境变量,例如 JAVA_HOME、PATH 等。示例内容:# Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH 3.
档案管理系统
基于SprinBoot+vue的档案管理系统
一、前言
二、系统设计
三、系统功能设计 管理员功能模块实现
学生功能模块实现
四、数据库设计
五、核心代码 六、论文参考
七、最新计算机毕设选题推荐
八、源码获取:
博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️
主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。
🍅文末获取源码联系🍅
基于SprinBoot+vue的档案管理系统 一、前言 本文聚焦于“档案”及“档案管理系统”的核心领域,旨在设计和开发一套高效、实用的档案管理系统。该系统以Java作为核心开发语言,充分利用其跨平台、面向对象等特性,确保档案管理系统的稳定性和可扩展性。同时,选择MySQL作为后台数据库,凭借其强大的数据存储和处理能力,有效保障档案数据的安全性和完整性。在系统架构上,采用B/S(浏览器/服务器)模式,实现用户界面的友好性和操作便捷性,极大提升用户体验。
通过档案管理系统的应用,可显著减少传统档案管理中的人力、物力投入,有效降低运营成本。同时,系统提供的自动化、智能化管理功能,如档案分类、检索、统计等,极大提高档案管理效率,使档案管理人员能够更专注于档案价值的挖掘和利用。综上所述,本档案管理系统在设计理念、技术选型及实际应用效果上均表现出色,为现代档案管理提供了一种创新、高效的解决方案。
关键词:Java;档案;
二、系统设计 系统功能结构图
三、系统功能设计 管理员功能模块实现 管理员进入主页面,主要功能包括对系统首页,个人中心,学生管理,学生档案管理,归档审核管理,归档建目管理,档案入库管理,申请借阅管理,归还档案管理,申请修改管理等功能进行操作。管理员主页面如图5-1所示:
图5-1 管理员主界面
学生功能模块实现 学生进入主页面,主要功能包括系统首页,个人中心,学生档案管理,归档审核管理,归档建目管理,档案入库管理,申请借阅管理,归还档案管理,申请修改管理等。学生主页面如图5-8所示:
图5-8 学生主界面
四、数据库设计 申请修改实体属性如图4-2所示。
图4-2申请修改实体属性图
数据库表的设计,如下表:
配置文件表
字段名称
类型
长度
字段说明
主键
默认值
id
bigint
主键
主键
name
varchar
100
配置参数名称
value
varchar
100
配置参数值
五、核心代码 package com.service.impl; import com.utils.StringUtil; import com.service.DictionaryService; import com.utils.ClazzDiff; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.
引言 随机数生成在计算机科学中是一个关键过程,尤其在安全性要求高的领域,如密码学中,随机数的质量直接影响系统的安全性。生成高质量的随机数不仅依赖于算法,还与熵源(entropy source)的选择密切相关。本文将深入探讨随机数生成的核心技术,包括熵源的作用、计算方式、常见的随机数生成器及其不足,最终详细解释如何生成符合密码学安全要求的随机数。
1. 什么是随机数? 随机数是一种在预定范围内无法提前预测的数值。在计算机科学中,随机数广泛应用于各种场景,包括加密、模拟、统计分析和游戏开发等。然而,由于计算机系统的本质是确定性的,生成真正的随机数非常困难。因此,大多数计算机系统依赖于伪随机数生成算法(Pseudo-Random Number Generator, PRNG)来模拟随机性。
随机数可以大致分为两类:真随机数(True Random Number, TRNG)和伪随机数(Pseudo-Random Number, PRNG)。这两类随机数在生成方式、适用场景以及安全性上有显著区别。
1.1. 真随机数 真随机数(TRNG)通过测量物理现象中的固有随机性生成,这些现象包括放射性衰变、热噪声和电磁干扰等。由于这些物理过程的复杂性和不可预测性,生成的数值序列是真正随机的,没有任何规律可循,因此具有高度的不可预测性。典型的TRNG依赖硬件设备,通过采集放射性粒子的撞击次数、热电阻的电子热运动产生的噪声或光子的随机散射,将这些物理现象转换为数字信号,经过数字化处理生成高质量的真随机数。由于其不可预测性,真随机数在加密密钥生成、数字签名、硬件安全模块以及高安全性的通信协议等安全性要求极高的领域中得到了广泛应用。
1.2. 伪随机数 伪随机数(PRNG)是通过算法生成的数值序列,虽然这些数值看似随机,但实际上是由确定性数学函数生成的,这意味着如果了解生成算法和初始种子(即输入值),理论上可以完全预测整个随机数序列。伪随机数的生成是确定性的,因此在相同的种子和算法条件下,每次生成的序列都会相同。尽管如此,优秀的PRNG能够生成在统计上难以区分于真正随机数的序列,足以满足许多应用场景的需求。PRNG通常基于复杂的数学算法,如线性同余生成器(LCG)或梅森旋转算法(Mersenne Twister),从一个初始种子出发,通过一系列数学操作生成一个近似随机的数值序列。由于生成速度快且实现简单,PRNG被广泛应用于需要大量随机数的领域,如模拟、游戏开发、统计计算和随机抽样等。然而,由于其可预测性,PRNG在安全性要求高的场景(如加密密钥生成)中的应用受到限制。
1.3.为什么真随机数重要? 在涉及到安全性时,随机数的不可预测性是至关重要的。如果攻击者能够预测随机数的序列,就可以破坏整个系统的安全性。例如,如果加密密钥是由可预测的伪随机数生成的,攻击者可以利用这种弱点进行暴力破解或其他攻击手段。因此,在这些场景下,使用真随机数生成器(TRNG)可以有效提升系统的安全性。
1.4. 伪随机数的优势与局限 伪随机数生成器(PRNG)生成速度快且计算效率高,这对于需要大量随机数的应用,如模拟、游戏开发和统计计算等,非常有利。PRNG的实现相对简单,只需要初始化一个种子,然后通过数学算法生成一系列随机数,这使得它们易于部署和使用。在调试和重复实验时,可以通过使用相同的种子来生成相同的随机数序列,这有助于重现实验结果。
然而,PRNG的这些优势也伴随着一些局限性。可预测性是一个主要问题,如果种子值被泄露或推测,攻击者可以重现整个伪随机数序列,从而破坏系统的安全性。另一个局限是周期性,许多PRNG都有固定的周期性,即在生成一定数量的随机数后,序列会开始重复,这在某些情况下可能导致问题,特别是在需要生成非常长的随机序列时。
因此,尽管PRNG在效率和使用便利性方面具有明显的优势,开发者在设计安全系统时仍需谨慎选择。在大多数日常应用中,PRNG已经足够满足需求,但在高安全性领域,如加密密钥生成和敏感数据保护,真随机数生成器(TRNG)通常是更为可靠的选择,因其能够提供更高的不可预测性和安全性。
2. Java中的随机数生成方法 Java 提供了几种生成随机数的方法,主要包括 java.util.Random 和 java.security.SecureRandom。它们在实现方式和适用场景上有所不同。
2.1. java.util.Random Random类使用线性同余生成器(Linear Congruential Generator, LCG)算法,这是一个简单而高效的伪随机数生成方法。其核心是通过以下公式进行生成:
Xn+1=(aXn+c) mod m
其中:
Xo 是种子a 和 c 是算法常量m 是模 具体事例代码如下:
import java.util.Random; public class RandomExample { public static void main(String[] args) { Random random = new Random(); int randomInt = random.
要了解一个软件工程项目的代码,必须从代码的目录结构入手,从而大致了解软件实现的功能模块,使用了哪些相关的技术,大概的框架是怎么样的?
源码网址:https://github.com/ethereum/go-ethereum
以下是以太坊源码目录结构和相关说明
.
├── accounts //账户管理相关的代码,处理账户的创建、密钥管理等
├── appveyor.yml //持续集成(CI)配置文件,用于构建和测试以太坊客户端(Geth)不同版本
├── AUTHORS //列出了项目的作者
├── beacon //以太坊 2.0 的信标链(Beacon Chain)相关的模块或代码部分
├── build //代码编译构建结果存放的目录
├── circle.yml //一种持续集成和持续部署服务的配置文件
├── cmd //包含命令行工具的实现,用于启动和管理以太坊节点等操作
├── common //通用数据类型和工具
├── consensus //共识算法的实现,用于确定区块链上的有效区块.
├── console //与以太坊客户端的交互控制台相关
├── COPYING //开源许可证文件
├── COPYING.LESSER //开源许可证文件
├── core //以太坊区块链的核心部分,包括区块处理、交易管理、状态转换等
├── crypto //加密相关的功能,如哈希函数、数字签名等
├── Dockerfile //一个用于构建以太坊容器镜像的配置文件
├── Dockerfile.alltools //用于构建包含所有相关工具的特殊 Docker 镜像的配置文件
├── docs //文档相关的文件和目录
├── eth //以太坊协议相关的主要实现模块
├── ethclient //用于与以太坊节点进行交互的客户端接口
├── ethdb //以太坊数据库的实现,用于存储区块链数据和状态
1.列表---list 索引的使用 当我们有一个数据的时候,我们怎么将这个数据存储到程序呢?
我们定义一个变量,将数据存储在变量中
那么如果有100个数据呢?要定义100个变量吗?
我们是可以用列表这个东西进行多个数据的存放
列表的定义:[ ]
空列表:[ ]
列表:[元素1,元素2,元素3 ]
列表中的内容叫做元素,元素与元素之间要用逗号进行分隔
#编辑模式 li=[]#空列表 print(type(li)) #交互模式 <class 'list'>#列表的意思 存放多个数据的列表:
li=[1234,'abcd',12.45] print(type(li)) 那么我们现在如何从这个列表里面拿取我们想要的元素呢?
我们可以通过列表的索引来取得对应位置上的值
使用方式:列表序列[索引]
注意:
1.索引值是从0开始的
2.负索引值就是从列表尾部往前数
3.索引取值超过长度就会报错
这个索引在C/C++中就是下标
列表对应C/C++就是数组
索引值的使用方式:
#编辑模式 li=[1234,'abcd',12.45] print(type(li)) print(li[0]) print(li[1]) print(li[2]) #交互模式 <class 'list'> 1234 abcd 12.45 除了正索引我们还有负索引
负索引是怎么使用的呢?
我们是从右往左开始进行的
如果使用负索引的话,最右边的下标是-1
然后从左到右一次减小1位
负索引的使用:
#编辑模式: li=[1234,'abcd',12.45] print(type(li)) print("正索引") print(li[0]) print(li[1]) print(li[2]) print("负索引") print(li[-1]) print(li[-2]) print(li[-3]) #交互模式 正索引 1234 abcd 12.45 负索引 12.45 abcd 1234 正索引:从左往右(从0开始,依次变大)