自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java面试题库及答案解析(2026版)

最后想说的是,无论你是小白菜鸟,还是技术大牛,日常都不能够落下学习这件事情。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。今天为大家整理了Java工程师高级面试题及一些大厂Java开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习,需要完整的朋友可以点击下方名片获取。

2026-03-30 10:10:13 77

原创 8 个最容易写错的 SQL 习惯,正在毁掉你的数据库

而且最可怕的是,它们几乎都不是“不会 SQL”造成的,反而经常出现在“会一点、写得很顺手”的阶段。也就是说,别让数据库先把每一行都加工一遍,再比较;一旦是开放式列表、大数据量、用户不断下拉,继续死磕深分页,就是在给数据库加班。如果你的表有几百万数据,这种写法就不再是“能跑”,而是“谁写的,出来挨打”。因为数据库的性能问题,很多时候不是“算得太慢”,而是“搬得太多”。很多 SQL 慢,不是因为数据库不够强,而是因为你把优化器逼疯了。真正把库拖慢、把业务搞崩、把同事逼疯的,往往是一些。

2026-03-30 10:06:01 95

原创 SpringBoot3 线程数暴增到1590的排查与解决:RocketMQ MQClientInstance 复用失效

都会创建一套独立的线程(Netty线程、心跳线程、拉消息线程等),50 个实例就产生了约 1400 个 RocketMQ 相关线程,这就是线程数暴增的直接原因。由于每个 Consumer 的启动时间不同,时间戳各异,导致 50 个 Consumer 产生 50 个不同的 clientId,无法复用同一个。区分不同的 Consumer,共用实例不会导致消息串投或消费混乱,这也是 RocketMQ 官方推荐的用法。从第一步的线程名可以看出线程池都来自 RocketMQ,但不知道该查哪个类。

2026-03-30 10:05:26 95

原创 5分钟 快速上手 Function Calling

需要注意的是,输出这种严谨的结构化指令,并非大模型天生就会的。当你对它说“分析一下本地销售数据并把总结发给主管”时,它能自主翻找你电脑里的文件、运行统计脚本、最后登录你的企业飞书发出消息。这一步是让为了让大模型建立对工具的基础认知,它不需要知道这些工具怎么实现的,只需要记住这些工具的使用方式。将上面这个函数的信息,严格按照 JSON Schema 的格式描述出来,稍后连同用户的问题一起发给大模型。大模型拿到这个补充的事实数据后,结合最初的问题,最终接龙出一句自然回复:“张三所在的部门是研发部!

2026-03-30 09:41:56 89

原创 2026最新Java岗最全八股题库(实时更新,覆盖大厂高频考点)

当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。Java 序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。

2026-03-29 11:30:10 232

原创 Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)

本项目演示了如何在应用中实现安全的 API 接口加密传输机制,采用RSAAES-GCM混合加密方案,确保敏感数据在传输过程中的机密性和完整性。基于 Spring Boot 的 API 接口加密传输解决方案,实现前后端数据的端到端加密通信。// 请求解密注解// 响应加密注解4.10 核心加解密调度服务@Slf4j@Service// 请求解密try {// 时间窗口校验throw new EncryptionException("请求已过期,请重新发起");

2026-03-29 11:27:55 310

原创 美团面试:为什么要用分布式缓存?本地缓存呢?多级缓存一致性如何保证?

这个实际在很多项目中用的蛮多,特别是单体架构的时候。数据量不大,并且没有分布式要求的话,使用本地缓存还是可以的。本地缓存位于应用内部,其最大的优点是应用存在于同一个进程内部,请求本地缓存的速度非常快,不存在额外的网络开销。常见的单体架构图如下,我们使用Nginx来做负载均衡,部署两个相同的应用到服务器,两个服务使用同一个数据库,并且使用的是本地缓存。本地缓存示意图在集群模式下使用本地缓存,必须考虑负载均衡策略。如果 Nginx 使用默认的轮询(Round-Robin)

2026-03-29 11:26:16 357

原创 Java 集合容器 - 高级篇

