自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

1点25的博客

坚持原创

  • 博客(55)
  • 收藏
  • 关注

原创 十张图“拿捏”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 828

原创 十道MySQL必问面试题

也是可以利用到索引的,并不一定是全表扫描,也可以扫描某个索引B+树的叶子节点,从而得到总条数,因为不管是什么索引,主键索引还是辅助索引,实际上它们对应的B+树中的叶子节点中的数据条数是一样的,只不过字段数不一样,主键索引存了全部字段,而辅助索引只存了定义的索引字段+主键字段,所以通常辅助索引是要比主键索引小的,因此遍历起来也会更快,但是记录条数是一样的。就需要锁全部的间隙了,因为全部的间隙都有可能插入name='zhouyu’的记录,或者可以理解为会给所有记录都加临键锁,这样就锁住了所有的间隙。

2024-08-31 18:53:42 904

原创 常识问题:以下SQL会创建几个索引?

大家好,我是大都督周瑜,最近一直在研究MySQL源码,有点走火入魔了,今天还是分享一篇跟MySQL有关的。大家先猜猜以下SQL会创建几个索引?不要往下滑,先自己思考一个答案,并发到评论区。正确答案是3个,我先分析原因,再给出三种证明方式。

2024-08-28 09:51:58 644

原创 五种情况,不加GAP锁,只加行锁

大家好,我是大都督周瑜,最近在整理MySQL源码的笔记,这里分享一篇出来,想看其他的可以关注我的公众号:IT周瑜。表示加的锁类型为:LOCK_REC_NOT_GAP,也就是我们通常所理解的行锁,只锁记录行本身,不说记录前面的间隙。

2024-08-26 11:31:41 248

原创 Spring好坑!为什么代理对象的属性没有值?

因此,我们上面分析的代理对象执行方法的流程并没有问题,代理类肯定会继承父类的name属性,只是代理对象在创建时默认使用的是Objenesis,创建出来的对象根本就没有对属性做初始化,所以最终name属性为null,不使用Objenesis就正常了。但是,上面的代码中,test()方法前面加了final,表示不能被子类重写,因此代理类中是没有test()方法的,代理对象执行的test()方法,并不是自己的test()方法,也就是不会执行切面逻辑,也就是事务会失效。仔细看看,不知道大家能不能分析出原因?

2024-08-15 20:12:28 480

原创 Java如何实现拼音排序?

很明显,直接比较第一个字节就能发现“周瑜”小于“大都督”,因为54小于59,所以在排序结果中,“周瑜”排在了“大都督”的前面。排序的本质其实都一样,都是把字符转成特定的编码,然后比较编码的大小关系,那么有没有一种编码是按拼音来编码的呢?本质上是比较两个String的大小,小的排在前面,大的排在后面,那两个String默认是怎么比较大小的呢?很明显,结果不是拼音顺序,“大都督”应该要在最前面,那这种情况是按什么逻辑排的序呢?在我们国家,按拼音进行排序是很常见的需求,比如姓名,那如何按拼音进行排序呢?

2024-08-14 13:38:01 313

原创 假如你是MySQL作者,你会如何实现order by?

大家好,我是IT周瑜,最近在研究MySQL源码,同时自己也在尝试手写一个MySQL,发现挺有趣的,因此这篇文章来跟大家一起扮演MySQL作者,一起来分析一下order by该如何实现。大家如果对手写MySQL感兴趣,可以关注我的公众号:IT周瑜以上SQL对应的需求很简单:对t1表中的全部数据按照name字段进行升序排序。请大家思考5秒钟:如果你是MySQL作者,你会如何实现以上需求?

2024-08-12 21:50:03 692

原创 麻烦不要再问我count(*)、count(1)、count(id)、count(name)之间的区别了

另外要注意,当我们执行count()时,会遍历表中的每一行的,如果表只有一个聚集索引,那就会进行全部扫描,但是如果表中有多个索引,则会选择占用页数最少的索引,遍历它的叶子节点即可,因为不管是什么字段构建的索引,数据条数都是一样的,比如,聚集索引的叶子节点中有10000条数据,每条数据有5个字段,而另外一个辅助索引的叶子节点中肯定也有10000条数据,只不过每条数据可能只有2个字段,此时辅助索引占用的页数肯定更少,但是条数是一样的,此时count()就会走辅助索引来提高统计速度。

