自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot 中 10 个神器,建议收藏~

Spring Boot 的这些内置功能覆盖了从开发到运维的全链路流程,合理运用这些工具,既能减少重复代码,又能提升系统的可维护性与健壮性。Spring Boot 最显著的生产力提升工具之一是 Starter 依赖体系,通过命名规范清晰的 “一站式” 依赖包,开发者无需手动搜索和匹配兼容版本,框架自动处理传递依赖冲突。在 Spring Boot 开发中,框架内置的诸多实用功能犹如一把把利刃,能让开发者在项目的各个阶段都事半功倍。在调试和监控阶段,记录请求的完整信息是定位问题的关键。

2025-11-20 21:53:38 781

原创 从 OpenFeign 到 RestClient:Spring Cloud 新时代的轻量化 HTTP 调用方案

维度OpenFeign是否官方维护❌ Netflix 停止维护✅ Spring 官方维护性能一般优秀声明式调用✅✅自动发现✅✅熔断支持响应式❌✅适配 Spring Boot 3+⚠️ 部分兼容✅ 完全兼容一句话总结在 Spring Boot 3.2+ 时代,是 Feign 的完美替代方案。

2025-11-20 21:53:00 940

原创 MyBatis-Plus 深度指南:从基础到实战,让 DAO 层开发效率起飞!

MyBatis-Plus 可以理解为「MyBatis + 瑞士军刀皮肤 + 防删库保险栓」—— 它在保留 MyBatis 原生特性的基础上,通过 "零侵入" 设计实现了单表操作的极简开发。瑞士军刀般的便捷性:将 XML 配置的 "青铜时代" 升级为 Lambda 表达式的 "赛博坦时代",用极简代码实现复杂操作;保险栓级的安全性:通过拦截器让 "delete from table" 这类危险操作成为不可能,从源头避免删库风险;零侵入的兼容性。

2025-11-20 21:51:30 1010

原创 LatchUtils:简化Java异步任务同步的利器!

在Java应用开发中,为了提升系统性能和响应速度,我们经常需要将一些耗时操作(如调用外部API、查询数据库、复杂计算等)进行异步并行处理。当主流程需要等待所有这些并行任务执行完毕后再继续时,我们通常会用到等并发工具。然而,直接使用这些原生工具,往往意味着需要编写一些重复的、模式化的“胶水代码”,这不仅增加了代码量,也让核心业务逻辑显得不够清晰。为了解决这个问题,我封装了一个名为LatchUtils的轻量级工具类。它能够以一种极其简洁的方式来组织和管理这一类异步任务。

2025-11-20 21:50:17 467

原创 还不懂Docker?一个故事安排的明明白白!

经过一番研究,Docker如获至宝,原来这CGroup和namespace类似,也是Linux帝国的一套机制,通过它可以划定一个个的分组,然后限制每个分组能够使用的资源,比如内存的上限值、CPU的使用率、硬盘空间总量等等。看来必须得对这些进程进行管控,防止他们干出出格的事来。Docker连连摇头说到:“长老有所不知,虚拟机这家伙笨重如牛,体积又大,动不动就是以G为单位的大小,因为它里面要运行一个完整的操作系统,所以跑起来格外费劲,慢就不说了,还非常占资源,一台机器上跑不了几台虚拟机就把性能拖垮了!

2025-11-13 21:58:47 385

原创 一口气搞懂分库分表 12 种分片算法,大厂都在用

我们一起梳理下框架中的核心部分分片策略和分片算法,其内部针为我们提供了多种分片策略和分片算法,来应对不同的业务场景,本着拿来即用的原则。这次将详细介绍如何在中实战 5 种分片策略和 12 种分片算法,自定义分片算法,比较它们的应用场景以及优劣。分片策略是和的组合策略,真正用于实现数据分片操作的是分片键与相应的分片算法。在分片策略中,分片键确定了数据的拆分依据,分片算法则决定了如何对分片键值运算,将数据路由到哪个物理分片中。由于分片算法的独立性,使得分片策略具有更大的灵活性和可扩展性。这意味着可以根据具体需求