1. 集合选择原则根据数据结构选择:数组、链表、哈希表、树根据线程安全选择:同步或非同步根据性能需求选择:时间复杂度和空间复杂度根据功能需求选择:排序、顺序、并发等2. 性能优化建议预估容量,减少扩容使用基本类型,避免装箱拆箱合理选择集合类型注意线程安全使用不可变集合保护数据3. 常见陷阱并发修改异常hashCode和equals不一致null值处理自动装箱拆箱内存泄漏。

2026-03-29 11:24:19 337

原创 Java高级工程师金三银四面试题总结及参考答案

最近我分析了几百份 2026 最新的大中小厂面经,整理了 Java后端 面试中最最最常问的一些问题!小伙伴们可以对照着这篇文章来进行自测,这是一种非常不错的学习和复习方式。并且,每一年我都会根据当年的面试情况对其进行补充和完善。:标注 的问题代表这个问题比较难,通常只有大厂和少部分中厂的面试会比较喜欢问,目标在中小厂的同学可以选择性跳过。如果你的目标是中厂往上的话,标注 的问题建议还是多花一些时间去搞懂,这是区分度较高的问题。

2026-03-27 10:56:27 300

原创 MySQL优化全攻略:索引、SQL与分库分表的最佳实践

而索引字段是字符串,而输入的是整型,由于是字符串转数字,而索引不是整型类型,所以索引失效了。对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式, 一种是把上一次的最后一条数据,也即上面的c传过来,然后做“c < xxx”处理,但是这种一般需要改接口协议,并不一定可行。不过,从 MySQL 8.0 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值,所以就可以通过扫描索引来查询数据。分库分表和分区并不冲突,可以结合使用。

2026-03-27 10:48:52 222

原创 京东大模型二面:RAG系统在实际部署中可能面临哪些挑战?

几乎每个做大模型应用的团队都搭过 RAG 原型。用 LangChain 跑个 demo,把文档灌进向量数据库,接上 LLM,效果看着还不错,准备上线。然后问题就来了。RAG 从原型到生产之间有着巨大的鸿沟:demo 阶段暴露不出来的问题,会在真实用户、真实数据、真实规模面前集中爆发。回答这道题,如果只停留在"检索不准、生成幻觉"这种泛泛而谈的层面,很难打动面试官。你得能说出那些真正在生产中折磨过你的具体问题,以及你是怎么一步步解决的。

2026-03-27 10:34:33 167

原创 一口气说出 OAuth2.0 的四种授权方式

OAuth2.0授权其实并不是很难,只不过授权流程稍显麻烦,逻辑有些绕,OAuth2.0它是面试经常会被问到的知识点,还是应该多了解一下。下一篇实战OAuth2.0四种授权,敬请期待,欢迎关注哦~

2026-03-27 10:26:25 197

原创 金三银四一周背完java面试八股文(附答案)

扩容2倍防哈希碰撞+链表转红黑树阈值8(泊松分布解释)→ synchronized锁升级流程(无锁→偏向→轻量→重量)→ ArrayList扩容1.5倍与LinkedList场景对比。:B+树比B树优势(矮胖多叉+范围查询快)+ 事务ACID实现(undo log回滚/redo log持久化)+ 索引失效场景(LIKE左%/OR条件未覆盖索引)。Day7:补漏:TCP三次握手(SYN→SYN-ACK→ACK)→。一级缓存缺陷(SqlSession级别易脏读)。雪崩(随机过期时间)&穿透(布隆过滤器)→。

2026-03-26 15:15:32 286

原创 滴滴一面:在项目中使用多线程时遇到过哪些问题?

把网络 I/O、磁盘 I/O、远程 RPC、数据库查询放在持锁区间或关键线程(事件循环、调度线程)里,会把“局部等待”放大成“全局卡顿”。的异常如果没有被统一捕获和上报,会变成“静默失败”:业务看似正常,某些任务永远没做完,只在对账或数据校验时爆雷。常见于缓存、日期格式化器、随机数生成器、连接对象、集合类迭代器等,被多个线程共享后出现数据污染或崩溃。多线程带来的收益往往写在压测曲线上,代价则藏在“偶发、难复现、只在生产出”的问题里。问题常被误归因到“网络抖动/数据库慢”,实际是并发写坏了内部状态。