2024-07-31 12:15:02 945

原创 MySQL源码之ReadView源码分析

当我们执行普通的select查询时,InnoDB会使用MVCC机制来实现记录的,也就是在一个事务中对同一条记录多次读取结果保持一致,尽管可能有其他事务在修改该记录。而MVCC机制主要由两部分来实现,一部分是由undo log组成的版本链,另一部分就是ReadView,本文主要聊聊ReadView的底层实现机制。关注我,公众号:IT周瑜,后面再聊聊版本链的实现机制。这三个属性控制了ReadView对行记录不同版本的可见性,在遍历版本链时,会返回对当前ReadView可见的第一个版本。

2024-07-29 12:38:32 264 1

原创 行锁表锁都是渣渣,元数据锁才是隐藏大佬

英文名叫Metadata Lock,缩写为MDL,顾名思义,它是针对元数据的一种锁,锁的是元数据。一张表有100条记录,这里的记录我们可以称之为表数据,一张表的名字叫t1,有c1、c2两个字段,c1的类型是int,c2的类型是varchar,这里的表名、字段名、字段类型叫做表的元数据,当我们修改某行记录时,叫做修改表数据,当我们修改表名或字段类型时,叫做修改表的元数据。

2024-07-26 11:43:40 291

原创 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 271

原创 斗胆聊聊:大龄程序员的出路在哪里

第三,做课程,就像我一样,实际上做课程是比较难的一件事,因为要把一个技术真正研究透彻才能讲出好的课程,但是做课程风险相对比较小,因为只要课程做出来了,总能卖出去几个吧,其实我觉得我现在就像一个作家,作家的工作是写书,我的工作是做课程,作家靠书活着,我靠课程活着,因此,对于程序员而言,你可以花时间研究某个技术,然后将他做成课程或书籍,比如掘金小册,也是能拿到收入的。首先,作为程序员,虽然没有其他职业那么多的人情世故,但仍然是职场人,仍然是公司的牛马,是给老板打工的,那作为职场人,职场目标是什么?

2024-07-15 16:58:51 399

原创 十大步骤分析GraphRAG的工作原理

第七步,社群检查,通过前面的步骤,可以从所有文本单元中抽取出所有的实体信息、关系信息、事件信息,社群检查就是利用这些信息将实体进行分类,比如周瑜和孙策属于吴国,曹操和司马懿属于魏国,刘备和关羽属于蜀国,而吴国、魏国、蜀国都属于东汉,其中东汉是一个大社群,魏蜀吴是三个小社群,当执行查询时,可以指定社区的级别,如果指定的是低级别社群,那么查找的结果就比较微观,比如问三国时期有哪些著名人物,如果指定的社群为吴国,那么匹配的就只有周瑜和孙策,如果指定的社群为东汉,那么就能找到更多的著名人物。

2024-07-14 22:39:30 1190

原创 Spring Cache核心源码分析

Spring Cache整体而言,就是利用Spring AOP机制,利用代理对象在执行方法时对缓存进行操作,除开以上源码流程外,其实还有比如@EnableCaching的实现源码,以及RedisCache是怎么和Redis进行交互的实现源码,下次再分析吧,我是大都督周瑜,记得关注我,大家如果有收获,帮忙分享。

2024-07-07 14:58:25 916

原创 @ConfigurationProperties结合Nacos配置动态刷新之底层原理分析

当Nacos服务端的配置发生改变时,会触发Nacos客户端的配置监听器,从而发布事件,从而更新对象,从而发布事件,从而利用最新的对象更新对象中的属性。

2024-05-28 22:37:32 1512

原创 微服务启动慢,看我如何消灭这些憨憨怪!

