- 博客(53)
- 收藏
- 关注
原创 Jupyter使用教程
首先确认已安装python环境,已安装pip然后使用pip安装Jupyter Notebook安装完成后检查确认安装无误。
2026-08-10 13:20:58
257
1
原创 github教程之多人协作
进入GitHub首页,点击右上角的‘+’号,选择“New repository”编辑仓库信息后点击“Create repository”完成远程仓库的建立.
2026-08-07 10:54:25
298
原创 PostgreSQL
我们在 VScode 这边建立一个查询然后使用 WSL 的 PostgreSQL命令行 查看对照,看看可不可用。最后,点击 测试联机 -> 成功 -> 点击保存并连接 -> 绿点成功。表示已进入数据库命令行可以执行操作,想退出便输入。我们先创建一个 测试用户 和相应的 测试数据库。如图:把之前设的 用户密码啥的 填进去。我们输入一个建表的 SQL 命令。点击 绿色小三角 运行 ->-> 找到官方发布的扩展。点击安装 -> 安装完毕。惊喜发现确实有一张表叫。两条命令的意思如下,-> 服务器新建连接。
2026-07-13 17:21:27
236
原创 消息队列之Kafka(一)搭建服务
最后:Kafka集群中的这些Broker信息,包括Partiton的选举信息,都会保存在额外部署的Zookeper集群当中,这样,kaka集群就不会因为某一些Broker服务崩溃而中断。Kaka是面向海量消息设计的,一个Topic下的消息会非常多,单机服务很难存得下来。1、Kaika设计需要支持海量的数据,而这样庞大的数据量,一个broker是存不下的。但是,在实际工作中使用时,单机搭建的Kafka会有很大的局限性。,给每个Paniion选举出一个主节点Leader,其他节点就是从节点Folower。
2026-02-12 16:07:46
852
2
原创 消息队列之RabbitMQ
消息转移到死信队列过程中,是没有确认机制的,所以是不安全的。消息在转移到死信队列之后会在headers里面增加一些信息,来表明这是一条死信消息。
2026-02-10 17:05:39
941
原创 MySql(四)慢查询与mysql优化
慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time(默认的时间10秒)参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是关闭的,要使用慢查询日志功能,首先要开启慢查询日志功能。
2026-02-08 10:26:40
843
原创 MySql(三)事务与锁
数据库的是一种机制、一个操作序列,包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行,因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时,事务是作为最小的控制单元来使用的,特别适用于多用户同时操作的数据库系统。
2026-02-08 09:14:58
844
原创 MySql(二)索引
where、join、 order by 、group by去建立索引。索引个数不要过度。散列度低的字段,不要建立索引。随机无序或频繁更新的值,不适合作为主键,推荐使用递增的ID作为主键索引:因为如果你是递增的话,在叶子结点上放数据直接按顺序往后面放就行,但是如果你是无序的就可能会出现数据页的分裂和合并创建联合索引避免冗余索引1.索引列上使用函数、表达式、运算符。2.出现类型隐式转换,例如:字符串忘记编写引号。3.like条件字符前面带% (最左前缀)(不一定)负向查询<>!
2026-02-07 17:33:13
1003
原创 MySql(一)相关架构与底层执行逻辑
首先明确mysql读取数据的一页为16kb,每次读取的数据数量是整数页。mysql想完成数据的修改,会先从存储引擎层读取数据,把数据读取到服务层进行数据的修改,再通过存储引擎层把数据更新到数据库中。2.1buffer pool缓冲区在innodb引擎中设计了 buffer pool 缓冲区。Mysql从磁盘中通过IO读取数据到buffer pool中,引擎从bffer pool中获取数据,然后修改,再把数据写入到buffer pool中。从而完成读写的操作,因为是基于内存。
2026-02-07 17:11:07
965
原创 Spring Boot(三)Spring Boot整合SpringMVC
负责 HTTP 请求 / 响应的序列化与反序列化(如 JSON、XML、表单数据),Spring Boot 自动配置主流转换器。打开application.properties, 默认限制是10MB。当我们做文件上传的时候我们也会发现。文件上传大小可以通过配置来修改。
2026-02-06 16:20:44
437
原创 java并发编程(七)ReentrantReadWriteLock
判断是否有写锁:是,且不是我:失败,转入第 2 阶段。是,且是我(锁降级):通过,继续。否:通过,继续。判断是否需要阻塞(readerShouldBlock())上一步判断了没有写锁,为什么阻塞的时候要再判断写锁在队首?因为如果不判断直接加锁,那么在队首的写者就会一直等待,导致写饥饿是(公平锁有人排队 / 非公平锁写者在队首):失败,转入第 2 阶段。否:通过,继续。CAS 尝试成功加锁成功!流程结束。失败(有竞争):转入第 2 阶段。
2026-02-03 21:08:34
782
原创 java并发编程(六)CountDownLatch和回环屏障CyclicBarrier
使用线程池来管理线程时一般都是直接添加Runable到线程池,这时候就没有办法再调用线程的join方法了,就是说countDownLatch相比join方法让我们对线程同步有更灵活的控制。如果 state!AQS 收到 true 后,调用 doReleaseShared() 唤醒同步队列中所有因为 await() 而阻塞的线程。await() 调用 AQS 的 acquireSharedInterruptibly(1)。countDown() 调用 AQS 的 releaseShared(1)。
2026-02-01 09:57:00
437
原创 redis(四)搭建哨兵模式:一主二从三哨兵
哨兵主要完成:故障监控->故障转移->通知客户端哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点就是特殊的redis节点,不存储数据数据节点:主节点和从节点都是数据节点。
2026-01-31 17:18:39
1268
原创 redis(三)redis持久化和集群(redis版本:5.0.4)
AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof。因为 AOF 日志记录的是操作命令, 不是实际的数据,所以用 AOF 方法做故障恢复时,需要全 量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。记录某一个瞬间的内存数据,记录的是实际数据, 而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
2026-01-30 19:02:54
730
原创 docker(三)具体项目的部署
1.在本地创建两个配置文件(具体可以看springboot那一篇的多配置文件),mysql配置的时候不要写死,而是从生产/本地环境去读取参数。而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。project就是当前compose文件中设置的多个service的集合,是逻辑概念。我们现在要做的就是把整个nginx目录上传到虚拟机的。在指定的运行中容器中执行命令。
2026-01-27 10:02:12
581
原创 docker(二)docker基础
自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。举个例子,我们要从0部署一个Java应用,大概流程是这样:准备一个linux服务(CentOS或者Ubuntu均可)安装并配置JDK上传Jar包运行jar包那因此,我们打包镜像也是分成这么几步:准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)安装并配置JDK拷贝jar包配置启动脚本。
2026-01-26 17:48:57
1068
原创 docker(一)安装与快速入门
Docker服务部署应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并允许容器,应用就部署完成了。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了。容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;,示例中就是将宿主机的3306映射到容器内的3306端口,当你访问宿主机的端口,就会映射到容器内对应的接口。,当访问宿主机指定端口时,就是在访问容器内的端口了。的情况下,默认是最新版本,也就是。:创建并运行一个容器,
2026-01-26 15:37:58
401
原创 nginx(三)反向代理实例
首先浏览器根据域名www.123.com找到对应的ip 62.234.46.21,默认访问80端口,所以Nginx 会根据。(1)在windows的C盘,windows/system32/drivers/etc找到hosts文件,添加下面的内容。匹配,匹配到对应的server块之后,找到proxy_pass地址,转发到对应的服务器。实现效果:浏览器访问www.123.com跳转到tomcat的主页面。(2)在nginx进行请求转发的配置(反向代理的配置)
2026-01-26 11:43:06
355
原创 Spring Boot(二)模版引擎
模板引擎(Template Engine)是连接「数据」和「静态页面」的中间件你有一个「静态页面模板」(比如),里面留了一些「占位符」(比如${hello}你有一些动态数据(比如 Controller 里的"zhangsan"模板引擎会把「动态数据」填充到「占位符」里,最终生成一个完整的、可直接展示的 HTML 页面返回给浏览器。常用的模板引擎:JSPVelocityFreemarkerThymeleaf我们使用Thymeleaf页面结构写在html里(前端语法);
2026-01-25 17:23:30
1160
原创 nginx(一)nginx简介
高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强专为性能优化开发,性能是最重要的考量,实现上注重效率,能经受高负载的考验。
2026-01-25 14:36:34
486
原创 LeetCode Hot100(一)二分查找
当 nums [mid] <= target 时,mid 当前位置满足条件,是潜在候选。为了找到可能更靠右的答案,因此,更新 left = mid + 1。当 nums [mid] > target 时,mid 当前位置不满足条件,可以排除,mid 位于待查找区间的右侧。因此,更新 right。解法一,返回边界 right由于 mid 满足条件时,总是更新 left,试图寻找更靠右的满足条件的答案,因此,当循环终止时,left 位置一定不满足条件。
2026-01-25 11:33:06
1156
原创 java并发编程(四)可重入锁的基础
Thread-0获取到自己的第一个锁lock1,Thread-1获取到自己的第一个锁lock2,这个时候Thread-0尝试获取到自己的第二个锁lock2,但是此时lock2被Thread-1占用,所以他会释放自己的第一个锁lock1,这个时候Thread-1尝试获取到自己的第二个锁lock1,因为Thread-0释放了自己的第一个锁lock1,所以Thread-1成功获取到所有的锁并正常结束。**被中断的线程将抛出异常,释放锁,而另一个线程将能获取锁后正常结束。, 只允许线程互斥的访问临界区。
2026-01-24 18:19:28
1186
原创 Redis(一)redis的下载安装与使用
判断是否安装了gcc环境,如果GCC已安装,此命令将输出GCC的版本信息。使用下面的命令进行安装。创建多个redis目录,以端口号命名,比如:创建6379、6380两个目录,将redis的安装文件bin和conf中文件拷贝至这两个目录。将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。修改redis.conf配置文件, daemonize yes 以后端模式启动,需要使用配置文件启动。修改6379目录下的redis.conf设置端口号为6379。
2026-01-24 17:06:09
547
原创 Redis(二)数据类型
c语言对字符串的存储是使用字符数组,遇到’\0’字符则认为字符串结束,redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的。,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
2026-01-24 16:39:12
875
原创 Spring Boot(一)配置文件
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件。的application-{profile}.properties或application.yml(带spring.profile)配置文件。的application-{profile}.properties或application.yml(带spring.profile)配置文件。高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
2026-01-24 14:10:02
1003
原创 langchain4j(四)MCP调用工具
如果需要让ChatModel或AI service运行由MCP服务器提供的工具,则需要创建一个MCP tool provider。一个 ToolProvider 只包一个 MCP,所以如果你有多个MCP,就需要创建多个ToolProvider。如果有多个工具,需要使用AiServices.builder,所以原来的@AiServices注解就不需要了。MCP是在Function Calling基础上的标准化工具调用流程。先要构建一个 MCP 通信方式的实例。
2026-01-22 19:13:45
1171
2
原创 java并发编程(三)CAS
锁在并发处理中占据了一席之地,但是使用锁有一个不好的地方,就是当一个线程没有获取到锁时会被阻塞挂起,这会导致线程上下文的切换和重新调度开销。Java提供了非阻塞的volatile关键字来解决共享变量的可见性问题,这在一定程度上弥补了锁带来的开销问题,但是volatile只能保证共享变量的可见性,不能解决读一改一写等的原子性问题。CAS即CompareandSwap,其是JDK提供的非阻塞原子性操作,它通过硬件保证了比较一更新操作的原子性。
2026-01-20 14:26:48
798
原创 java并发编程(二)synchronized+volatile
图中所示是一个双核CPU系统架构,每个核有自己的控制器和运算器,其中控制器包含一组寄存器和操作控制器,运算器执行算术逻辑运算。这三个操作,第一步(a=1)和第二步(b=2)由于不存在数据依赖关系,所以可能会发生重排序,但是c=a+b这个操作是不会被重排序的,因为需要保证最终的结果一定是c=a+b=3。我们使用上图所示CPU架构,假设线程A和线程B使用不同CPU执行,并且当前两级Cache都为空,那么这时候由于Cache的存在,将会导致内存不可见问题,具体看下面的分析。中,当线程使用变量时,会。
2026-01-19 11:55:13
808
原创 单例模式的实现
假设当13执行完,2还未执行时,如果另外一个线程调用getInstance(),会在判断对象是否为null时返回false(因为3已执行,对象指向了内存空间,已不为空),然后直接返回实例。线程 B:之前在锁外等待 → 线程 A 释放锁后,线程 B 拿到锁 → 执行内层if(此时 obj 已经被线程 A 创建,不为 null)→ 直接退出同步块,不会重复创建实例。由于类加载时就实例化对象,因此当我们调用这个类的其它静态方法时,可能并不需要实例对象,也会触发类加载,从而实例化单例独享,会导致空间的暂时浪费。
2026-01-19 09:39:27
454
原创 java并发编程(一)ThreadLocal
使用InheritableThreadLocal创建实例的话,子线程能输出主线程的值,但是如果使用ThreadLocal创建实例的话,子线程不能输出主线程的值。ThreadLocalMap是一个定制化的Hashmap,他的键是ThreadLocal 实例,值是你set后面的值。第一个线程remove之后再get,输出的是null,说明第二个线程设置的值访问不到,不是共享的。为thread 线程,而这里调用set 方法设置线程变量的是main线程,两者是不同的线程,自。它是一个泛型类,本身不存储数据,
2026-01-18 14:44:38
845
原创 Langchain4j(三)Tools工具
这里需要注意的是由于在一次任务的处理过程中可能需要根据顺序调用多个函数,所以当大模型接收到AI应用发送的数据继续拆解任务,如果发现还需要调用其他的函数,则会重复4.1~4.4这几个步骤,直到无需调用函数,最终把生成的结果响应该AI应用,并由AI应用发送给用户。在咱们的AI志愿填报顾问中,将来要做这么一个功能,每次回答完用户的问题后,都会在答案的最后附上这么一句话: 志愿填报需要考虑的因素有很多,如果要得到专业的志愿填报指导,建议您预约一个一对一的指导服务,是否需要预约?使用图形化界面新建Mysql连接。
2026-01-17 14:05:13
544
原创 Langchain4j(一)会话功能
在CommonConfig类中,构建MessageWindowChatMemory对象,并注入到IOC容器中。构建的时候我们可以指定该对象中最大的会话存储数量,一般设置20就足够了。@Bean.maxMessages(20)//最大保存的会话记录数量.build();LangChain4j中提供了一个类,将来LangChain4j如果从容器中没有找到指定id的ChatMemory对象,就会调用ChatMemoryProvider对象的get方法获取一个新的ChatMemory对象。
2026-01-16 19:32:24
1005
原创 大模型的部署与调用
在ApiFox配置参数,使用post请求方式,输入url,-d后面的就是我们需要写的请求体json格式内容,里面的content可以自行修改,就是你想问的问题。:下载Ollama,在官网选择你想使用的模型和版本,点击模型的名称,来到该模型的详情页面,并赋值右上角的命令。百炼平台对于大模型API的使用,给出了详细的参考文档,其中就包括http方式的调用,大家可以点击目标模型下方的API参考,查看详细的文档。: 发送给模型的数据,模型会根据这些数据给出合适的响应。- message: 本次调用模型输出的消息。
2026-01-16 16:10:42
927
原创 多线程(三)中断
来占有CPU的,正常情况下当一个线程把分配给自己的时间片使用完后,线程调度器才会进行下一轮的线程调度,(时间片用完,不一定run能运行结束)**而当一个线程调用了Thread类的静态方法yield时,是在告诉线程调度器自己占有的时间片中还没有使用完的部分自己不想使用了,这暗示线程调度器现在就可以进行下一轮的线程调度。:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupt()方法来设置线程A的中断标志为true并立即返回。Java中的线程中断是一种线程间的协作模式,只是设置线程的。
2026-01-15 17:07:59
938
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