2025-11-13 21:58:05 1060

原创 优雅!优化if-else代码的八种方案

有朋友表示,当前代码很多if-else阅读起来有点困难,如何优化?确实,如果代码中如果if-else比较多,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。

2025-11-13 21:56:21 438

原创 聊聊 Mybatis 动态 SQL?

如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。Mybatis 借助功能强大 OGNL 表达式,可以根据参数条件,动态生成执行 SQL。使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。这条语句提供了可选的查询博客文章列表 ,如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 博客都会返回。

2025-11-13 21:55:33 328

原创 一文搞定JVM相关的命令汇总,推荐收藏!

虽然目前市场上有很多成熟的 JVM 可视化监控分析工具,但是所有的工具其实都依赖于 JDK 的接口和底层相关的命令,了解这些命令的使用对于我们在紧急情况下排查 JVM 相关的线上故障,会有更加直观的帮助。下面我们一起来看看 JVM 常用的命令有哪些。

2025-11-13 21:54:51 270

原创 Gateway 网关坑我! 被这个404 问题折腾了一年?

最近同事找我帮忙排查一个"诡异"的 Bug,说困扰了他们一年多一直没解决。我接手后花了一些时间定位到了问题根源,今天就来跟大家分享一下这个问题的排查过程和解决方案。

2025-11-13 21:44:56 347

原创 SpringBoot 的这些默认配置不改,100%会踩坑!

Spring Boot 的“约定优于配置”确实省心,但省的是开发者的心,不是系统的责任。每一项默认配置背后,其实都藏着设计者的假设和权衡,而这些假设,在我们的业务场景中也许未必成立。这些坑我几乎都踩过,有些甚至反复踩了好几次。愿你读到这里,能少走几步弯路,可不能拿生产事故去交学费。提前优化配置,是对系统负责,也是对自己负责。

2025-11-13 21:44:14 690

原创 三问Spring事务:解决什么问题?如何解决?存在什么问题?

屏蔽具体实现,再使用。

2025-11-13 21:42:33 622

原创 面试官:MySQL 自增 ID 超过 int 最大值怎么办?

然后我看redis是有值的,以为是redis和数据库数据不一致问题,我就把redis的key删了,重新再跑一下,结果打印了insert语句,但是没有插入到数据,看来事情并没有那么简单- -还有一个小插曲,因为系统两天没消费数据,kafka的数据堆积了很多,然后我把消费者数量从30个改成50个,跑了两天,kafka还是有1天的延迟,看来麻木添加消费者数量已经没啥提升的作用了,按理说自增id应该是一个接着一个,不会有空隙的,后面查了一下由于数据库自增id有个高性能策略,设置了id就不一定连续。

2025-11-13 21:39:48 454

原创 有关Redis的15个坑,你踩过几个?

总结一下,这篇文章我们主要讲了 Redis 在「命令使用」、「数据持久化」、「主从同步」3 个方面可能存在的「坑」。怎么样?有没有颠覆你的认知呢?这篇文章信息量还是比较大的,如果你现在的思维已经有些「凌乱」了,别急,我也给你准备好了思维导图,方便你更好地理解和记忆。希望你在使用 Redis 时,可以提前规避这些坑,让 Redis 更好地提供服务。

2025-11-12 21:57:35 859

原创 填坑填坑,万字+28张图会一会传说中的Raft协议

Raft协议是用来保证服务中各节点数据强一致性的,也就是CAP定理中的CP在Raft协议中,集群中的服务(也可以被称为节点,Peer)会有三种状态:Leader:主节点,负责处理所有的请求,一个集群只有一个Leader,处于唯我独尊的地位Follower:从节点,主要是负责复制Leader的数据,保证跟Leader的数据的一致性,Follower必须服从LeaderCandidate:候选节点,中间状态,最终会变成Leader或者Follower。

2025-11-12 21:54:48 739

原创 分布式面试总结(20问+答案详解)