这样SpringBoot启动时就只会扫描指定的包路径,这样Bean扫描的效率就会高很多,从而提高应用的启动速度,经过我测试,应用的启动速度又缩短了50秒左右,现在距离目标1分钟只有10秒左右了,开心。另外告诉大家一个秘密,我测试的这个微服务中总共有2000多个Bean对象,300个多@Service,200个@RestController~~~~欢迎关注我的公众号:IT周瑜。获取更多技术干货、免费经典面试资料。

2024-04-29 22:33:04 7456 11

原创 同样的代码,开发环境生效,测试环境不生效,记一次问题排查过程和原因分析

我接着解压测试环境中core2的jar包,发现这个jar包中确实有这个Controller,也就是当前微服务用到的两个core中都有这个Controller,包名类名都一样,但是内容不一样,core2中是旧版本,core1中是新版本,好了,现在问题的表面原因就是core1中新版本Controller没有生效,而旧版本的Controller生效了,这是因为它们两个类名一样,相当于beanName冲突了,所以只有其中一个生效,而此时旧版本胜出了,它生效了,从而导致新增的接口没有生效。这就是解决问题的快乐!

2024-02-06 20:53:47 757

原创 必收藏面试题:什么是SQL注入?以及Mybatis中#号和$号之间的区别?

先看两段代码,假如id的值为字符串"100",大家可以顺便想想每段代码最后拼接出来的SQL长什么样。字符串直接拼接参数通过占位符?和setString()方法拼接参数这两种方式有什么不同吗?通过占位符?看上去区别不大,但是对于id=100来说,id是varchar,100是int,对于mysql来说是要做类型转换的,这个过程其实是会导致问题的,下篇文章再来分析,关注我的公众号:IT周瑜通过占位符?仔细看看,看出区别没,直接拼接参数的将能查出全部数据,因为or 1=1生效了,而通过?

2024-02-03 10:46:28 818

原创 面试官:什么是垂直越权?有哪些解决方案?

假如系统中有一个删除数据的接口,这个接口正常情况下只有管理员登录到管理台才能调用到这个接口,但是有一个用户小勇,一个调皮的程序员,他猜到了这个接口的URL,然后用postman直接调用了删除接口,哦吼,数据被删了,这就是垂直越权,本来用户没有权限,但是通过某种手段向上拿到了更高的权限。这种场景出现的原因,一方面是小勇太聪明加胆子大,另外一方面是接口没有做权限验证,所以,开发时,我们不能假定该接口只会被管理员调用,而应该做到该接口只能被管理员调用。我给大家列三种解决方案,大家看看哪种方案最好。

2024-01-16 21:27:39 982

原创 MyBatis-Plus中默认方法对应的SQL到底长啥样?

现在网络上有很多的文章和视频,但是其中大部分都是一些八股文和理论知识,由不同的人翻来覆去,重复写、重复发,这种做法对作者本身是有用的,但是对于大部分读者来说可能是没有意义的,对于读者来说,不管是面试还是实际工作,我相信实战经验才是真正有价值的,所以我现在的分享都来源于我的实际工作,再结合我多年讲课的经验,希望做到把。这个方法里面就会负责生成SqlSource对象,有了SqlSource对象在结合方法信息,就可以生成MappedStatement对象了,注意该返回的就是MappedStatement对象。

2023-12-24 12:49:32 1208

原创 明明定义了Bean,为什么就是依赖注入不了,奇了个大怪!

所以Service中在进行依赖注入时,只能找到RedisTemplate类型的Bean,而找不到DaduduRedisTemplate类型的Bean,除非!现在网络上有很多的文章和视频,但是其中大部分都是一些八股文和理论知识,由不同的人翻来覆去,重复写、重复发,这种做法对作者本身是有用的,但是对于大部分读者来说可能是没有意义的,对于读者来说,不管是面试还是实际工作,我相信实战经验才是真正有价值的,所以我现在的分享都来源于我的实际工作,再结合我多年讲课的经验,希望做到把。的Bean,可是我明明定义了呀…

2023-12-20 12:52:12 512

原创 Java字节码操作神器:Javassist入门指南

