自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 如何爱上写项目、写好项目,不妨看看我的做法

相信大家也是很讨厌写注释,但是写注释不仅能让别人能懂你的代码,更重要是自己在阅读代码的时候能更好的快速回顾自己的代码是干了什么,能帮助自己快速的维护,现在都是 AI 时代,我自己写代码的时候对于普通的代码我都会使用 AI(CodeGeex)来进行注释生成、比较特殊的代码我会自己进行注释修改。像我写项目有个习惯,我不喜欢一上来就开始写项目,我喜欢先配合 GPT 给我的项目取个好听的名字🔥,我经常是这样干的,比如说我的微狗、短链狗、SQL 慢镜 也是有问过 GPT 的意见。心里对开发项目的兴趣又高了几分。

2024-05-10 15:55:09 1107

原创 每日一题:Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

简单执行器每次操作都创建新的 Statement;重用执行器缓存并重用 Statement;批量执行器同样重用 Statement 但会在执行多个更新语句时进行批处理。

2024-07-19 14:01:06 227

原创 已老实!公司的代码再也不敢乱改了!

大家好,我是聪。想必对于很多初入职场,心中怀着无限激情的兄弟们,对于接手老代码都会有很多愤慨,碰到同事的代码十分丑陋应不应该改!我也是这样,我相信有很多人同样有跟我一样的经历。满打满算实习 + 正式工作,我也敲了两年多代码,我今天来说说我自己的看法吧。

2024-07-19 13:59:42 787

原创 每日一题:ElasticSearch 如何避免脑裂?

1)主节点选举:ES 使用 Zen Discovery 模块进行主节点选举,确保只有一个主节点管理集群元数据。2)仲裁节点数:配置集群的最小主节点数,这个值需要大于总节点数的一半,以确保仲裁节点数达到,避免脑裂。4)网络故障处理:通过配置网络超时和重试机制,减少网络故障带来的影响,防止临时性网络分区导致脑裂。3)集群健康检查:定期进行集群健康检查,如果发现分区,集群会自动尝试恢复并重新连接。

2024-07-18 11:12:03 117

原创 ‍我想我大抵是疯了,我喜欢上了写单元测试

大家好我是聪。相信有不少的小伙伴喜欢写代码,但是对于单元测试这些反而觉得多此一举,想着我都在接口文档测过了!还要写什么单元测试!写不了一点!!由于本人也是一个小小程序猿🙉,我以前也不喜欢写,最近给扔到了另一个 leader 的项目组里面,刚进去他给我下达的命令就是,你写的代码逻辑都要给我写上单元测试,而且要生成覆盖率报告给我!哇!我顿时就难受了,我之前都没有这么严格的,但是呢最近在我疯狂的写单元测试下,我发现我爱上了写单元测试。

2024-07-18 11:09:11 2790 5

原创 失算!我的注册接口被搞了

大家好我是聪,前几天有人说要搞我的接口,我以为他口嗨,昨天快下班的时候去数据库一看!没想到他去搞了我的注册接口!给我刷了两百万条数据!(小意思哈哈开个玩笑)。本次代码已上传短链狗,可以到我的Github短链项目进行查看喔:https://github.com/lhccong/short-link-dog-backend。

2024-05-30 15:39:07 1140

原创 面试官问懵我了究竟什么是 SpringCloud?

Spring Cloud 是一系列框架的集合,旨在为分布式系统的开发提供解决方案。它基于 Spring Boot,利用 Spring Boot 的快速开发特性,帮助开发者快速构建分布式微服务架构系统。Spring Cloud 通过集成和封装各种成熟的开源解决方案,提供了配置管理、服务发现、负载均衡、断路器、分布式追踪、消息驱动微服务、网关路由等功能。了解了 SpringCloud 提供了什么能力,现在跟着我来简单了解一下这些能力是干嘛的,别等了!来吧:1)配置管理:集中管理配置,支持动态刷新。

2024-05-30 15:37:22 669

原创 instanceof 关键字的作用

其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果 result 都返回 true,否则返回 false。注意:编译器会检查 obj 是否能转换成右边的 class 类型,如果不能转换则直接报错,如果不能 确定类型,则通过编译,具体看运行时定。

2024-05-27 16:26:18 406

原创 我被恐吓了,对方扬言要压测我的网站

