- 博客(41)
- 收藏
- 关注
原创 LLM接入方式
最主流,最便捷的接入方式,通过 HTTP 请求,直接调用 部署在 云端的服务。此时就可以通过 接口使用 LLM 了。1.搜索 deepseek。1.下载 openai 库。1.API 远程调用。3.开源模型本地部署。
2026-03-21 18:35:27
13
原创 Redis 缓存穿透/缓存雪崩/缓存击穿问题
缓存预热-->就是用来解决上述问题的:将定时生成 和 实时生成 相结合--先在离线的情况下,先把热点数据导入到 redis 中,此时 导入的这些热点数据,就能帮 mysql 承担很大的压力,随着时间的推移,逐渐使用新的热点数据,淘汰掉旧的数据;当客户端发起请求时,所有的请求,都会访问 mysql 随着时间的推移,redis 上的 数据越来越多,mysql 承担的压力就会逐渐减小。相当于缓存雪崩的特殊情况,针对热点 key 突然过期了,导致大量的请求直接访问到数据库上,甚至引起数据库当即。
2026-03-19 15:03:45
50
原创 wait、notify、sleep 与 线程饥饿问题
注意:要将 sleep 写到 synchronized 外面,否则,由于 t1 t2 执行顺序不确定,就可能会 t2 先拿到锁,此时 t1 就没执行到 wait;t2 就会先执行 notify 结果不符合预期(需要确保,代码时先执行 wait ,后执行notify;3.t2 sleep 结束后,由于 t1 是 wait 状态,锁是释放的,t2 就能拿到 锁;t1 执行后,会先拿到锁,并且打印(t1 wait 前),并进入 wait 方法(释放锁 +阻塞)小绿人(线程 A)抢到锁,进厕所(执行同步块);
2026-03-13 13:54:04
359
原创 RabbitMQ 工作模式实现
生产者 每发送一个消息,就记录这个消息的 id 存储在 集合中,服务器 每返回一个 ack (接收消息的id)就删除 集合中对应的 id;3. 消费者问题.Broker发送消息到消费者,消费者在消费消息时,因为没有处理好,导致broker将消费 失败的消息从队列中删除了。在 日志中 发现,消息的唯一id(deliveryTag)只在 单个消费者内部是唯一的,而在多个消费者之间是可以 重复的。如果接收到的是 批量的,就需要将小于等于 deliveryTag 的集合删除,表示序号已经被 ack了。
2026-03-10 14:10:06
493
原创 RabbitMQ 核心概念
Channel:通道,Channel 是在 Connection 之上的一个抽象层,在RabbitMQ 中 一个 TCP连接可以有多个 Channel,每个Channel 都是独立的虚拟连接,消息的发送和接受 都是基于 Channel的(Channel 的出现主要是为了减少 建立 和关闭 TCP连接的开销)发送的消息通常是一个带有一定业务的数据,例如JSON字符串,消息可以带有标签,RabbitMQ 会根据标签进行路由,将消息发送给感兴趣的消费者。4.生产者 声明一个队列,存放消息。
2026-03-10 13:43:30
391
原创 Spring Boot 发送 QQ 邮箱邮件:从 530/535 错误到成功发送的全踩坑指南
步骤 2:Spring Boot 项目引入依赖。步骤 4:封装邮件工具类。步骤 5:测试邮件发送。
2026-03-04 18:10:28
255
原创 自动化测试---pytest框架
如果测试类中定义了 __init__ 方法,那么当pytest 实例化该类时,__init__ 方法就会被调用,可能会掩盖测试类的实际测试逻辑,并引入 额外的副作用,影响测试结果的准确性;在 fixture_执行前 先调用 fixture_A,此时在测试方法中 调用 fixture_B时,就会 先调用 _A,在调用 _B,再执行 测试方法。当我们需要测试的文件多/复杂时,就需要写很长的 pytest 指令,此时就可以使用 pytest 配置文件,减少工作量;fixture 提供了灵活的控制;
2026-03-04 16:10:43
526
原创 如何实现一个简单的自动化接口测试
Requests 库 是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。Requests.get 方法用于发送一个 HTTP get 请求 到指定的 URL。通过上述操作,可以判断:需要先登录,才能访问--个人信息界面,此时就需要用到 登录后,后端返回的 token了;让 Python 程序模拟浏览器,向百度服务器发送一个 “获取首页内容” 的请求,并拿回百度首页的网页数据。返回值:get方法 返回一个 Response 对象 这个对象包含了服务器返回的所有信息。
2026-03-03 20:15:30
45
原创 如何在idea上使用数据库
Database Navigator 是 IntelliJ IDEA 里的一个数据库管理插件,能让你在 IDE 里直接连接各类数据库,执行 SQL、管理数据,并通过可视化方式维护表结构,方便后端开发时一站式操作数据库。1.下载Database Navigator 插件。3.安装好后在边框左侧或右侧会出现标签。2.通过plugins查询插件。6.配置完成后就可以查看数据库。4.点击加号配置 mysql。
2026-02-13 09:22:22
173
原创 ReentrantLock
可重入锁:在以前,Synchronized不够强壮,功能不够强大时,ReentrantLock就是用来实现可重入锁的;传统的锁的风格,这个对象提供了两个方法:lock,unlock;这种写法就容易引起,加了锁之后,忘记解锁;
2026-02-11 23:23:20
278
原创 CAS问题
当线程 B 执行 CAS 操作时,如果此时线程 A 已经完成了 CAS 操作,那么内存地址V处的值已经变为 11,而线程 B 的预期值E还是 10,两者不相等,线程 B 的 CAS 操作失败,不会修改内存地址V的值。线程 B 同样从内存地址V读取当前值,假设线程 B 读取时,线程 A 还未完成 CAS 操作,所以线程 B 读取到的值也是 10,它也设定预期值E为 10,并计算出新值N(同样为 11)。线程 A 执行 CAS 操作,比较内存处的值(也就是A)是否等于预期值E。完成的工作,就是 “比较和交换”
2026-02-11 23:21:59
673
原创 vue3快速创建
是⼀款⽤于构建⽤⼾界⾯的JavaScript框架。它基于标准 HTML、CSS和JavaScript构建,并提供了⼀套声明式的、组件化的编程模型,帮助你⾼效地开发⽤ ⼾界⾯。⽆论是简单还是复杂的界⾯,Vue都可以胜任。前置条件:1.熟悉cmd命令行;2.已安装 18.0及以上版本node.js。1.在想创建目录中使用cmd。2.打开cmd窗口,输入指令。2.性能比 vue2 更好。出现这个界面就说明创建成功。1.vue2停止维护。步骤2:通过npm命令创建vue项目。步骤1:查看安装的版本。
2026-02-10 14:54:40
319
原创 TCP协议特性
数据丢失时,所有接收到的数据都会存储在 服务器 的缓冲区中,依次拍好,服务器会重复返回丢失的数据 的确认号,当客户端收到好几个相同的确认序号,就知道这一条数据丢失,进行重传,只会索要丢失的数据,这种情况称为 “快速重传”syn:数据包,不懈怠载荷,没有应用层的数据,也不代表任何程序的业务逻辑,但是带有IP报头/以太网数据帧帧头/TCP报头,只是一个打招呼的作用----称为“握手”;此时将收到的数据的序号,和缓冲区终端所有数据的序号一一对应,查看是否有重复的,如果有重复的就可以把新收到的数据丢弃;
2026-02-08 22:11:16
547
原创 多线程--锁的策略
1.乐观锁/悲观锁 自适应;1.悲观锁2. 轻量级锁/重量级锁 自适应;2.重量级锁3.自旋锁/挂起等待锁 自适应;3.挂起等待锁4.不是读写锁;4.不是读写锁5.非公平锁 5.非公平锁6.可重入锁6.不可重入锁。
2026-02-08 16:13:04
717
原创 多线程--中断线程/等待线程
作用:查询当前线程是不是被中断了这个方法是一个 boolean 类型的, 初始情况下,这个变量是 false 一旦其他的线程调用 .interrupt方法,就会把这个标志位改为 true;这个操作,是获取当前线程的的实例(thread);哪个线程调用,获得到就是哪个线程的实例;我们可以看到 thread 线程并没有真正的结束查看异常可以发现,是 interrupt 导致的 sleep 出现异常;如果没有sleep , interrupt 可以让线程顺利结束;
2026-02-08 13:40:19
556
原创 线程的状态
4.TIMED_WAITING :指定时间的阻塞,到达一定时间之后自动解除阻塞;(使用 sleep 会进入这个状态,使用带有超时时间的join也会)5.WAITING:不带时间的阻塞(死等);1.NEW :Thread 对象创建好了,但还有没调用 start 方法,在系统中创建线程;2.RUNNABLE:就绪状态:表示这个线程正在 cpu 上执行,或者准备就绪随时可以执行;与线程状态有关,只有当线程状态是,NEW 的时候才能 start;只是 “给了子线程足够的执行时间”,让子线程有机会执行到自身的。
2026-02-08 11:52:06
187
原创 线程和进程的关系
1.进程是包含线程的;2.每个线程,也是一个独立的执行流,可以执行一些代码,并且单独参与到 cpu 的调度中;3.每个进程,有自己的资源,进程中的线程 共用 这一份资源(内存空间,文件描述符表)进程是资源分配的基本单位,线程时调度执行的基本单位;4.进程和进程之间,不会相互影响,如果同一个进程中的某个线程,抛出异常是可能会影响到其他线程,会把整个进程中的所有线程都异常终止5.同一个进程中的线程之间,可能会互相干扰,引起线程安全问题;
2026-02-06 23:40:11
345
原创 Cookie和Session的区别
浏览器禁用Cookie后,无法将sessionID放到 cookie中传递,就可以将 SessionID放到请求的 url 中;
2026-02-05 23:55:54
667
原创 java创建线程的方法
这里的 { } 意思就是要定义一个 类,这个新类继承自 Thread;此处 { } 中可以定义子类的属性和方法,此处最重要的目的就是重写 run 方法;Thread 类是用来管理线程的,而 runnable 对象只是一段可以执行的代码;Runnable :可以理解为“可执行的”,通过这个接口,就可以抽象表示出一段可以被其他实习来执行的代码;thread 指向的实例 并非是单纯的 Thread 而是 Thread的子类;内部类访问外部类的成员,本质上就是可以的;实现类,把它的对象传给。
2026-02-05 19:38:15
372
原创 网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
交换机的数据链路层就会对接收到的以太网数据帧进行解析:1.取出载荷,2.解析帧头中的信息;根据帧头中的信息,决定下一步将数据往哪发送;网络通信过程中 需要涉及到的细节很多,如果有一个协议来完成网络通信,就需要约定好很多内容和细节,导致协议非常复杂;负责数据的格式转换、加密解密、压缩解压--以把它理解为 “翻译官 / 加密官”,解决不同系统间语法和语义的差异。IP协议 有进一步对数据进行解析,取出载荷;IP协议重新进行封装;将数据进行解析,拿到载荷,交给网络层 IP 协议。将功能定位相似的协议放到同一层;
2026-02-04 22:03:44
418
1
原创 java线程池
ThreadPoolExecutor 用起来比较复杂;标准库还提供了 另一个版本 将ThreadPoolExecutor 封装起来了----->
2026-02-03 13:13:51
568
原创 单例模式及线程安全问题
单例模式 是 一种 设计模式(框架)(棋谱);单例 = 单个实例(对象);某个类,在一个进程中,之应该创建出一个实例(原则上不应该有多个)使用单例模式,就可以对代码进行一个严格校验和检查;举例:例如在一个类中需要创建一个对象来,存放管理 5 个G的数据;如果创建 2,3 个......那么就需要 10G 15G 的空间;这样会造成空间的浪费。
2026-02-02 20:53:32
876
原创 多线程--线程安全
1.本质是:程的随即调度导致执行顺序是不确定的;2.代码结构:代码多个线程同时修改一个变量;3.上述多线程修改操作,本质不是“原子的“;(count++ 是多个cpu指令构成,一个线程执行中就可能会被其他线程调度走)每个cpu 指令都是 ”原子的“要么不执行,要么执行完;4.内存可见性问题5.指令重排问题;将 多个指令执行的操作变成原子,也就是 ”加锁“(锁具有 ”排他“)性在java 中,加锁方式,有很多种:最重要使用的就是---synchronized 关键字。
2026-02-02 20:48:06
515
原创 MySQL 事务
就像你在草稿纸上算的答案,还没抄到正式试卷上(没提交),甚至可能擦掉重算(回滚),别人偷看了你的草稿纸,就等于读到了 “脏数据”。,要么全部都不执行【原子:不可拆分的最小单位】;(原子性含义:将多个操作打包到一起,要么全部执行。
2026-01-30 23:07:33
578
原创 Javase 接口
师傅是 “武功掌门人”,他发给徒弟一本武功秘籍,并指定习武规则:规则 1:必须学会 武功1 并且能流畅使出;规则 2:..................
2026-01-24 09:45:00
594
原创 多线程--死锁
摘要:死锁是多个线程互相持有对方所需资源导致的程序卡死状态,需满足互斥使用、不可抢占、请求保持和循环等待四个条件。常见死锁场景包括:单线程重复加锁、两线程互相等待、多线程循环等待(如哲学家就餐问题)。解决方法主要是破坏必要条件,最实用的是约定加锁顺序(如按编号从小到大获取锁),能有效避免循环等待。其他方案如引入额外锁、限制线程数或银行家算法等,普适性或实现难度较高。
2026-01-23 18:15:13
713
原创 RabbitMQ 推拉模式
推模式特点:消息获取更实时。适用场景:对数据实时性要求较高的场景,例如实时数据处理、监控系统、报表系统等。拉模式特点:消费端可按自身处理速度消费,避免消息积压;允许消费者在准备好后再请求消息,避免资源浪费。适用场景:需要流量控制、或需要大量计算资源的任务。
2026-01-23 09:30:00
274
原创 RabbitMQ 消息分发机制
RabbitMQ消息分发优化方案:默认轮询分发易导致消费者忙闲不均,可通过QoS限流机制优化。核心方法channel.basicQos(prefetchCount)限制消费者最大未确认消息数,实现公平分发。主要应用场景包括:1)系统限流,防止消费者过载;2)负载均衡,解决多消费者处理能力不均问题。设置prefetch=1时,消费者需确认当前消息才能获取下一条,RabbitMQ会根据处理速度动态分配消息。需配合手动应答模式使用,能有效提升系统吞吐量和稳定性。
2026-01-22 18:30:00
1278
原创 RabbitMQ 事务机制
RabbitMQ基于AMQP协议实现事务机制,SpringAMQP提供了相关支持。开发者可通过配置ConnectionFactory、自定义开启事务的RabbitTemplate和注册RabbitTransactionManager来确保消息的原子性操作。这三个组件缺一不可,配合@Transactional注解可实现消息的提交/回滚,当方法抛出异常时所有已发送消息都会被回滚。这种机制保证了消息要么全部成功发送,要么全部失败。
2026-01-22 09:30:00
228
原创 RabbitMQ TTL+死信+延迟队列
摘要:本文介绍了RabbitMQ中TTL(过期时间)和死信队列的机制与应用。TTL可设置队列或消息的存活时间,两者同时设置时取最小值。死信队列(DLQ)用于处理被拒绝、过期或队列满被挤出的消息。通过TTL+死信队列组合可模拟延迟队列功能,用于订单超时、定时提醒等场景。文章还对比了原生实现与延迟插件方案,详细说明了插件的安装步骤。延迟插件能更精确地按延迟时间处理消息,避免了原生方案因队列FIFO特性导致的时间误差问题。
2026-01-21 18:37:44
518
原创 RabbitMQ 重试机制
RabbitMQ消息重试机制解析:本文介绍了RabbitMQ在消息处理失败时的重试机制,包括自动确认和手动确认两种模式。针对网络故障等临时性问题,重试可有效解决;但对代码错误则无效。文章通过代码演示展示了未配置重试策略时消息会不断重试,以及配置重试策略后的不同效果,重点比较了Spring AMQP中NONE和MANUAL两种确认方式的差异。
2026-01-21 09:00:00
275
原创 RabbitMQ 持久性
RabbitMQ通过持久化机制保证消息可靠性:1)交换机持久化(durable=true)保存元数据;2)队列持久化确保队列不丢失;3)消息持久化(deliveryMode=2)配合队列持久化存储消息内容。完整持久化需三者同时设置,但仍存在风险:消费者端需关闭autoAck并手动确认;服务端需镜像队列防止单点故障;生产者端需配合发送方确认机制(Publisher Confirm)确保消息到达服务器。此外,Return模式可处理无法路由的消息。持久化仅保证消息到达服务器后的可靠性,需结合多重机制实现端到端消息
2026-01-20 20:32:44
750
原创 RabbitMQ 消息确认机制
RabbitMQ消息确认机制详解:文章介绍了RabbitMQ的两种消息确认模式(自动确认和手动确认)及其实现方式。自动确认模式下,消费者收到消息即确认;手动确认模式下,开发者需通过basicAck、basicNack等方法显式确认消息。文章还详细说明了Spring-AMQP提供的三种确认策略(AUTO、NONE、MANUAL)及其处理流程,并指出常见易混淆的核心类包路径。消息确认机制确保了消息可靠投递,在消费者处理失败时可通过重新入队实现重试。
2026-01-19 23:32:31
1191
原创 初识Java
实际上它们没有任何关系!!!!他们只是名字相似,但它们是两种不同的编程语言。既然我们要学习 Java 那么我们就要知道 Java 可以用来干什么。假如云姜同学失恋了,在动态编写了一段文案想让女神看见,那么这些数据会传入到服务器,服务器判断小云的好友有哪些,然后将这些数据发送给小云的朋友,女神就能看见小云失恋了。
2024-11-17 19:32:21
934
2
原创 C语言分支和循环
不进入 if 语句,进入 for 循环 b++ = 3........4.进入 if 语句,c = 0;5.进入第一层 for 循环,a++ = 101;1.进入第一层 for 循环 a = 100;6.进入第二层 for 循环,b = 2;2.进入第二层 for 循环,b = 2;== : 判断是否相等,相等则输出,不相等则不输出。8.当 b >100 时,不执行 if 语句。3.if 判定--100 % 2 == 0。写一个关机程序--------需要用到。9.执行 if(c == 1)
2024-05-16 23:11:22
1087
1
原创 解决VS2022 scanf等报错问题
此时可以看到每一个源文件的第一行就会出现 #define _CRT_SECURE_NO_WARNINGS 1 的字样,不用每一次需要用到scanf函数时都在首行输入。此时会推荐我们使用scanf_s,这是因为scanf在VS2022中时使用时会被认为不安全使用,但scanf_s只在VS2022中能使用,所以我们应使用scanf函数。新手在学习路上难免会遇到许多奇奇怪怪的问题,我也一样,所以为了方便学习,我将遇到的问题以及解决方法写了下来供大家参考。找到newc++file.cpp的路径并用记事本打开。
2024-04-06 23:27:51
1429
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