- 博客(76)
- 收藏
- 关注
原创 为什么有了HTTP,还需要gPRC?
将你的系统看作一个整体,对外暴露的“北-南”流量(用户到系统)通常更适合使用HTTP/RESTful API,而系统内部服务间的“东-西”流量则应该优先考虑gRPC,以获得最佳性能和可靠性。在构建现代应用,尤其是微服务架构时,我们经常讨论一个问题:已经有了无处不在的HTTP,为什么还需要gRPC?gRPC和HTTP(特别是RESTful API)是解决不同问题的工具,它们是互补关系,而非替代关系。
2025-10-14 21:23:51
686
原创 天下苦@NonNull久矣,JSpecify总算来了,Spring 7率先支持!
而JSR305早在2006就开始了,都快20年了,一直没啥动静,目前的状态表标记为了Dormant,意思是休眠的,也就是说JSR305其实没人管的,至于为什么没人管,我还没仔细研究,大概说法是设计的不好,但是我觉得应该还有其他原因,因为就算设计的不好,就几个注解而已,重新设计一下不就行了吗。当你想用@NonNull时,发现有一堆的@NonNull等着被你用,比如上图中就有spring提供的,有nacos提供的,有javax提供的,各个都是大佬,到底该用哪个呢?这是IDEA编译给出的警告,a参数前面加了。
2025-10-11 10:10:25
574
原创 RAG效果不理想?试试用魔法打败魔法:让大模型深度参与优化的三阶段实战
检索增强生成(Retrieval-Augmented Generation, RAG)已成为大语言模型(LLM)应用落地最经典和有效的范式。然而,一个基础的RAG系统在面对真实世界的复杂问题时,效果往往不尽人意。许多人认为大模型的成本主要在训练阶段,但要构建一个高性能的RAG应用,在的开销同样不容忽视。,而不仅仅是作为最后一步的“总结工具人”。我们将分三个阶段——和,详细拆解如何利用LLM自身的能力,显著提升R.A.G系统的准确性和相关性。
2025-10-10 16:41:31
765
原创 Spring AI Alibaba JManus底层实现剖析
JManus是Manus的一个Java实现,目前已经在阿里巴巴集团内的很多应用都有使用,主要用于处理需要有一定确定性要求的探索性任务,比如,快速从海量数据中找到数据并转换成数据库内的一行数据,或者分析日志并给出告警等。通过这篇阅读这篇文章,你将了解到JManus中核心流程底层是如何实现的,以及知名的Plan-Act和ReAct设计模式分别是如何实现的。首先,当我们向JManus提交一个请求时,比如:“用浏览器基于百度,查询今天阿里巴巴的股价,并返回最新股价”,这个请求会先由中的接口来处理。
2025-09-28 17:16:19
1147
原创 2000字源码分析,聊聊Spring的扫描机制底层到底是如何实现的?
Spring会利用一个ComponentScanAnnotationParser解析器来专门负责解析@ComponentScan注解,话说人家这类名取得是真的简单明了,一看就知道是干嘛的,好的开源项目,代码写得好,自然没人吐槽。如果class是一个抽象类,如果加了@Lookup注解,那么它会是一个Bean,关于@Lookup注解的作用是什么,也只能留在后面再分析了,可以关注我。如果class是一个接口,就算加了@Component注解,它也不能成为Bean,因为接口不能实例化,更没办法创建Bean对象。
2025-09-24 21:39:31
458
原创 Java知名开源项目,5行代码,竟然有4个“bug”
因为它们设置的扫描路径等于SpringBoot的Bean扫描路径,所以其实这两个注解都可以去掉,因为JPA的自动配置类默认就会用SpringBoot中Bean的扫描路径来扫描Repositories和Entity,我依次来分析。在SpringBoot中,如果你没有自定义设置扫描路径,那么SpringBoot默认会取传递给run()方法的配置类(通常就是启动类)所在的包路径,来作为Bean的扫描路径,回到以上代码,很明显,因此,如果你想自定义扫描路径,那么可以直接这么写,完全可以不用。
2025-09-23 17:58:17
443
原创 我给Alibaba JManus提交的第一个PR被Merge了!
最后,我想说,AI时代,出现了很多新的技术、新的框架,如果你错过了很多开源项目,那么现在出现了很多新的开源项目,都还不成熟,可以趁早加入进来,如果你感兴趣,可以加我微信讨论交流,同时我也在创业,专注做IT技术底层培训,如果你想跟着我提升技术实力,也可以咨询我(微信id:it_zhouyu),我是大都督周瑜,下篇文章见。但是,目前的问题是,在第一次使用playwright时,playwright需要下载浏览器,默认会下载3个,但是对于JManus而言,其实只需要一个就可以了,比如只需要chrome。
2025-09-21 22:56:40
906
原创 为什么Spring 6中要把synchronized替换为ReentrantLock?
所谓thread pinning,就是线程绑定,有两种理解。第一种,我们知道线程是在cpu上运行的,如果是多核cpu,那么同一个线程就可能一下是a核上运行,一下在b核上运行,而所谓线程绑定,就是把某一个线程固定在某个cpu核上运行。
2025-09-15 09:10:59
554
原创 挑战一下,用Java手写Transformer,先手写QKV,能成功吗?
【摘要】本文介绍了如何用Java实现Transformer中的QKV机制。作者通过图书馆查资料的比喻形象解释了Query、Key、Value的概念:Q代表查询需求,K是书籍标签,V是实际内容。文章提供了完整的Java代码实现,包含矩阵乘法、转置、softmax等核心操作,逐步演示了注意力分数的计算、缩放、权重分配和最终输出过程。代码通过四个关键步骤实现了注意力机制公式,展示了纯Java实现Transformer的可能性,并输出中间计算结果供读者理解。作者还预告后续将发布更多Transformer相关实现内容
2025-09-11 10:18:39
583
原创 小白LLM教程:不训练模型,如何进行微调?
简单通用任务 ->Zero-Shot复杂/特定格式任务 ->Few-Shot介于两者之间 ->One-Shot以上就是本文的主要内容,希望能让你对大模型底层有更多了解,都看到这了,别忘了,我是大都督周瑜,欢迎大家关注我的公众号:IT周瑜,里面有更多Java+大模型的技术干货,期待你的关注。
2025-08-30 20:37:12
435
原创 三分钟让你掌握机器学习的本质
y = wx + b,其中w称为weight(权重),b称为bias(偏置)。以上只是最简单的训练过程描述,实际中,预测函数、误差函数、参数、训练过程都会更加复杂。最近在尝试手写一个LLM,也就是大语言模型,可以理解为手写一个ChatGPT、DeepSeek,还是挺有意思的,感兴趣可以关注我(公众号:IT周瑜),我会持续分享。
2025-05-14 21:06:46
1044
原创 rewriteBatchedStatements的作用是什么?
方法,其中就会判断rewriteBatchedStatements是否true,如果为true,就会执行改写后的SQL(multi values)我的公众号:「IT周瑜」里面:面试八股文、BAT面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎关注。,也就是把两个insert合并为了一个insert,这样自然就能提高执行性能了。,其中就有一个rewriteBatchedStatements属性。通过源码可以证明,在执行。
2024-12-18 08:56:06
656
1
原创 in中到底能放多少个数据?200?1000?10000?
因此,从测试可以看出,MySQL的in中并没有数量上的限制,但是有sql语句整体大小的限制,不过还是建议in条件中不要超过200个数据,原因跟查询优化器计算成本有关,本文就暂时不分析了,感兴趣的同学可以关注我的公众号:IT周瑜。从错误信息可以看出,报错原因并不是in的数据太多了(已经有一百万个了),而是sql语句太长了,超过了4,194,304个字节,也就是4M,在我的MySQL中。in条件中放了两个数据,那么最多能放多少个数据呢?但是根据MySQL官网中的描述,67108864,也就是64M。
2024-12-05 22:20:43
2283
2
原创 PostgreSQL数据库中Sequence的使用详解
用于创建序列。nextval()用于获取序列的下一个值。currval()用于获取序列的当前值。setval()用于设置序列的值。用于删除序列。SERIAL是 PostgreSQL 提供的一种简便方式,用于自动创建和管理序列。通过这些操作,你可以在 PostgreSQL 中灵活地使用序列来生成和管理唯一标识符。
2024-11-28 08:07:08
1142
原创 MyBatis中的LanguageDriver的作用是什么
在 MyBatis 中,(语言驱动)的作用是用于解析和处理 SQL 语句的生成和执行。具体来说, 提供了一种机制,允许开发者自定义 SQL 语句的解析方式,以及如何将参数映射到 SQL 语句中。MyBatis 默认提供了一些标准的语言驱动,同时也支持自定义语言驱动以满足特定的需求。MyBatis 提供了两个默认的 实现:开发者可以实现自己的 ,以支持特定的 SQL 生成需求。例如,可以实现一个支持某种模板引擎的 ,或者实现一个支持特定 DSL 的 。实现自定义:实现 接口或继承 类,并重写相关方
2024-11-12 11:09:57
427
原创 MySQL中关于NULL值的六大坑!你被坑过吗?
NULL值是我们在开发过程中的老朋友了,但是这个老朋友在MySQL中有很多坑,我通过这篇文章来总结分享一下,欢迎大家在评论区分享你的看法和踩坑经历。
2024-10-20 13:05:22
1261
1
原创 MySQL成神系列:MySQL中行锁mode的底层实现
看到没,一个mode表示了各种不同情况下的行锁,如果是我们来实现MySQL,那么可能会选择用两个属性来实现,一个属性表示S锁或X锁,另外一个属性表示临键锁、间隙锁、普通行锁。因为,1027=3+1024,3表示LOCK_X,1024表示LOCK_REC_NOT_GAP,因此1027表示加的是普通行锁的排他锁。表示临键锁,既锁记录,又锁记录前的间隙。
2024-10-15 17:35:07
501
原创 超纲了!什么是溢出字段?InnoDB是如何识别普通字段和溢出字段的?(附十张图、IBD文件解析、源码解析)
InnoDB中,记录的默认行格式为Dynamic,还有另外一种行格式为Compact,他们的区别就在于对溢出字段的不同处理。由于没有可为NULL的字段,所以没有NULL值列表,假如现在表中有四条记录,那么页中记录的结构为:不要觉得疑惑,主键字段是一定会放在所有字段最前面的!此时对于id=3这条记录来说,a字段就是溢出字段了,因为存的数据太多了,InnoDB此时会对该字段进行溢出的处理。
2024-10-12 13:41:19
1157
原创 千万不要再用varchar类型来存ip地址了!
要想数据库的性能高,除开配置、除开索引,不要忽略了字段类型的设计,合理的字段类型设计能达到四两拨千斤的效果。IT周瑜dadudu6789。
2024-10-08 18:22:59
498
原创 面试造火箭:MySQL自增ID用完了怎么办?
自增ID耗尽问题通常与系统设计相关,需要根据具体情况选择合适的解决方案。面试官询问此问题是为了评估候选人对数据库设计、性能优化和问题解决能力的了解。在实际应用中,使用BIGINT类型可以大幅降低ID耗尽的风险,如果真的面临ID耗尽的问题,通常意味着数据库架构需要进行优化或重构。我是大都督周瑜,喜欢结交朋友,欢迎大家加我微信:dadudu6789,一起交流技术,我经常会在朋友圈分享一些比公众号更有深度的干货内容或面试经验。
2024-10-07 20:45:57
989
原创 十张图“拿捏”MySQL中B+树的生成过程
因此每页除开会存数据行之外,还额外有一个page header的固定空间,用来存page_no和next_page,page_no表示页号,从0开始,next_page表示下一页,存的就是下一页的页号,因为每页固定是16KB,因此只要知道page_no就能从文件中定位到具体页的物理位置,从而读取该页的内容,比如要获取page_no=2的页内容,那就直接从第2*16384个字节开始取,取16384个字节就是page_no=2的页的内容。因此有了页,每页默认16KB,不过一页能存多少条记录就不是固定的了。
2024-09-11 17:14:53
1294
原创 十道MySQL必问面试题
也是可以利用到索引的,并不一定是全表扫描,也可以扫描某个索引B+树的叶子节点,从而得到总条数,因为不管是什么索引,主键索引还是辅助索引,实际上它们对应的B+树中的叶子节点中的数据条数是一样的,只不过字段数不一样,主键索引存了全部字段,而辅助索引只存了定义的索引字段+主键字段,所以通常辅助索引是要比主键索引小的,因此遍历起来也会更快,但是记录条数是一样的。就需要锁全部的间隙了,因为全部的间隙都有可能插入name='zhouyu’的记录,或者可以理解为会给所有记录都加临键锁,这样就锁住了所有的间隙。
2024-08-31 18:53:42
3006
原创 常识问题:以下SQL会创建几个索引?
大家好,我是大都督周瑜,最近一直在研究MySQL源码,有点走火入魔了,今天还是分享一篇跟MySQL有关的。大家先猜猜以下SQL会创建几个索引?不要往下滑,先自己思考一个答案,并发到评论区。正确答案是3个,我先分析原因,再给出三种证明方式。
2024-08-28 09:51:58
781
原创 五种情况,不加GAP锁,只加行锁
大家好,我是大都督周瑜,最近在整理MySQL源码的笔记,这里分享一篇出来,想看其他的可以关注我的公众号:IT周瑜。表示加的锁类型为:LOCK_REC_NOT_GAP,也就是我们通常所理解的行锁,只锁记录行本身,不说记录前面的间隙。
2024-08-26 11:31:41
557
原创 Spring好坑!为什么代理对象的属性没有值?
因此,我们上面分析的代理对象执行方法的流程并没有问题,代理类肯定会继承父类的name属性,只是代理对象在创建时默认使用的是Objenesis,创建出来的对象根本就没有对属性做初始化,所以最终name属性为null,不使用Objenesis就正常了。但是,上面的代码中,test()方法前面加了final,表示不能被子类重写,因此代理类中是没有test()方法的,代理对象执行的test()方法,并不是自己的test()方法,也就是不会执行切面逻辑,也就是事务会失效。仔细看看,不知道大家能不能分析出原因?
2024-08-15 20:12:28
738
原创 Java如何实现拼音排序?
很明显,直接比较第一个字节就能发现“周瑜”小于“大都督”,因为54小于59,所以在排序结果中,“周瑜”排在了“大都督”的前面。排序的本质其实都一样,都是把字符转成特定的编码,然后比较编码的大小关系,那么有没有一种编码是按拼音来编码的呢?本质上是比较两个String的大小,小的排在前面,大的排在后面,那两个String默认是怎么比较大小的呢?很明显,结果不是拼音顺序,“大都督”应该要在最前面,那这种情况是按什么逻辑排的序呢?在我们国家,按拼音进行排序是很常见的需求,比如姓名,那如何按拼音进行排序呢?
2024-08-14 13:38:01
926
原创 假如你是MySQL作者,你会如何实现order by?
大家好,我是IT周瑜,最近在研究MySQL源码,同时自己也在尝试手写一个MySQL,发现挺有趣的,因此这篇文章来跟大家一起扮演MySQL作者,一起来分析一下order by该如何实现。大家如果对手写MySQL感兴趣,可以关注我的公众号:IT周瑜以上SQL对应的需求很简单:对t1表中的全部数据按照name字段进行升序排序。请大家思考5秒钟:如果你是MySQL作者,你会如何实现以上需求?
2024-08-12 21:50:03
986
1
原创 麻烦不要再问我count(*)、count(1)、count(id)、count(name)之间的区别了
另外要注意,当我们执行count()时,会遍历表中的每一行的,如果表只有一个聚集索引,那就会进行全部扫描,但是如果表中有多个索引,则会选择占用页数最少的索引,遍历它的叶子节点即可,因为不管是什么字段构建的索引,数据条数都是一样的,比如,聚集索引的叶子节点中有10000条数据,每条数据有5个字段,而另外一个辅助索引的叶子节点中肯定也有10000条数据,只不过每条数据可能只有2个字段,此时辅助索引占用的页数肯定更少,但是条数是一样的,此时count()就会走辅助索引来提高统计速度。
2024-07-31 12:15:02
1108
原创 MySQL源码之ReadView源码分析
当我们执行普通的select查询时,InnoDB会使用MVCC机制来实现记录的,也就是在一个事务中对同一条记录多次读取结果保持一致,尽管可能有其他事务在修改该记录。而MVCC机制主要由两部分来实现,一部分是由undo log组成的版本链,另一部分就是ReadView,本文主要聊聊ReadView的底层实现机制。关注我,公众号:IT周瑜,后面再聊聊版本链的实现机制。这三个属性控制了ReadView对行记录不同版本的可见性,在遍历版本链时,会返回对当前ReadView可见的第一个版本。
2024-07-29 12:38:32
594
3
原创 行锁表锁都是渣渣,元数据锁才是隐藏大佬
英文名叫Metadata Lock,缩写为MDL,顾名思义,它是针对元数据的一种锁,锁的是元数据。一张表有100条记录,这里的记录我们可以称之为表数据,一张表的名字叫t1,有c1、c2两个字段,c1的类型是int,c2的类型是varchar,这里的表名、字段名、字段类型叫做表的元数据,当我们修改某行记录时,叫做修改表数据,当我们修改表名或字段类型时,叫做修改表的元数据。
2024-07-26 11:43:40
651
原创 Spring6新特性之:既生@Primary,何生@Fallback
换句话说,如果Spring根据类型找到了多个Bean,会选择其中加了@Primary的Bean来进行注入,因此,同类型的多个Bean中只能有一个加了@Primary,如果有多个也会报错。因为orderService1加了@Fallback注解,相当于备胎,只有当没有其他Bean可用时,才会用orderService1这个备胎,有其他Bean就会优先用其他Bean。如果根据类型只找到一个Bean就用不着他两了,另外,同类型多个Bean中@Primary的Bean只能有一个,但可以有多个@Fallback。
2024-07-20 10:11:43
531
原创 斗胆聊聊:大龄程序员的出路在哪里
第三,做课程,就像我一样,实际上做课程是比较难的一件事,因为要把一个技术真正研究透彻才能讲出好的课程,但是做课程风险相对比较小,因为只要课程做出来了,总能卖出去几个吧,其实我觉得我现在就像一个作家,作家的工作是写书,我的工作是做课程,作家靠书活着,我靠课程活着,因此,对于程序员而言,你可以花时间研究某个技术,然后将他做成课程或书籍,比如掘金小册,也是能拿到收入的。首先,作为程序员,虽然没有其他职业那么多的人情世故,但仍然是职场人,仍然是公司的牛马,是给老板打工的,那作为职场人,职场目标是什么?
2024-07-15 16:58:51
575
原创 十大步骤分析GraphRAG的工作原理
第七步,社群检查,通过前面的步骤,可以从所有文本单元中抽取出所有的实体信息、关系信息、事件信息,社群检查就是利用这些信息将实体进行分类,比如周瑜和孙策属于吴国,曹操和司马懿属于魏国,刘备和关羽属于蜀国,而吴国、魏国、蜀国都属于东汉,其中东汉是一个大社群,魏蜀吴是三个小社群,当执行查询时,可以指定社区的级别,如果指定的是低级别社群,那么查找的结果就比较微观,比如问三国时期有哪些著名人物,如果指定的社群为吴国,那么匹配的就只有周瑜和孙策,如果指定的社群为东汉,那么就能找到更多的著名人物。
2024-07-14 22:39:30
2306
原创 Spring Cache核心源码分析
Spring Cache整体而言,就是利用Spring AOP机制,利用代理对象在执行方法时对缓存进行操作,除开以上源码流程外,其实还有比如@EnableCaching的实现源码,以及RedisCache是怎么和Redis进行交互的实现源码,下次再分析吧,我是大都督周瑜,记得关注我,大家如果有收获,帮忙分享。
2024-07-07 14:58:25
1208
原创 @ConfigurationProperties结合Nacos配置动态刷新之底层原理分析
当Nacos服务端的配置发生改变时,会触发Nacos客户端的配置监听器,从而发布事件,从而更新对象,从而发布事件,从而利用最新的对象更新对象中的属性。
2024-05-28 22:37:32
3877
1
原创 微服务启动慢,看我如何消灭这些憨憨怪!
这样SpringBoot启动时就只会扫描指定的包路径,这样Bean扫描的效率就会高很多,从而提高应用的启动速度,经过我测试,应用的启动速度又缩短了50秒左右,现在距离目标1分钟只有10秒左右了,开心。另外告诉大家一个秘密,我测试的这个微服务中总共有2000多个Bean对象,300个多@Service,200个@RestController~~~~欢迎关注我的公众号:IT周瑜。获取更多技术干货、免费经典面试资料。
2024-04-29 22:33:04
8146
11
原创 同样的代码,开发环境生效,测试环境不生效,记一次问题排查过程和原因分析
我接着解压测试环境中core2的jar包,发现这个jar包中确实有这个Controller,也就是当前微服务用到的两个core中都有这个Controller,包名类名都一样,但是内容不一样,core2中是旧版本,core1中是新版本,好了,现在问题的表面原因就是core1中新版本Controller没有生效,而旧版本的Controller生效了,这是因为它们两个类名一样,相当于beanName冲突了,所以只有其中一个生效,而此时旧版本胜出了,它生效了,从而导致新增的接口没有生效。这就是解决问题的快乐!
2024-02-06 20:53:47
1226
原创 必收藏面试题:什么是SQL注入?以及Mybatis中#号和$号之间的区别?
先看两段代码,假如id的值为字符串"100",大家可以顺便想想每段代码最后拼接出来的SQL长什么样。字符串直接拼接参数通过占位符?和setString()方法拼接参数这两种方式有什么不同吗?通过占位符?看上去区别不大,但是对于id=100来说,id是varchar,100是int,对于mysql来说是要做类型转换的,这个过程其实是会导致问题的,下篇文章再来分析,关注我的公众号:IT周瑜通过占位符?仔细看看,看出区别没,直接拼接参数的将能查出全部数据,因为or 1=1生效了,而通过?
2024-02-03 10:46:28
979
原创 面试官:什么是垂直越权?有哪些解决方案?
假如系统中有一个删除数据的接口,这个接口正常情况下只有管理员登录到管理台才能调用到这个接口,但是有一个用户小勇,一个调皮的程序员,他猜到了这个接口的URL,然后用postman直接调用了删除接口,哦吼,数据被删了,这就是垂直越权,本来用户没有权限,但是通过某种手段向上拿到了更高的权限。这种场景出现的原因,一方面是小勇太聪明加胆子大,另外一方面是接口没有做权限验证,所以,开发时,我们不能假定该接口只会被管理员调用,而应该做到该接口只能被管理员调用。我给大家列三种解决方案,大家看看哪种方案最好。
2024-01-16 21:27:39
2041
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