大家好我是聪,昨天真是水逆,在技术群里交流问题,竟然被人身攻击了!骂的话太难听具体就不加讨论了,人身攻击我可以接受,我接受不了他竟然说要刷我接口!!!!🔥本次的自动加入黑名单拦截代码已经上传到短链狗,想学习如何生成一个短链可以去我的 Github 上面查看哦,项目地址:https://github.com/lhccong/short-link-dog-backend。

2024-05-27 16:24:19 433 3

原创 请介绍类加载过程,什么是双亲委派模型?

📑双亲委派模型(Parent Delegation Model)是Java类加载机制的一种重要实现方式,它基于一个简单的原则:当一个类加载器收到类加载的请求时,它首先不会自己去尝试加载这个类,而是把请求委托给父类加载器去完成。这个过程是递归的,一直向上委托,直至顶层的启动类加载器。只有当父类加载器无法完成加载请求时,子类加载器才会尝试加载。✅双亲委派模型的好处在于它能够保证Java核心库的类不会被自定义的类加载器所替代,从而确保Java核心库的安全性和一致性。

2024-05-21 11:28:26 283

原创 为什么不推荐多表Join?

1)⭐多表 Join 操作可能导致性能问题,尤其是在处理大数据量时,Join 操作需要对参与联接的每个表进行扫描、匹配和组合,消耗大量的 CPU 和内存资源,从而导致查询时间变长。2)⭐难以维护,影响代码阅读。2)⚡多表 Join :你需要先在多个目录中分别查找,然后将这些目录信息进行匹配和组合,找到目标书籍。数据库优化器在处理复杂的多表 Join 查询时,可能无法选择最佳的执行计划,导致性能不佳。为了提高多表 Join 查询的性能,需要为每个表创建合适的索引,但这也增加了索引设计和维护的复杂性。

2024-05-21 11:26:07 545

原创 最让人易懂的回答:int(11) 这个 11 是什么意思?

表示字段的显示宽度,而不是存储的整数值的长度或大小。整数数据类型的宽度是用于用于显示和填充的,而不是限制存储的范围。这样的设置主要是为了在查询结果中保持一致的显示格式,方便阅读和理解。但请注意,这并不会改变存储的整数值本身。在MySQL数据库中,int(11) 中的。,那么你查询该结果表时则会发现,时,而你输入的整形为。

2024-05-17 14:02:01 199

原创 研究了 4.7 个小时终于了解到了索引使用了却没变快的原因

大家好,我是聪,一个乐于分享的小小程序员。前几天我竟然碰见了加了索引,查询效率反而降低了 0.06% ,知道我排查才发现,原来可能是索引没生效,我赶忙来总结一下没生效的原因。

2024-05-17 14:00:07 736

原创 Java提供了哪些IO方式❓NIO如何实现多路复用❓

Selector 是一个多路复用器,可以监控多个通道的 I/O 事件(如连接请求、数据到达等)。

2024-05-15 09:43:10 368

原创 用好 explain 妈妈再也不用担心我的 SQL 慢了

大家好,我是聪,一个乐于分享的小小程序员。在不久之前我写了一个慢 SQL 分析工具,可以用来分析 Java Mybatis 项目的 SQL 执行情况,其中刚好涉及到了 explain 的使用。感兴趣的可以了解一下。Github 地址⭐:https://github.com/lhccong/sql-slow-mirror

2024-05-15 09:38:33 932

原创 Inner Join、Left Join、Right Join 有啥区别?

当两个表的连接字段都存在匹配的行时,这条行才会出现在结果集中。相反,它会返回右表(右边表)的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则会返回 NULL 值。会返回左表(左边表)的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则会返回 NULL 值。时,结果行数的范围表示为:左表行数

2024-05-13 09:37:36 123

原创 脏读、不可重复读、幻读分别是什么?

来说说它们之间的区别吧,很多人容易搞混了,脏读是对于读取到了别的事务未提交的数据,幻读是指在事务期间,对于数据总量的突然增加或减少,将别的事物提交的读取到了(针对于数据的数量),不可重复读是指对于同一条数据,在事物执行期间,里面的字段内容发生了变化,读取到了别的事物提交修改的数据。(针对于数据的内容)。举个例子:当事务 A 开始执行,先查询了一条金额为 100 的数据,在这期间,事务 B 将这条数据修改了,金额变成了 80 ,并提交了事务,当事务 A 再次读取时,金额变成了 80,这就是不可重复读。

