- 博客(92)
- 收藏
- 关注
原创 【RabbitMQ高级】如何保证消息的可靠性?
摘要:本文系统分析了RabbitMQ消息丢失的四个关键环节及解决方案。生产者端通过重连机制和确认机制(PublisherConfirm/Return)保障消息投递;Broker端采用三层持久化(交换机/队列/消息)和LazyQueue策略确保数据安全;消费者端通过确认机制、失败重试及幂等性设计(唯一ID/业务判断)保证可靠消费;延迟消息可通过死信队列或官方插件实现。
2026-06-07 20:41:03
348
原创 【Agent笔记 | 第六篇】Agent关键组件
如果 LLM 判断需要使用工具,它不会生成普通文本,而是生成一段 JSON,告诉 Agent:“请帮我执行这个函数,参数是这些”。使用专门的 Reranker 模型(Cross-Encoder),对初筛出的文档与 Query 的相关性进行精确打分,保留最相关的 Top 3-5。在向量数据库中进行近似最近邻(ANN)搜索,通过计算余弦相似度(Cosine Similarity),快速召回 Top 10-20 的片段。用户的提问也被向量化,并在数据库中计算相似度(如余弦相似度),召回 Top-K 的文本块。
2026-06-06 21:33:44
359
原创 【Docker】CenOS上安装Docker
如果你之前安装过旧版本的 Docker,建议先卸载它们及其依赖。如果没有安装过,可以直接跳过此步。安装最新版本的 Docker Engine、CLI 和 containerd。安装完成后,启动 Docker 服务,并设置它在系统每次重启时自动启动。(Docker 存储驱动需要的依赖)。推荐使用清华源,下载更快。
2026-06-04 17:43:15
233
原创 【Redis | 第六篇】Redisson
在上一篇Redis实现分布式锁,我们是基于SET NX EX命令痛点问题描述不可重入同一个线程在持有锁的情况下,再次获取同一把锁会死锁不可重试获取锁失败后立刻返回false,无法自动重试,调用方只能自旋超时释放业务还没执行完,锁就过期了,导致并发安全问题主从一致性Redis 主节点宕机,从节点还没同步锁数据,导致锁丢失Redisson作为 Java 生态中最强大的 Redis 客户端,对分布式锁做了非常完善的封装。它不仅实现了接口,还通过精巧的设计把这四个问题一一化解。
2026-06-02 15:23:03
801
原创 【Agent笔记 | 第五篇】LangChain&LangGraph
LangChain是一个用于构建基于大语言模型(LLM)应用程序的开源框架。它主要定位为工具包(Toolkit),为开发者提供了一系列可组合的组件和工具,用于将LLM与外部数据源、工具和服务连接起来。LangGraph是LangChain团队开发的图结构编排框架,专门用于构建有状态的、多参与者(multi-actor)的应用程序。它主要定位为编排框架(Orchestration Framework),专注于解决复杂agent工作流的编排问题。
2026-05-30 21:49:33
651
原创 【Redis | 第五篇】分布式锁
判断和删除不是原子操作,在线程A判断是自己上的锁之后,接下来本来应该要执行释放锁的操作,但是在释放之前阻塞了,在阻塞期间锁刚好到期自动释放,并且被别的线程抢走了,当线程A恢复之后还是要执行释放操作,依然会发生误删。为了解决上面锁被误删问题,我们的解决方案是给锁加上一个身份ID,每当一个线程加上锁之后会在Redis中记录一个锁的ID,为了后面验证这是自己加上的锁,如果不是自己加上的锁,那么就不会删除。为了解决上面的死锁问题,我们可以给锁提供一个过期时间,来给锁释放做一个兜底的操作。命令提供了扩展参数。
2026-05-29 21:24:47
543
原创 【Agent笔记 | 第四篇】Agentic RAG
意图识别、简单的 Query 改写、判断检索结果是否相关的打分任务,可以使用微调过的本地小模型(如 Llama-3-8B 或 Qwen-7B)处理。只有最终的规划和长文总结才使用昂贵的大模型。如果你的 Query Rewrite 只是一个固定的前置规则或单次 LLM 调用(例如:让 LLM 把用户的口语化提问改写为 3 个适合向量检索的关键词),这依然是流水线的一部分。LLM 被动接收检索到的上下文,如果检索回来的内容是垃圾,LLM 产出的也是垃圾(Garbage in, garbage out)。
2026-05-28 21:55:48
747
原创 【Agent笔记 | 第三篇】RAG优化
加 Rerank 是为了弥补初筛阶段为了速度而牺牲的精度。初筛负责把包含答案的文档“捞”上来,Rerank 负责把最能准确回答问题的文档“排”到最前面,防止不相关的内容干扰大模型(LLM)。
2026-05-27 22:19:52
866
原创 【Redis | 第四篇】乐观锁&悲观锁
乐观锁是一种并发控制策略,它假设在大多数情况下,多个事务/线程访问同一资源时不会发生冲突,因此在操作数据时不预先加锁,而是在提交更新时才检测是否有冲突发生。
2026-05-26 21:11:56
451
原创 【Agent笔记 | 第二篇】ToolCalling详解
业界目前事实上的标准是采用规范(OpenAI 也是采用此标准)。name: 工具的唯一标识符(只能用字母、数字、下划线)。最核心的部分!这是写给模型看的“Prompt”。你需要清晰描述这个工具是做什么的、什么时候该用、什么时候不该用。parameters: 定义各个参数的名称、数据类型(string, integer, boolean 等)、描述信息(告诉模型如何提取或构造这个参数),以及哪些是必填项(required"description": "查询指定城市的天气","city": {
2026-05-25 21:07:37
702
原创 【Agent笔记 | 第一篇】Claude Code的记忆&上下文机制
当积累了足够多的新会话后(通常是距离上次清理超过 24 小时且有 5 个以上新会话),它会在后台自动合并冲突的记忆(例如旧的数据库配置和新的配置)、删除无效的笔记,并将。如前所述,Auto Dream 进程会在后台用大模型重新审视已有的记忆,执行合并同类项、剔除失效链接(比如笔记指向了一个已经被删除的代码文件)的工作,确保记忆库始终精简且最新。因为有底层持久化记忆的兜底,重启后新会话的上下文极为干净,同时 Claude 依然“记得”上一条会话中得出的核心结论。存储在开发者的本地机器上,跨越所有项目生效。
2026-05-24 19:29:03
906
原创 【Redis | 第三篇】缓存(Cache)
缓存就是将极其耗时、计算昂贵或频繁访问的数据,临时存储在访问速度更快的介质中(通常是内存),以便下次请求时能直接获取,而无需重新计算或从慢速设备(如硬盘数据库)中读取。
2026-05-23 21:13:36
1076
原创 【Redis | 第二篇】Jedis&SpringDataRedis
本文介绍了两种Java操作Redis的方式:Jedis和Spring Data Redis。Jedis是Redis官方推荐的Java客户端,API与Redis命令一一对应,支持连接池优化性能。Spring Data Redis提供了RedisTemplate工具类,封装了各种Redis操作,支持自定义序列化方式。文章详细说明了两种方式的配置步骤和使用方法,包括依赖引入、连接配置、基本操作示例等,并比较了它们的优缺点。特别强调了RedisTemplate的序列化问题
2026-05-21 21:18:20
809
原创 【JavaWeb | 第十三篇】SpingAOP(超详细)!
技术实现的,目标对象会通过动态代理技术生成一个代理对象,代理对象中添加了AOP要实现的逻辑的具体代码,方法的原始逻辑是通过调用目标对象中的方法实现的,在Controller层注入的目标对象就变为了代理对象。比如,我们想进行业务性能的统计,原始方法如下,需要在每个业务方法中添加这样一串逻辑:记录开始时间,执行结束后用结束时间减去开始时间。注意2:@Around环绕通知方法的返回值,必须指定为object,来接收原始方法的返回值。当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。
2026-05-17 16:51:47
782
原创 【JavaWeb | 第十二篇】项目实战——登录功能
但是每个接口都要判断一次登录标记,在工程上是很复杂的,因此引入一个统一拦截器,浏览器发送请求后由统一拦截器拦截,取出登录标记进行判断。在多台服务器集群的环境下,如果用户的第一次请求打在 A 机器(Session 在 A 上),第二次请求打在 B 机器,B 机器上没有该用户的 Session,用户就会被迫重新登录。实现上述代码后,我们发现将登录成功后的网址复制到一个新的页面上,无需登录就可以进行数据表的修改,我们只在前端页面上实现了该登录逻辑,但是并没有真正的实现登录的校验功能。这是防止令牌被篡改的关键。
2026-05-16 17:09:15
797
原创 【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
使用@Value注解注入配置文件的配置项,如果配置项多,注入繁琐,不便于维护管理 和复用。在这里上传文件的代码基本上是固定的,因此可以将这个代码封装到一个工具类Utils中。接下来点击上传文件就可以进行文件的上传了,并且这个文件是会保存到云端的。进入后会显示开通服务的按钮,点击即可开通对象存储OSS的服务。,我们需要一个类一个类的查找,因此我们可以将这些配置信息填写到。:在真实文件上传场景中,图片的命名可能会重复,因此我们使用。注解将配置yaml文件中的具体的值注入到实体类当中。
2026-05-14 14:40:38
764
原创 【JavaWeb | 第十篇】Spring中的事务控制
方法a和方法b都声明了是一个事务,而且方法a中间还调用了b方法,那么b方法应该加入当前的事务,还是应该再新建一个事务呢?:将当前方法交给spring进行事务管理,方法执行前,开启事务;——Emp表和EmpExpr表,并且EmpExpr表中的dept_id是根据Emp表中的id录入的,添加注解之后在运行时就会出现,初始化事务的debug信息。:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。的问题,这显然是不符合业务逻辑的。,将这两个操作设置为一个事务,整体进行操作。
2026-05-13 16:57:24
574
原创 【JavaWeb | 第九篇】项目实战——员工管理(条件分页查询)
原因:在Mapper层我们将SQL语句的查询条件写死了,而查询条件应该随着用户的输入的条件变化而变化。:同样需要将条件查询的参数name,gender,begin,end传递给mapper层。:由于条件查询的SQL语句有些复杂,我们在这里可以选择使用XML的方式来编写SQL语句。:根据查询条件,来生成where关键字,并会自动去除条件前面多余的and或or。:随着用户的输入或外部条件的变化而变化的SQL语句,我们称为。:需要接收前端返回的查询参数,在分页查询的基础上进行添加。1.1 一个一个接收查询参数。
2026-05-12 14:35:57
476
原创 【JavaWeb | 第八篇】项目实战——员工管理(分页查询)
注意:这里传递的是page页数,而对数据库进行分页查询需要的第一个参数为起始索引的值,因此要对page进行处理,起始索引=(页码 - 1)* pageSize。:接收到从Controller层传递过来的page和pageSize参数,根据这两个参数来进行数据库数据的查询。:用来接收从前端返回的参数 page和pageSize,形参名要与返回的参数的字段名一致。是第三方提供的在Mybatis框架中用来实现分页的插件,用来简化分页操作,提高开发效率。前端发送的参数有:当前页码、每页需要展示的记录数。
2026-05-11 22:23:19
644
原创 【JavaWeb | 第七篇】项目实战——部门管理
比如要实现删除部门的操作,我们需要一个id来唯一标识想要删除的部门,那么这个id值后端的Controller层应该如何接收呢?Controller层在上面已经实现了,接下来应该实现业务逻辑层Service层,以及数据持久化层Mapper层。通过HttpServletRequest对象接收的参数类型是String类型,需要手动转换类型,步骤繁琐。在之前的文章当中,我们基本上实现的都是后端不接收参数的功能实现,如果我们想要。相同,直接定义方法形参即可接收,省略@RequestParam 注解。
2026-05-10 17:30:56
740
原创 【JavaWeb | 第六篇】Mybatis
")注解,因为如果只声明形参,在将程序编译成字节码文件后,形参名称不会保留,因此无法匹配到上面select语句的占位符,要使用@Param注解为形参起一个名字。在上一篇文章中, 我们介绍了JDBC可以通过Java语言来操作Mysql等数据库,但是操作步骤过于繁琐(需要创建连接,创建sql语句执行对象……注意:在新增操作需要传递多个属性值时,可以将这些属性值封装到一个对象中,占位符当中的属性为对象中的属性名,而不是数据库中的字段名。使用Mybatis的注解,主要是来完成一些简单的增删改查功能。
2026-05-09 20:57:54
777
原创 【JavaWeb | 第五篇】JDBC
当使用预编译时,数据库已经提前解析了 SQL 的语法树。onnectivity),就是使用Java语言操作关系型数据库的一套API。需求:基于JDBC执行如下select语句,将查询结果封装到User对象中。我们在上一个执行查询语句时,使用了预编译的SQL语句,使。sun公司官方定义的一套操作所有关系型数据库的规范,即。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是。需求:基于JDBC程序,执行update语句。获取SQL语句的执行对象。
2026-05-08 21:32:01
586
原创 【JavaWeb | 第四篇】分层解耦
我们在实现UserController来接收Service层传过来处理好的数据时,需要自己在UserController中手动创建一个UserServiceImpl的对象,才能调用业务处理的实现。将容器中的对象分配给另一个层的对象时,Spring 容器会在运行时自动将目标对象分配(注入)给它。1.将Dao和Service层的实现类,交给IOC容器管理。现在有一个案例,需求是将user.txt文件中的数据返回给客户端的前端页面。,接收前端发送的请求,对请求进行处理,并响应数据。彻底接管了这一过程。
2026-05-07 20:14:07
516
原创 【JavaWeb | 第三篇】Http协议
Web服务器对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。浏览器会把代表你身份的一小段代码(Cookie)存下来,每次发 HTTP 请求时都带着它,服务器看到这张“通行证”,就知道你是谁了。哪怕你刚刚向服务器请求过一个网页,一秒钟后你再请求另一个网页,服务器也会把你当成一个全新的人。响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。:请求参数在请求体中,POST请求大小没有限制。
2026-05-05 19:42:14
571
原创 【JavaWeb | 第二篇】Vue快速入门
目前数据实现了双向绑定, 那么我想点击查询能够将用户输入在表单的信息输出到控制台,并且点击清空能够清空输入框的数据,应该如何实现呢?我们看到在img标签中直接使用插值表达式是无法正常显示图片的,此时就要用到Vue中的v-bind指令。指令:HTML标签上带有 v-前缀的特殊属性,不同的指令具有不同的含义,可以实现不同的功能。key:给元素添加的唯一标识,便于vue进行列表项的正确排序复用,提升渲染性能。:动态为HTML标签绑定属性值,如设置href,src,style样式等。,表达式值为 true,显示;
2026-05-04 14:05:31
643
原创 【JavaWeb | 第一篇】JavaScript
JavaScript是大小写敏感的,因此null、Null、NULL是完全不同的。ECMAScript:规定了JS基础语法核心知识,包括变量、数据类型、流程控制、函数、对象等。DOM:文档对象模型,用于操作HTML文档,如:改变标签内的内容、改变标签内字体样式等。BOM:浏览器对象模型,用于操作浏览器本身,如:页面弹窗、地址栏操作、关闭窗口等。注意:得到的是一个NodeList节点集合,是一个伪数组(有长度、有索引的数组)string:字符串,单引号、双引号、反引号皆可,推荐使用单引号。
2026-05-03 15:34:15
751
原创 【MySQL | 第十一篇】InnoDB引擎
可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。不同事务或相同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。Roll_pointer:每次对某条记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。:表空间的单元结构,每个区的大小为1M。
2026-05-01 20:30:57
576
原创 【MySQL | 第十篇】锁
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。锁定粒度大,发生锁冲突的概率最高,并发度最低。2.InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
2026-05-01 15:21:14
753
原创 【MySQL | 第九篇】SQL优化
1.Usingfilesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort bufer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序。没有not null约束:InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为nul,不为nul,计数累加。InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从。
2026-04-30 20:43:29
726
原创 【MySQL | 第八篇】索引的使用
根据最左前缀法则,从索引的最左列profession开始,后面紧接着的是age、status,如果将profession字段去掉,直接按age、status或只根据status查询,那么该索引就会失效。可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
2026-04-29 17:30:21
590
原创 【MySQL | 第七篇】索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。索引的优缺点:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。索引列也是要占用空间的。索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。
2026-04-28 20:29:50
668
原创 【MySQL | 第六篇】存储引擎
如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。Memory引擎的表数据是存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。注意:MySQL中默认的存储引擎为INNODB。
2026-04-27 14:41:27
401
原创 【MySQL | 第五篇】事务
案例:转账操作,设置为自动提交事务后,必须执行操作之前加一行开启事务、在执行完操作后加一行commit,才会同步到数据库的数据当中。案例:转账操作,设置为手动提交事务后,必须在执行完操作后加一行commit,才会同步到数据库的数据当中。一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式提交事务。注:事务隔离级别越高,数据越安全,但是性能越低。四、并发事务引发的问题。
2026-04-27 12:12:58
484
原创 【MySQL | 第四篇】多表查询
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放到另一张表中。笛卡尔积:笛卡尔乘积是指在数学中,两个集合A和集合B的所有组合情况,在多表查询时,需要。对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。注:在使用联合查询时,使用union连接的两条语句的返回的列数必须一致。常用的操作符:IN,NOT IN, ANY, SOME,ALL。子查询返回的结果为一行(可以是多列),这种子查询称为行子查询。查询每个员工的姓名,及关联的部门的名称(隐式内连接)
2026-04-26 17:00:21
718
原创 【MySQL | 第三篇】约束(Constraints)
当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。是一种强制性的规则,用于限制可以插入到表中的数据类型。当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。员工表的部门id为外键,连接了部门表的主键id。
2026-04-25 17:31:23
410
原创 【MySQL | 第二篇】常用函数
合理利用这些函数,不仅能大大简化代码逻辑,还能减少网络传输的数据量,提升整体效率。如果expr的值等于val1,返回res1,否则返回default默认值。左填充,用字符串pad对str的左边进行填充,达到n个字符串长度。右填充,用字符串pad对str的右边进行填充,达到n个字符串长度。如果value1不为空,返回value1,否则返回value2。如果val1为true,返回res1,否则返回default。如果value为true,则返回t,否则返回f。求参数x的四舍五入的值,保留y位小数。
2026-04-25 16:48:04
752
原创 【MySQL | 第一篇】数据库和表的基本操作
就是用来打地基、建框架、砌墙的。它决定了房子的结构,映射到MySQL中主要用来对数据库和数据表来进行基本的操作。
2026-04-24 21:45:10
352
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