Javassist是一个强大的字节码操作工具,它提供了在运行时编辑Java字节码的能力。通过Javassist,开发人员可以动态地创建和修改Java类。这使得在不重新编译整个程序的情况下,能够对类进行动态修改和增强。Javassist为Java程序员提供了一个强大而灵活的工具,用于在运行时操作字节码。通过这个工具,你可以动态地创建、修改和分析类,为你的应用程序提供更高的灵活性和可扩展性。当然,在使用Javassist时,需要小心谨慎,确保对字节码的修改是正确的,以避免潜在的问题。

2023-12-04 20:11:09 1114 1

原创 Seata整合Sharding-JDBC后分支事务回滚失败原因分析(高质量)

大家好,我是爱读源码的大都督,最近在做seata的升级改造,由于项目中既用到了seata,也用了sharding-jdbc,并且之前同事对他们进行改造,为了知道改造的原因,我做了一些测试,发现seata和sharding-jdbc同时使用时确实会出现问题,所以写这篇文章来记录一下,并分享给有需要的朋友。如果时间不够,并且对seata和sharding-jdbc的原理有一定了解的话,可以直接看最后的总结。

2023-11-26 20:27:54 1838

原创 数据库优化之:like %xxx%该如何优化

再来简单分析一下索引条件下推的原理,在执行查询时先利用SQL中所提供的created_at条件在联合索引B+树中进行快速查找,匹配到所有符合created_at条件的B+树叶子节点后,再根据company_name条件进行过滤,然后再根据过滤之后的结果中的主键ID进行回表找到其他字段(回表),最终才返回结果,这样处理的好处是能够减少回表的次数,从而提高查询效率。就一定会导致索引失效,原理也可以配合其他字段一起来建联合索引,从而使用到索引条件下推机制。就会利用到索引条件下推机制,比如下图中Extra里的。

2023-11-16 21:53:15 1853

原创 SQL拦截:想要限制每次查询的结果集不能超过10000行,该如何实现?

对于一些Saas化软件,当某个租户在执行查询SQL时,如果查询条件出现了BUG,导致去查了所有租户的数据,这种情况是非常严重的,此时就需要在架构层面做限制,禁止一些特殊SQL的执行,另外,为了保护数据库,也可能会限制某些查询语句不要查询太多的数据,那么怎样在平台架构层面对业务层的SQL做拦截和校验呢?这种方式的好处是:如果某个查询SQL确实超过限制了,那么就它被拦截了,但是缺点是:如果很多SQL并没有超过限制,那么就多余执行了count语句,降低了性能。,里面也有我的联系方式,欢迎勾搭。

2023-11-14 21:56:23 5613

原创 聊聊@Validated和@Valid注解的底层实现

Valid注解是JSR中定义的Java规范,Hibernate对这个注解进行了实现,并且在Spring MVC中,在执行Controller中的方法时会尝试获取验证器并对参数进行验证。@Validated注解是Spring提供的,意图是能够让@Valid注解在更多的地方使用并生效,@Validated注解本质上就是一个切面,使得在执行非Controller的方法时能够触发对@Valid等注解的验证。!!欢迎大家留言讨论,我是爱读源码的大都督周瑜,欢迎关注我的公众号:Hoeller。

2023-11-11 12:37:27 820

原创 到底是Nacos先进行服务注册,还是Tomcat先启动

结论得出来了,但是具体是怎么实现的呢,让我来带大家一探究竟。不过Spring容器启动过程中,在调用finishRefresh()之前其实会先调用onRefresh()方法,而Spring Boot中重写了onRefresh()方法,并且在该方法中也会做和Tomcat相关的事情,那就是。从以上过程可以看出,服务注册的时间点其实是由AbstractAutoServiceRegistration定义的,也就是由Spring Cloud定义的,Nacos只是负责实现具体的注册逻辑。

2023-10-19 17:22:14 426

原创 ThreadLocal有哪些应用场景,开源框架中都是如何使用的?

公众号:Hoeller,有精品面试题(不是很多,150道,但很经典)前几天发了一篇关于ThreadLocal和ScopedValue的文章,发现很多同学对ThreadLocal在实战中一般会用在那些场景不太清楚,所以这篇文章我结合我看过的源码来给大家总结一下。