2024-05-13 09:34:54 465

原创 面试官:请介绍类加载过程,什么是双亲委派模型?

🚀类加载过程是指在 Java 程序运行时,将类的字节码文件加载到内存中并转换为 Class 对象的过程。Java 类加载器负责加载类,其主要任务是在运行时查找和装载类文件,以生成对应的 Class 对象。

2024-05-11 08:53:44 127

原创 回表的原理竟然这么简单

回表” 是指在使用辅助索引(非聚簇索引)作为条件进行查询时,由于辅助索引中只存储了索引字段的值和对应的主键(聚簇索引)键值,因此需要根据主键(聚簇索引)中的键值去查找实际的数据行,这个过程被称为回表。举个例子:select * from user where age = 20;

2024-05-11 08:50:42 195

原创 脏读、不可重复读、幻读分别是什么?

来说说它们之间的区别吧,很多人容易搞混了,脏读是对于读取到了别的事务未提交的数据,幻读是指在事务期间,对于数据总量的突然增加或减少,将别的事物提交的读取到了(针对于数据的数量),不可重复读是指对于同一条数据,在事物执行期间,里面的字段内容发生了变化,读取到了别的事物提交修改的数据。(针对于单条数据的内容)。举个例子:当事务 A 开始执行,先查询了一条金额为 100 的数据,在这期间,事务 B 将这条数据修改了,金额变成了 80 ,并提交了事务,当事务 A 再次读取时,金额变成了 80,这就是不可重复读。

2024-05-10 15:55:56 258

原创 synchronized底层如何实现❓什么是锁的升级、降级❓

锁降级是指锁状态从重量级锁转变为轻量级锁或偏向锁的过程。1)轻量级锁🚩:当一个线程进入同步块时,如果目标对象没有被锁定,JVM 会在当前线程的栈帧中创建用于锁记录的空间,尝试使用 CAS 操作将对象头的 Mark Word 更新为指向锁记录的指针。1)锁升级:这个过程就像是门的锁从一个简单的转把锁(偏向锁),到需要钥匙才能打开的锁(轻量级锁),再到需要门卫控制的高级锁系统(重量级锁)。3)从轻量级锁到重量级锁:当轻量级锁的竞争发生时,即 CAS 失败,锁会升级为重量级锁,线程进入阻塞状态,等待锁释放。

2024-05-09 14:50:26 1213

原创 来!给我讲讲分库分表!

你好面试官,在我的理解中分库分表分为四个类型,垂直分表、垂直分库、水平分表、水平分库。

2024-05-09 14:47:18 363

原创 索引下推原来就这?

通过将部分带有索引的条件交由存储引擎层进行过滤操作,从而减少了 IO(本该由 Server 层做操作,交由 存储引擎层因此叫做 “下推” )。4)如果查询使用了 聚簇索引(主键)查询,索引下推也不会生效,因为其是对于非聚簇索引来进行减少回表次数。3)再通过主键 ID 分别进行回表查询出来得到最终结果[有三个主键 ID 需要回表 3 次]。2)再通过主键 ID 分别进行回表查询出来[有四个主键 ID 需要回表 4 次]。来进行索引过滤,分别找到多条主键 ID 分别是(1、3、6)数据。

2024-05-08 14:15:20 209

原创 2024 年你不懂使用了索引反而变慢如何排查你就 OUT 啦

索引失效的场景有很多,也是面试官经常喜欢问的,可以根据具体场景进行排查,具体场景可以分为以下几点

2024-05-08 14:13:08 1040

原创 面试官:谈谈你知道的设计模式❓

使用场景🚀:当多个子类有共有的方法,并且逻辑基本相同时,把这些逻辑算法放在单一的模板方法中,子类通过实现抽象方法来提供详细的实现,例如,算法的框架。使用场景🚀:当需要表示对象的部分-整体层次结构,并希望用户忽略组合对象与单个对象的不同,统一地使用组合结构时,例如,图形编辑器中的图形和图形组。使用场景🚀:当作用于某对象结构中的各元素的操作需要改变,而对象结构不变时,例如,在不改变集合元素的类的情况下增加新的操作。使用场景🚀:当有多种算法相似,客户端希望动态地选择使用哪一种算法时,例如,不同类型的排序算法。