2026-03-26 10:48:40 326

原创 B 树、红黑树都不行?MySQL 为何只选 B+ 树

MySQL 索引为何偏偏选中?这个问题背后藏着不少的设计考量。其实,MySQL 选择 B+ 树。这背后既有数据结构的精妙设计,也离不开一个关键的现实约束——。因为数据库的数据最终是落在磁盘上的,而磁盘读写比内存操作慢好几个数量级。。B+ 树的层数少、叶子节点有序相连、非叶子节点仅存键值等特性,恰恰都是为了这个目标服务的。下次再有面试官问你“为什么是 B+ 树?”,你不妨从“如何减少磁盘 I/O”这个角度开始回答——这才是理解数据库索引设计的钥匙。

2026-03-26 10:44:29 212

原创 MySQL锁机制:从全局锁到行级锁的深度解读

全局锁主要应用于做,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。但是加上全局锁后,整个数据库都是只读状态,无法更新数据。因此,一般也不建议用全局锁进行全库逻辑备份。支持可重复读的隔离级别,那么在备份数据库之前可以先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于的支持,备份期间业务依然可以对数据进行更新操作。

2026-03-26 10:43:30 330

原创 重构了20个SpringBoot项目后,总结出这套稳定高效的架构设计

线上出了个问题,用户支付成功了但订单状态没更新。排查发现:支付模块用try-catch返回错误码,订单模块直接抛异常,而中间的协调层既没处理异常也没记录日志,出了问题都不知道该找谁。里面既有订单处理,又有用户积分计算,还夹杂着各种报表导出逻辑。将不同关注点(如业务逻辑、数据访问、安全控制)分离到不同组件中,每个组件只关注自己的职责。高层模块不应依赖低层模块,两者都应该依赖抽象。:上面的例子有瑕疵!:前端可以统一封装请求拦截器,无需为每个接口单独处理响应格式。:小李要修改一个订单状态的功能,结果发现。

2026-03-25 11:14:39 303

原创 Spring Boot 3 集成 Apache Calcite:多数据源查询的终极解决方案

这种情况不用麻烦地把 Kafka 数据同步到 Hive,也不用把 Hive 数据同步到实时库,直接用 Calcite 的 Kafka 适配器(calcite-kafka)和 Hive 适配器(calcite-hive),就能把实时流数据和离线数据放到同一个查询体系里,写一条 SQL 就能实现“实时+离线”数据的联合查询,既省了大量数据同步成本,又能兼顾实时性和准确性,还支持增量查询。它最核心的价值在于“解耦”——将数据存储与数据查询分离,无论数据存在哪里、是什么格式,都能通过统一的 SQL 接口进行查询。

2026-03-25 11:13:22 360

原创 Java NIO Buffer:DirectByteBuffer堆外内存回收的Cleaner机制详解

Java 的四种引用(强、软、弱、虚)里,虚引用是最神秘的。你通过虚引用根本拿不到对象实例。当对象被 GC 回收时,系统会把这个虚引用加入到一个引用队列(ReferenceQueue)中,给你一个“收尸”的通知。关于和Cleaner虚引用是核心Cleaner基于虚引用,只有当 Java 堆内的对象被 GC 回收时,堆外内存才会被释放。时间差是杀手:堆内对象小,堆外内存大,GC 不敏感导致堆外先爆。慎用 DisableExplicitGC:在大量使用 NIO 的场景下,禁用等于自杀。请改用。

2026-03-25 11:05:24 360

原创 腾讯二面:epoll 性能碾压 select/poll,凭什么?

仅在fd的IO状态发生“边沿变化”时触发一次回调。例如,当fd的接收缓冲区从“空”变为“有数据”时,触发一次读事件回调;若数据未读完,后续不会再触发回调。只要fd的IO状态处于“就绪状态”,就会持续触发回调。例如,只要fd的接收缓冲区中有未读数据,就会反复触发读事件回调;只要发送缓冲区有空闲空间,就会反复触发写事件回调。