分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,就可以保证事务的ACID特性。ACID而在分布式环境下,会涉及到多个数据库。多数据库分布式事务其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是:需要记录事务在任何节点所做的所有动作;事务进行的所有操作要么全部提交,要么全部回滚。什么是幂等性?同一个接口,多次发出同一个请求,请求的结果是一致的。简单说,就是多次调用如一次。什么是幂等性问题?

2025-11-12 21:53:43 974

原创 如何优化接口性能,我总结了 15 个小技巧!

关于业务类的内容很大程度依赖于产品同学的节奏,研发更多是被动角色,我们能做的是就是多跟产品聊天,「实时」了解产品的最新动向,培养自己的业务 sense,给自己多预留一定的buffer时间可以去做技术调研、技术储备。下图是一个电商的创建订单接口,创建订单记录并插入数据库是我们的核心诉求,至于后续的用户通知,如:给用户发个短信等,如果失败,并不影响主流程的完成。当然,现在互联网的用户基数非常大,这么大的用户量,单表通常很难支撑业务需求,将一个大表水平拆分成多张结构一样的物理表,可以极大缓解存储、访问压力。

2025-11-12 21:50:53 668

原创 万字+33张图探秘OpenFeign核心架构原理!

这一节主要是介绍了7个Feign的核心组件以及Spring对应的扩展实现为了方便你查看,我整理了如下表格接口作用Feign默认实现Spring实现Contract解析方法注解和参数,将Http请求参数和方法参数对应Encoder将请求体对应的方法参数序列化成字节数组Decoder将响应体的字节流反序列化成方法返回值类型对象Client发送Http请求InvocationHandler工厂,动态代理核心逻辑无在发送Http请求之前,再对Http请求的内容进行拦截修改无无。

2025-11-12 21:50:11 641

原创 三万字长文:如何去排查JVM内存问题?

JVM 的堆空间分成2个区域:年轻代、老年代年轻代又进一步细分成3个区域:Eden、Survivor From、Survivor To。

2025-11-12 21:49:11 810

原创 硬核万字图解 MySQL 表空间、Tables、Index、双写缓冲、Redo Log、Undo Log 原理!

在数据库领域,MySQL 的 InnoDB 存储引擎以其高性能、高可靠性和事务支持著称。MySQL innoDB 引擎架构可以分为两大块,分别是。数据最终要持久化到磁盘,其设计融合了复杂的存储结构和精巧的机制,本文将深入剖析其核心模块的设计原理,并通过图片辅助理解。MySQL 到底是怎么管理和存储各种各样的数据呢?比如创建一张表、索引、表中的每一行数据、查询过程中临时存储的数据都存在哪里,又如何管理?

2025-11-06 21:49:26 743

原创 Easy-cache:统一缓存解决方案,让开发人员告别重复的缓存代码!

Easy-cache通过统一的设计解决了开发人员在缓存使用中的痛点,实现了以下核心价值:重复代码问题:通过注解驱动,让开发者告别重复的缓存处理代码缓存穿透问题:通过空值缓存和智能防护机制,有效防止恶意请求穿透到数据库缓存击穿问题:通过分布式锁机制和标记删除方式,防止热点数据失效导致的数据库崩溃数据不一致问题:通过Redis-Hash结构+Lua脚本实现分布式锁,确保缓存与数据库的数据同步Redis宕机问题:通过自动降级和探活机制,保证服务的高可用性。

2025-11-06 21:48:32 920

原创 面试官:什么是 Next-Key Lock?作用是什么?

Next-Key Lock 是 InnoDB 引擎行锁加间隙锁的组合,它锁住的是一个前开后闭的区间,消除了 REPEATABLE READ 隔离级别下的幻读问题。理解 Next-Key Lock 要把握两点:可重复隔离级别下才会生效;锁住一个前开后闭的区间,但一定条件下可能退化成行锁或者间隙锁。

2025-11-06 21:47:53 628

原创 JDK高版本特性总结与ZGC实践!

更多详情,可参考《新一代垃圾回收器ZGC的探索与实践》一文。

2025-11-06 21:46:59 924

原创 MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈!