2024-05-07 09:49:45 919

原创 面试官问:建索引需要注意什么?

6)对经常在 order by、group by、distinct 后面的字段建立索引。2)对于字段的值有大量重复的不要建立索引。比如说:性别字段,在这种重复比例很大的数据行中,建立索引也不能提高检索速度。在 where 关键词后经常查询的字段,建立索引能提高查询的效率。随着数据的增加和修改,索引的性能可能会下降,可以通过重新构建索引或者重新组织索引来提高性能。4)当数据表的修改频率大于查询频率时,应该适当建立索引。因为建立索引会减慢修改的效率,提高查询的效率。1)不能盲目的建立索引。

2024-05-07 09:46:33 172

原创 有哪些方法可以在运行时动态生成一个Java类?

这种方法不需要编写实现类的源代码,只需要定义一个实现了 InvocationHandler 接口的类,Java 在运行时会为指定的接口生成实现。虽然反射 API 本身不直接提供生成新类的功能,但可以用于动态调用构造函数、方法和访问字段,这在某些情况下可以作为动态生成类的一部分。2)Javassist:提供了相对更简单的 API 来处理字节码,允许在运行时修改类,不需要对字节码有深入理解。这些库提供了在运行时直接操作或生成 Java 字节码的能力,从而允许创建全新的类或修改现有类的行为。

2024-05-06 10:26:09 354 3

原创 什么叫索引下推?

通过将部分带有索引的条件交由存储引擎层进行过滤操作,从而减少了 IO(本该由 Server 层做操作,交由 存储引擎层因此叫做 “下推” )。4)如果查询使用了 聚簇索引(主键)查询,索引下推也不会生效,因为其是对于非聚簇索引来进行减少回表次数。3)再通过主键 ID 分别进行回表查询出来得到最终结果[有三个主键 ID 需要回表 3 次]。2)再通过主键 ID 分别进行回表查询出来[有四个主键 ID 需要回表 4 次]。来进行索引过滤,分别找到多条主键 ID 分别是(1、3、6)数据。

2024-05-06 10:23:28 385

原创 如何保证集合是线程安全的? ConcurrentHashMap 如何?

这样,当多个线程访问不同段的数据时,线程之间就不会发生竞争,从而大大提高了并发访问的效率。在内部进一步优化,使用了一种基于节点的锁定机制,来进一步降低锁的竞争,并提高扩展性。它通过使用一种称为“红黑树”的数据结构来存储高冲突的键,从而在面对高冲突的环境时也能保持良好的性能。类提供了一些静态方法,可以将非线程安全的集合包装成线程安全的集合。这些集合通过内部的锁定机制或者其他并发控制手段来保证多线程访问的安全。这些方法返回的集合通过一个内置的对象锁来同步所有的访问。包提供了一系列的线程安全的集合类,例如。

2024-04-30 11:29:18 215 2

原创 今天来说说一条 SQL 语句的执行过程

在这条查询语句中,大体可以分为两个层面,Server 层和存储引擎层,顾名思义,在 Server 层中涉及到一系列的业务的组件下面会讲述各个组件的功能,而存储引擎层则是负责存储发送过来的数据、提供读写接口等功能(补充:MySQL 的存储引擎是插件式的,一个数据库里面的不同表可以用不同的存储引擎)。,它先会判断你对这个 user 表是否有权限查询,如果没有权限它将会拒绝本次查询,返回错误信息。如果有权限,它将会根据表的存储引擎提供的接口进行数据查询将重复遍历表的行数据,判断 id 字段是否等于 1。

2024-04-30 11:20:10 333

原创 每日一题:对比Hashtable、HashMap、TreeMap有什么不同❓

1)Hashtable🧡2)HashMap💡3)TreeMap🔍1)Hashtable🚆:可以比喻为一辆老式火车,它的运行是非常稳定和可靠的,因为它采用了同步措施,确保了每一个操作都是安全的。不过,正因为其老旧和同步的特性,它在速度和效率上不如现代化的交通工具,特别是在需要快速发展的现代应用场景中。2)HashMap🚗:则可以看作是一辆私家车,它在日常使用中提供了极大的便利性和效率。私家车不需要像火车一样严格的时刻表和运行轨迹,你可以随意驾驶到任何地方,就像 HashMap 允许用户灵活地存取数据