2026-03-25 11:03:49 352

原创 SpringBoot+Caffeine+Redis 实现多级缓存

多级缓存是指在系统中部署多层功能互补的缓存组件,让请求按照预设顺序依次访问各层缓存,仅当所有缓存层均未命中时,才访问底层数据库的架构模式。其核心设计思想是离用户越近的缓存,速度越快、开销越低,通过分层拦截请求,最大化减少对后端存储的访问。在 Java 后端体系中,最主流的是二级缓存架构本地缓存分布式缓存本地缓存:运行在应用进程内部的内存缓存,无网络 IO 开销,读写延迟纳秒级。主流选型为 Caffeine(性能优于 Guava Cache、Ehcache),适合存储高频访问的热点数据。

2026-03-24 10:52:57 293

原创 阿里面试官:什么才是可工程化落地的RAG项目

做了一个基于RAG的智能问答系统。: - 用户问:"那个做AI的公司最近有啥新消息" - 知识库写的是:"阿里巴巴发布2024年AI战略规划" - 直接匹配可能召回失败。最后面试官看着我说:"同学,你这个项目更像是一个demo,而不是一个可以工程化落地的项目。那一刻,我突然意识到:做一个能跑的RAG demo和做一个真正能上线的RAG系统,之间差了十万八千里。玩具RAG是一个简单的"检索-生成"单点流程,而工程化RAG是一个完整的流水线。"同学,你简历上写了做过RAG项目,那你说说你的项目是怎么落地的?

2026-03-24 10:37:39 374

原创 MySQL语句执行深度剖析:从连接到执行的全过程

连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划(选择使用哪个索引);

2026-03-24 10:36:30 390

原创 Java内存模型(JMM)与 volatile 底层实现全解析

volatile是深入理解 JVM 内存模型的入场券。它就像是 CPU 缓存一致性协议在 Java 层的投影,通过内存屏障和硬件指令,在纷乱的并发世界中强行划定了一道名为“确定性”的边界。作为资深开发者,理解它不仅是为了写出高性能的代码,更是为了掌握系统底层的运行规律,在面对复杂的并发难题时,能一眼看穿真相。

2026-03-24 10:34:34 366

原创 Redis 命中率 99%,数据库却 100% CPU,是谁在捣鬼

缓存穿透是指:查询的数据在缓存和数据库中都不存在,导致每次请求都会绕过缓存,直接访问数据库,从而在高并发下对数据库造成巨大压力,甚至导致数据库崩溃。查的是不存在的数据缓存里没有数据库里也没有缓存失效策略对它完全没用自己实现 Bitmap + Hash使用 RedisBloom 插件示意代码(简化):缓存穿透是指查询缓存和数据库中都不存在的数据,导致请求绕过缓存直接访问数据库。我通常通过接口参数校验、缓存空值以及使用布隆过滤器三种方式结合解决。

2026-03-23 14:37:06 312

原创 美团面试:MySQL为什么能够在大数据量、高并发的业务中稳定运行?

MySQL是互联网公司用得最多的数据库,而InnoDB则是MySQL生态中最常见的存储引擎。它为什么能够在大数据量、高并发的互联网业务中稳定运行?今天我们来聊聊InnoDB的并发控制锁机制和MVCC——从基础概念到内核设计的完整逻辑。sql体验AI代码助手代码解读复制代码sql体验AI代码助手代码解读复制代码这两种会加上共享锁或排他锁,成为当前读(current read)。它们会和事务的隔离级别产生复杂的交互。具体怎么工作的,我们后面再展开。

2026-03-23 14:35:41 385

原创 美团面试:为什么要用分布式缓存?本地缓存呢?多级缓存一致性如何保证?