因此,在设计表结构时,需要根据索引列的数据类型和字符集等因素,合理设置索引长度,以充分利用索引的优势。另外需要注意的是,上面的页的页号并不是连续的,它们在磁盘里也不一定是挨在一起的。B树将行数据都存在非叶子节点上,假设每个数据页还是16kb,掐头去尾每页剩15kb,并且一条数据表行数据还是占1kb,就算不考虑各种页指针的情况下,也只能放个15条数据。索引效率限制:在B+树数据结构中,每个叶子节点存储着一个索引条目,因此如果每个页面能够存放更多索引条目,就可以减少B+树结构的深度,从而提高索引查询效率。

2025-11-06 21:46:01 675

原创 如何设计一个企业级消息推送系统架构?

我们将整个平台系统拆解为:消息融合接收服务,消息处理分发服务,消息模版服务,渠道发送服务,后台管理服务等多个关键服务模块,全面覆盖从请求接入到消息推送、再到后续分析的全流程。为了解决这样的问题,设计一个统一的企业级消息推送系统就变得至关重要,本文是腾讯云架构师技术同盟系列策划文集的新文章,带你手把手设计一个从混乱到统一的企业级消息推送系统架构。比如收到订单系统「订单支付成功」的推送请求,会先匹配「支付通知」模板,确定接收人,设为消息推送的优先级「高」(必须立即推),再判断发送渠道,调用对应的消息推送服务。

2025-11-06 21:44:32 615

原创 聊聊mysql优化神器:前缀索引!

所谓前缀索引,说白了就是对文本的前几个字符建立索引(),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!有点类似于 Oracle 中对字段使用 Left 函数来建立函数索引,只不过 MySQL 的这个前缀索引在查询时是内部自动完成匹配的,并不需要使用 Left 函数。

2025-11-05 21:58:13 958

原创 你还在使用websocket实现实时消息推送吗?

在很久很久以前,前端一般使用轮询来进行服务端向客户端进行消息的伪推送,为什么说轮询是伪推送?因为轮询本质上还是通过客户端向服务端发起一个单项传输的请求,服务端对这个请求做出响应而已。通过不断的请求来实现服务端向客户端推送数据的错觉。并不是服务端主动向客户端推送数据。显然,轮询一定是上述三个方法里最下策的决定。

2025-11-05 21:57:33 951

原创 一顿饭的事儿,搞懂Linux5种IO模型!

阻塞IO非阻塞IO多路复用IO信号驱动式IO和异步IO,我发现这五种IO模型,其实能和吃饭这件事关联起来。

2025-11-05 21:35:21 751

原创 同事使用 insert into select 迁移数据,上线后被公司开除!

使用insert into select的时候请慎重,一定要做好索引。

2025-11-05 21:34:38 761

原创 求求你别再手动部署jar包了,太low了!动态上传热部署真的太爽了!

如果用户上传的jar包含了spring的上下文,那么就需要扫描jar包里的所有需要注入spring容器的bean,注册到当前系统的spring容器中。接下来系统要把上传的jar包加载到当前线程的类加载器中,然后通过完整类名,加载得到该实现的Class对象。近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中。考虑到用户实现接口的两种方式,使用spring上下文管理的方式,或者不依赖spring管理的方式,这里称它们为注解方式和反射方式。

2025-11-05 21:34:00 253

原创 2025年Java精品面试PDF!你都领取了没?

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

2025-11-05 21:33:19 120

原创 当Synchronized遇到这玩意儿,有个大坑,要注意!

在某技术平台上看到别人提的关于 Synchronized 的一个用法问题,我觉得挺有意思的,这个问题其实也是我三年前面试某公司的时候遇到的一个真题,当时不知道面试官想要考什么,没有回答的特别好,后来研究了一下就记住了。所以看到这个问题的时候觉得特别亲切,准备分享给你一起看看:程序逻辑也很简单,是一个模拟抢票的过程,一共 10 张票,开启两个线程去抢票。票是共享资源,且有两个线程来消费,所以为了保证线程安全,TicketConsumer 的逻辑里面用了 synchronized 关键字。

2025-11-05 21:26:19 951

原创 搞定了 6 种分布式ID,分库分表哪个适合做主键?