2024-04-29 09:59:14 360

原创 每日一题:对比 Java 标准 NIO 类库,你知道 Netty 是如何实现更高性能的吗❓

2)✅零拷贝技术:Netty 在内部实现中采用了零拷贝技术,(斤斤计较)减少了数据在 内存 和 IO 设备之间的复制次数,降低了 内存 和 CPU 的消耗。🌰:使用池化的 Direct Buffer 等技术,在提高 IO 性能的同时,减少了对象的创建和销毁。3)✅优化的线程模型:Netty 采用了多线程模型,通过使用少量的线程处理大量的并发连接,可以更充分地利用多核处理器的性能。同时,Netty 提供了线程池和任务队列等机制,可以灵活地控制线程的数量和任务的调度,提高了系统的吞吐量和响应速度。

2024-04-29 09:57:25 236

原创 每日一题:对比Vector、ArrayList、LinkedList有何区别❓

使用 Vector 当需要线程安全的操作时,但考虑到性能,通常有更好的选择。ArrayList 适用于当添加或访问元素比删除更频繁时。LinkedList 适用于频繁插入和删除元素的场景,特别是在列表的开头或中间,以及当需要额外的队列/栈功能时。

2024-04-26 10:56:09 666

原创 二级缓存实现起来竟然如此简单!

作为面试者的扩展延伸:我在本地缓存的实现中,我使用到了本地缓存性能之王 Caffeine 作为一级缓存,在市面上很多像 Redisson、Druid、Hbase 等知名开源项目都用到了 Caffeine 。它实现了更加好用的缓存淘汰算法 W-TinyLFU 算法,结合了 LRU(最近最久未使用算法) 算法以及 LFU(最少使用算法) 算法的优点,所以选择它能使本地缓存的使用更加方便快速。

2024-04-26 10:54:13 993

原创 每日一题:Int 和 Integer 有什么区别❓

选择使用int还是Integer主要取决于使用场景。如果对性能有较高要求且不需要对象的特性,使用int更合适。如果需要使用集合框架或需要空值null表示缺失值,那么使用Integer更加适合。

2024-04-25 09:48:46 355 1

原创 每日一题:动态代理是基于什么原理❓

动态代理是一种在运行时动态生成代理对象,并在代理对象上进行方法调用的编程技术。它主要用于在不修改原有代码基础上,增加或改变某些功能的执行流程。动态代理广泛应用于 AOP(面向切面编程)、RPC(远程过程调用)、事务管理等领域。

2024-04-25 09:45:44 389

原创 每日一题:String、StringBuffer、StringBuilder有什么区别❓

使用String时适合字符串不经常变化的场景。StringBuffer适用于需要频繁修改字符串内容的多线程环境,因为它保证了线程安全。StringBuilder是在单线程环境下处理频繁的字符串操作的首选,因为它比StringBuffer提供了更高的性能。

2024-04-24 10:08:57 158

原创 每日一题:Spring 框架中都用到了哪些设计模式❓

总之,Spring 框架中充分利用了许多设计模式,提供了良好的扩展性和灵活性,降低了代码的耦合度,提高了代码的可维护性。

2024-04-24 10:07:18 409

原创 Java 执行 JVM Native 方法导致内存碎片

Java 执行 JVM Native 方法导致内存碎片

2024-04-23 14:19:01 370 1

原创 每日一题:Redis 中的内存淘汰机制、有哪些内存淘汰策略❓

💡 Redis 是一种基于内存的键值数据库,由于内存有限,当 Redis 占用的内存达到上限时,就需要进行内存淘汰,以腾出一些内存空间。3)内存淘汰策略:当 Redis 内存占用达到上限时,会根据内存淘汰策略来选择一些键进行删除,以腾出更多的内存空间。1)定期删除:Redis 可以设置一个定时器,定期扫描键空间中的键,并删除已经过期的键。2)惰性删除:当一个键过期时,Redis 不会立即删除该键,而是等到该键被访问时再删除。4)volatile-lru:从已设置过期时间的键中选择最近最少使用的键进行删除。

2024-04-23 11:04:49 304

空空如也

空空如也

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

TA关注的人

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