这个实际在很多项目中用的蛮多,特别是单体架构的时候。数据量不大,并且没有分布式要求的话,使用本地缓存还是可以的。本地缓存位于应用内部,其最大的优点是应用存在于同一个进程内部,请求本地缓存的速度非常快,不存在额外的网络开销。常见的单体架构图如下,我们使用Nginx来做负载均衡,部署两个相同的应用到服务器,两个服务使用同一个数据库,并且使用的是本地缓存。本地缓存示意图在集群模式下使用本地缓存,必须考虑负载均衡策略。如果 Nginx 使用默认的轮询(Round-Robin)

2026-03-23 14:33:37 330

原创 都在用 Java8 或 Java17,那 Java9 到 16 呢?他们真的没用吗?

Java 8是第一个大升级,让代码一下子变短、变清爽,大家用着舒服,所以很多公司一直用到现在。中间的版本(9 到 16)像是在试验,,新功能先放出来让大家试试,有问题就改,没问题就留着。Java 17就是把这些试好的好功能打包起来,做成一个又稳又好用的新版本,适合现在的新项目。所以,Java8 和 Java17 成了两个最受欢迎的版本:一个代表经典可靠,一个代表现代高效。

2026-03-23 14:31:16 342

原创 从 Spring Boot 到 Tomcat:很多人其实分不清“框架”和“服务器”

理解 Spring Boot、Tomcat、Apache 之间的区别,本质上是在理解 Web 系统的分层思想。应用层容器层网络层你就已经从“会写接口”迈向了“理解系统结构”。技术选型并不是简单的“哪个好”,而是看它在系统中承担什么角色。真正成熟的工程思维,是理解每一层的边界和职责。如果你对 Web 架构的演进过程感兴趣,还可以进一步研究三层架构、微服务拆分以及容器化部署,这会让你对后端系统有更完整的认知。

2026-03-20 10:48:30 293

原创 Java并发核心:你以为AQS很复杂?无非是“两个队列“和“一个状态“

上周面试,面试官问我:“你能说说 Java 的AQS基于管程是如何实现的吗?” 我当时只背了概念,结果当场翻车。回来后我花了 3 天,把 AQS源码啃了一遍,整理出这篇能直接拿去面试的笔记。1、什么是AQS不是对管程的简单模仿,而是用轻量级队列算法在 Java 语言层面重新发明了管程。它将操作系统 / JVM 的管程概念抽象为可组合的 Java 组件,使得开发者能够以极低的成本构建出高性能、高可控的同步工具。

2026-03-20 10:45:56 359

原创 Java多线程神器——ThreadForge ,让多线程从此简单

/ 到这里,两个任务肯定都结束了(成功、失败或超时)// scope 关闭时,所有任务自动取消、资源自动清理所有任务都绑定在 ThreadScope 内,生命周期有边界,不会泄漏默认就是安全的:默认超时、默认失败传播、自动取消代码结构就是任务关系:读代码的人一眼就能看出两个任务是并发的,且必须都完成才能继续创建线程池,配置核心线程数、队列大小提交任务,手动处理 Future写 try-finally 确保 shutdown手动处理超时和异常传播。

2026-03-20 10:42:40 343

原创 字节二面:Redis 能做消息队列吗?怎么实现?

回到最初的问题:Redis 到底能不能做 MQ?如果业务简单、量小、追求极致性能,且能容忍极小概率的数据丢失,使用是最优解,因为它省去了部署维护 MQ 的成本,可以复用现有的 Redis 组件(大部分需要用到 MQ 的项目,通常都会需要 Redis)。如果是金融级业务、海量数据、需要严格保证不丢消息,必须选择等更成熟的 MQ。

2026-03-20 10:39:02 368

原创 面试官问我 ,try catch 应该在 for 循环里面还是外面?

为什么要把 使用场景 摆在第一个?因为本身放在 for循环 外面 和里面 ,如果出现异常,产生的效果是不一样的。怎么用,就需要看好业务场景,去使用了。结果:img结果:imgps:在面试的时候,如果真的连上面这个在外面在里面使用效果都没说对,那,真的会去等通知了。但是 之前不会的看官,看完这一篇, 肯定会了。

2026-03-19 10:51:15 196