2023-10-13 15:27:40 192

原创 Spring官网是如何解释ApplicationContext和BeanFacotry的区别的

诸如扫描、解析@Bean、解析@Import等都属于解析配置类,而解析配置类这个功能是ApplicationContext才有的,BeanFactory是没有的,这也是ApplicationContext强大的地方,另外像BeanFactoryPostProcessor机制也是ApplicationContext中提供的。接口提供了一种先进的配置机制,可以用于定义和管理对象,而且它不受对象类型的限制,可以用于管理各种类型的对象,使Spring框架非常灵活和适用于各种应用场景,

2023-10-12 12:23:40 81

原创 极简Go语言教程

因为有了类型推导,所以var关键字也可以不写,使用:=来定义变量并赋值。

2023-10-11 11:44:58 128

原创 ThreadLocal不香了,ScopedValue才是王道

绑定值时都需要指定一个方法,这个方法就是所绑定值的作用域,只有在这个作用域中的方法才能拿到所绑定的值。属性指向上一次所生成的Snapshot对象,并且在Thread类中新增了一个属性。,Snapshot对象中记录了所绑定的值,而Snapshot对象有一个。就介绍到这啦,下次继续分享JDK21新特性,欢迎大家关注我的。在Java中,当多个方法要共享一个变量时,我们会选择使用。方法中拿到的值为“xiaodudu”,但是。方法中是拿不到的(报错了),

2023-10-08 17:39:48 412

原创 为什么一个线程中有两个ThreadLocalMap?

本来是想介绍的,但是牵扯到和先贴出Thread类中的源码方便理解问题:先给出结论:当我们使用来共享值时用的是线程中的threadLocals属性,当我们使用来共享值时用的是inheritableThreadLocals属性。

2023-10-06 21:29:09 165

原创 线程池不香了,结构化并发才是王道

我个人的理解是通过结构化并发,可以将多个并发子任务组合成一个大任务,并且这个大任务可以控制子任务的执行进度,就算子任务已经开始执行了也可以被中止(为了做到这一点就需要利用。理解为一个线程池,而应该把它理解为一个任务,一个StructuredTask,然后利用它fork了两个子任务,然后join等待两个子任务执行完,最后获取任务结果。针对这个需求,我们可以同时开两个线程,并行执行获取用户信息和获取订单信息两个任务,等到两个任务都执行完并拿到结果后才组装数据返回给前端。好了,你是怎么理解结构化并发的呢?

2023-10-02 14:19:47 174

原创 JDK21中虚拟线程到底是什么?看完便知

本文涉及到的技术:虚拟线程、结构化并发、线程池、TheadLocal,对原理感兴趣的可以直接跳到原理部分。虚拟线程是JDK19中引入的,JDK21正式发布,我们先来看看虚拟线程的几种用法,然后再来分析底层实现原理。先定义一个Runnable:通过观察输出结果,就能知道当前运行Task的是不是。

2023-09-30 08:58:18 4312 2

原创 Spring扫描,扫尽一切困惑

Spring在解析配置类上的@ComponentScan时会进行扫描,会把扫描得到的BeanDefinition对象注册到Spring容器中。好了,今天的内容就分享到这,举头望明月,低头看源码,我是爱读源码的大都督,关注我,一起品味源码。

2023-09-28 10:43:57 219

原创 美团简单版动态线程池源码实现

动态线程池

2022-09-18 17:53:54 742 1

原创 Nacos经典7道面试题

Nacos面试题

2022-09-14 14:11:50 43147

原创 Apisix使用教程

强大的微服务网关APISIX

2022-09-13 17:31:58 1533

原创 Nacos入门使用教程

Nacos入门教程

2022-09-04 21:26:45 10817 1

原创 ElasticJob入门使用教程

单线程执行,若前一个任务执行时间较长,会导致下一个任务饥饿阻塞无分布式协调机制,如果只有一个节点就会单点风险,如果部署多个节点就会有并发执行的问题随着任务规模增多,无统一视角对其进行任务进度进行追踪和管控功能比较简单,没有超时、重试等高级特性。

2022-09-04 21:18:03 4315 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除