上边咱们介绍了 ShardingSphere 内提供的 5 种生成主键的ID算法,这些算法基本可以满足大部分的业务场景。不过,在某些情况下,我们可能会要求生成的ID具有特殊的含义或遵循特定的规则。ShardingSphere 也支持我们自定义生成主键ID,来满足定制的业务需求。我们介绍了 ShardingSphere 的几种内置主键生成策略以及如何自定义主键生成策略,市面上还有许多优秀的分布式ID框架都可以整合进来,但具体选择何种策略还是要取决于自身的业务需求。

2025-11-05 21:24:24 1007

原创 面试官问我:什么是高并发下的请求合并?

还有真实的案例是转账的场景,有的转账渠道是按次收费的,那么作为第三方公司,我们就可以把用户的请求先放到表里记录着,等一小时之后,一起汇总发起,假设这一小时内发生了 10 次转账,那么 10 次收费就变成了 1 次收费,虽然让客户等的稍微久了点,但还是在可以接受的范围内,这操作节约的就是真金白银了。另外一个风险点就是对于支出类的请求,如果被削峰,很明显,我们提前就告诉了用户操作成功,但是真正动账户余额的时候已经延迟了,所以可能会出现账户透支的情况。请求合并的处理速度甚至比单个处理还快,这也是性能的提升。

2025-11-05 21:23:35 813

原创 刺激,线程池的一个BUG直接把CPU干到100%了!

给大家分享一个关于 ScheduledExecutorService 线程池的 BUG 啊,这个 BUG 能直接把 CPU 给飚到 100%,希望大家永远踩不到。但是,u1s1,一般来说也很难踩到。到底咋回事呢,让我给你细细嗦嗦。

2025-11-05 21:15:42 557

原创 BigDecimal 为什么可以保证精度不丢失?

/ 该BigDecimal的未缩放值// 精度,可以理解成小数点后的位数// BigDecimal中的十进制位数,如果位数未知,则为0(备用信息)// 这个我理解就是存实际的BigDecimal值// 扩大成long型数值后的值。

2025-11-04 21:49:10 265

原创 Controller层代码就该这么写,简洁又优雅!

有些时候 JSR303 标准中提供的校验规则不满足复杂的业务需求,也可以自定义校验规则。自定义校验规则需要做两件事情:自定义注解类,定义错误信息和一些其他需要的内容注解校验器,定义判定规则//自定义注解类/*** 是否允许为空*//*** 校验不通过返回的提示信息*/String message() default "不是一个手机号码格式";/*** Constraint要求的属性,用于分组校验和扩展,留空就好*/Class<?Class<?//注解校验器。

2025-11-04 21:48:30 862

原创 SpringBoot + 事务钩子函数,打造高效支付系统!

***/if (!这里又使用到了线程变量,我们在判断是否存在事务时,就是判断这个线程变量内部是否有值。那我们现在想在事务提交后触发自定义逻辑和这个有什么关系呢?我们在上面构建流水落地api的伪代码中有向内部添加了一个,内部并重写了@Override// 事务提交后,再异步发送消息给kafkatry {// 发送消息给kafka// 记录异常信息,发邮件或者进入待处理列表,让开发人员感知异常});});我们结合的源码来看,其实这段代码主要就是向线程变量内部的。

2025-11-04 21:47:51 695

原创 中厂Java后端15连问-答案整理!

首先,需要定义一个接口,该接口定义了一组操作或服务。这个接口通常由Java核心库或者第三方库提供。

2025-11-04 21:46:59 894

原创 实战:画了几张图,终于把OAuth2搞清楚了

在详细讲解oauth2之前,我们先来了解一下它里边用到的名词定义吧:Client:客户端,它本身不会存储用户快捷登录的账号和密码,只是通过资源拥有者的授权去请求资源服务器的资源,即例子中的网站A;Resource Owner:资源拥有者,通常是用户,即例子中拥有QQ/微信账号的用户;Authorization Server:认证服务器,可以提供身份认证和用户授权的服务器,即给客户端颁发token和校验token;

2025-11-04 21:43:57 760

空空如也

空空如也

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

TA关注的人

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