原创 Java工程师复健Spring IoC:所有Java开发的第一个面试题

它的上层代码全部报错,你必须顺藤摸瓜挨个修改,而且完全是无意义的活儿,同时你还要考虑到是当前IDE发展的很好,在Spring还没出来的那个时候,你这样改个代码,怎么找全都是个问题。看完这一地鸡毛,你会发现,让业务类自己去管理对象的创建、依赖顺序和生命周期,是一个极其繁琐,且不符合效率的事情。这东西不仅写起来恶心,更致命的是,一旦你在 IDE 里重构代码、挪动了包的位置,如果不小心漏改了 XML,编译期完全不报错,系统一启动直接崩溃。V1.0 存在的最大的 BUG 在于,它造出来的是个没用的对象。

2026-03-19 10:46:50 310

原创 Java面试素材:我解决过因分页过深而导致的性能问题

在Java面试中,除了说项目经历外,通过说明自己解决过的问题,是证明自己能力的最好方法。本文给出的这个素材,适用用应届生和Java初级开发,当然由于涉及到了性能问题,所以哪怕去应聘资深开发或架构的职位,也可以通过说这个素材来证明自己的能力。

2026-03-19 10:44:21 303

原创 我解决过因Spring Boot版本升级而导致的Redis问题

这里请注意,一些零项目经验的朋友,在说解决过的问题时,直接是说问题的症状和如何解决的,由于这些人没参与过项目,所以不知道如何通过监控发现问题。在面试过程中,最为有效的证明自己能力的方式,是说自己解决过的问题,如果该问题和分布式组件、微服务组件以及架构有关,这更能证明自己的能力。本文就用一个真实的线上问题为例,围绕发现问题,分析问题和解决问题这三方面,给出一段可供在面试中展示自己能力的说辞。记住,面试官未必在乎你解决问题的方法,因为未必出现同样的问题,但会通过听你说如何排查问题的,来确认你的能力。

2026-03-19 10:43:36 187

原创 网易一面:KAFKA写入数据时是先写Leader还是先写Follower?

因此,Kafka 选择Leader 写入 + Followers 拉取是为了在吞吐、顺序、一致性与故障恢复之间取平衡,而不是追求生产者侧的并行多写。Followers 的写入相对 Leader 是滞后的,滞后程度由网络、磁盘、负载与副本数共同决定。当 acks=all 时,返回更接近 committed(在 ISR 机制正常工作前提下)。直觉上生产者同时写多个副本似乎更快,但 Kafka 的一致性与顺序保证依赖。这里的关键点是:即便 acks=all,也是。,而不是生产者并行写多份。

2026-03-18 10:43:51 320

原创 从 Spring Boot 到 Tomcat:很多人其实分不清“框架”和“服务器”

理解 Spring Boot、Tomcat、Apache 之间的区别,本质上是在理解 Web 系统的分层思想。应用层容器层网络层你就已经从“会写接口”迈向了“理解系统结构”。技术选型并不是简单的“哪个好”,而是看它在系统中承担什么角色。真正成熟的工程思维,是理解每一层的边界和职责。如果你对 Web 架构的演进过程感兴趣,还可以进一步研究三层架构、微服务拆分以及容器化部署,这会让你对后端系统有更完整的认知。

2026-03-18 10:17:21 377

原创 MySQL索引明明建了,查询还是慢,排查发现踩了这些坑

原因示例解决方案对索引列做函数改成范围查询隐式类型转换WHERE phone=138xxx(数字)类型匹配LIKE %开头改前缀或用ESOR部分无索引都加索引或UNION最左前缀联合索引(a,b,c)查WHERE b=1调整索引或查询范围查询后的列调整索引顺序记住:写完SQL先EXPLAIN,养成习惯。

2026-03-18 10:16:13 162

原创 面试必问:Java的Semaphore 凭什么靠 AQS + CAS 实现限流?

实现,可通过构造方法传入布尔参数,选择。

2026-03-18 10:15:41 194

空空如也

空空如也

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

TA关注的人

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