- 博客(103)
- 收藏
- 关注
原创 对线面试官:Elasticsearch为什么快?
倒排索引是一种按关键词组织文档的数据结构,用于加快全文检索。简单说,就是“词 → 出现在哪些文档”。用倒排索引替代扫描匹配,避免全文遍历写入即建索,实现查询零延迟预处理Lucene 提供了极致的单机检索效率分布式结构使其天然支持扩展与并发多层缓存减少了磁盘 I/O 与 CPU 计算段合并与压缩保持系统长期健康稳定掌握这些原理,不仅能理解 Elasticsearch 的高性能本质,也能在实际使用中更好地优化查询速度与系统稳定性。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh。
2025-05-15 17:23:42
571
原创 为什么总有人觉得5万块钱可以做一个淘宝?
今天,我以淘宝的系统为例,给你介绍了一个系统逐渐由简单变复杂的发展历程,希望你能认清不同业务量级的系统本质上就不是一个系统。一方面,有人会因为对业务量级理解不足,盲目低估其他人系统的复杂度;另一方面,也有人会盲目应用技术,给系统引入不必要的复杂度,让自己陷入泥潭。作为拥有技术能力的程序员,我们都非常在意个人技术能力的提升,但却对在什么样情形下,什么样的技术更加适用考虑得不够。采用恰当的技术,解决当前的问题,是每个程序员都应该仔细考虑的问题。
2025-04-25 15:31:02
756
原创 Theadlocal内存泄露?没那么夸张
是 Java 提供的一种用于线程本地存储的机制。它可以为每一个线程提供一个变量的副本,使得每个线程都可以独立地修改自己的副本,而不会影响其他线程的变量。在多线程环境下,这样做的好处是避免了非线程安全的问题,无需使用锁来进行同步。是一个功能强大的工具,其核心价值在于线程封闭(Thread Confinement),将某些需隔离的资源绑定到线程生命周期,简化多线程编程复杂度。不要因为害怕内存泄露而不敢用,只要我们用完就清除,就不会泄露,大胆用起来吧!如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh。
2025-04-25 15:07:52
620
原创 SQL语句是怎么被执行的?一条sql语句的幕后旅程
虽然只是简单更新一个字段,但背后 MySQL 做了大量精密工作——从内存控制、日志写入到事务保障,处处体现出设计者的匠心。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-16 19:00:26
646
原创 从懵逼到上头:和MVCC死磕的108分钟顿悟时刻
MVCC,即多版本并发控制,是一种乐观并发控制技术。数据库为每一行记录保存多个版本。这些版本不仅包含数据的最新状态,还保留了历史状态,从而使得并发事务在读取数据时可以看到一个“快照”。每条记录通过内置的系统列保存版本信息,如事务 ID(通常称为 DB_TRX_ID)、回滚指针(ROLLBACK POINTER)以及删除标记等。这些信息构成了记录的版本链,帮助判断哪个版本对当前事务可见。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-14 17:34:10
1015
原创 从阻塞到 Reactor:理解 Java I/O 背后的架构思维
在Java的发展历程中,I/O 模型不断演进以满足高并发和高性能的需求。最初的同步阻塞 I/O 设计简单,但在高并发场景下性能瓶颈明显。为了解决该问题,Java 引入了非阻塞 I/O 模型,而后通过 I/O 多路复用技术(NIO)可以让单个线程同时处理多个 I/O 事件。最后,通过将 I/O 事件的侦测和业务处理分离(例如单线程多路复用负责监听事件,多线程负责业务处理),极大地提升了系统的伸缩性和响应速度。下面我们来详细说明这几个阶段的工作原理和实现方法。异步 I/O 模型。
2025-04-11 10:59:42
1091
原创 别再背线程池的七大参数了,现在面试官都这么问
Worker如何通过AQS实现不可重入锁状态机转换如何影响任务调度阻塞队列与线程存活的精妙配合七大参数对你来说不再是孤立的概念,而是有机组合的设计元素。这才是面试官真正想考察的——对并发编程本质的理解能力。下次面试时,不妨主动反问:“您是想了解参数设计的trade-off,还是具体的实现机制?” 这会让面试官眼前一亮。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-10 14:42:49
1016
原创 Spring状态机实战入门:Java程序的状态流转可以这样管
/ 订单状态枚举 /*** 订单状态枚举(有限状态集合)* 建议:状态命名要直观体现业务含义UNPAID, // 待支付(初始状态) PAID, // 已支付(支付成功后进入此状态) DELIVERING, // 发货中(商家操作发货后状态) COMPLETED // 已完成(用户确认收货后终止状态) } /*** 订单事件枚举(触发状态变化的操作)* 注意:事件命名建议使用动词形态。
2025-04-09 17:36:18
495
原创 受够了重复性工作,一怒之下手撸一个多平台文章同步工具
作为喜欢分享技术博客的程序员,我经常需要在**知乎、优快云、今日头条、掘金**四个平台同步内容。于是开发了一个一键同步文章到多平台的工具
2025-04-02 17:45:19
537
原创 IM入门之:万人群聊系统设计的难点与架构优化实践
空间换时间通过内存缓冲、合并操作化解写入风暴异步化与批处理将同步操作转化为异步队列处理,提升系统吞吐数据分片与本地化避免全局状态依赖,利用哈希分片实现水平扩展柔性设计允许短暂延迟/数据不一致,换取系统整体可用性这些方案已在微博等亿级用户平台验证,可扩展至社交、IoT等需要海量消息分发的场景。在面对类似挑战时,开发者应重点关注写入放大与状态同步问题,通过分层治理实现系统弹性的跃升。加瓦点灯, 每天推送干货知识!
2025-03-29 23:21:17
832
原创 让代码自带「防重」Buff: 手写分布式幂等组件
实现,通过注解声明式配置,提供灵活、高性能的接口幂等性保障。支持快速失败与阻塞等待两种模式,集成自定义策略扩展能力,适用于springboot项目分布式场景下的重复请求拦截与处理。开发者无需修改业务代码即可集成,同时支持灵活扩展,适用于电商、金融等高并发场景,有效保障系统数据一致性。通过 Spring Boot starter 自动装配,支持自定义处理器工厂扩展,无缝集成现有系统。:默认基于 Redis 缓存,支持自定义处理器(如数据库持久化)。注解标记需幂等控制的方法,支持参数动态配置。
2025-03-22 23:12:47
669
原创 @ControllerAdvice无法捕获HandlerInterceptor拦截器里抛出的异常解决办法
@RestControllerAdvice 无法捕获WebMvcConfigurer拦截器里抛出的异常,怎么解决
2025-03-18 10:15:33
302
原创 对线面试官:Java中的锁机制
实现:通过CAS操作将Mark Word复制到线程栈中的Lock Record。在多线程并发编程中,锁是协调线程对共享资源访问的核心机制。等),理解这些分类有助于在实际开发中选择最合适的同步机制。Java显式锁的基石,采用CLH队列变体实现同步控制。不同的锁类型在Java并发包中都有典型实现(如。实现:通过操作系统的互斥量(mutex)实现。原理:在Mark Word中记录线程ID。:保证共享变量的修改对其他线程立即可见。:严格顺序用公平锁,高吞吐用非公平锁。的底层实现经历了多次优化,核心机制为。
2025-03-17 17:38:23
552
原创 Guava EventBus:程序员必备的事件驱动框架,你还没用过?
Google Guava EventBus是Guava工具库中的事件驱动组件,采用发布-订阅模式实现组件间解耦通信。它提供轻量级的事件总线机制,允许不同组件通过事件进行交互而无需直接引用彼此。
2025-03-08 19:57:17
1143
原创 培养项目中横向抽象的能力:构建可复用的技术中台思维
当这种思维成为团队的本能时,你会发现:原本错综复杂的业务系统,正在悄然进化为层次清晰的技术中台。在软件开发中,我们常遇到一类特殊需求:它们不直接属于业务逻辑,却像"毛细血管"般渗透到各个模块中,例如。本文将通过实际案例,揭示如何通过泛型、函数式接口和设计模式的组合拳,打造高复用性的技术中台能力。通过这种设计,开发者可以像搭积木一样组合技术能力,让业务代码保持简洁。:需要统计核心方法的执行耗时、入参和结果,但不希望污染业务代码。培养项目中横向抽象的能力:构建可复用的技术中台思维。,而处理它们的核心能力正是。
2025-02-28 15:36:32
246
原创 Java web后端转Java游戏后端
通过以上流程,Java后端开发者可逐步掌握游戏开发特性,重点需要转变的思维模式包括:从请求响应模式到实时状态同步、从CRUD主导到复杂逻辑计算、从分钟级延迟到毫秒级响应的要求。作为Java后端开发者转向游戏后端开发,虽然核心编程能力相通,但游戏开发在架构设计、协议选择、实时性处理等方面有显著差异。使用Netty/Mina框架处理高并发连接(单机支撑5W+连接是基本要求)动态调整同步频率(近距离玩家100ms/次,远距离500ms/次)采用WebSocket/TCP长连接(90%以上MMO游戏选择)
2025-02-26 11:19:31
748
原创 Java Fork/Join框架详解
在Java并发编程中,Fork/Join框架是一个强大的工具,它允许开发者轻松地利用多核处理器的优势来执行并行任务。作为一名资深Java开发工程师,我将在本文中深入探讨Fork/Join框架的概念、原理、使用场景以及具体的使用方法,并通过实例帮助你更好地理解和掌握这一技术。Fork/Join框架通过智能的任务分发和高效的工作窃取机制,成为处理可分解并行任务的利器。采用递归分解策略:将大任务拆分为子任务(Fork),并行执行后合并结果(Join)。每个线程维护双端队列,优先处理自己的任务。
2025-02-24 17:51:08
737
原创 用上了MethodHandle,妈妈再也不用担心我的反射性能不高了!
虽然它的学习曲线较为陡峭,但在需要高性能动态调用的场景(如规则引擎、RPC框架、动态代理等)中,掌握MethodHandle将使你拥有区别于普通开发者的核心竞争力。在Java的演进历程中,MethodHandle的引入(Java 7)彻底改变了我们对方法调用的传统认知。这个被称作"现代化反射"的特性,不仅带来了接近原生代码的执行效率,更为动态语言特性实现打开了新世界的大门。Java MethodHandle:颠覆你对方法调用的认知(附实战代码)二、基础实战:四步创建你的第一个MethodHandle。
2025-02-14 10:04:32
382
原创 高并发场景下,如何用无锁实现高性能LRU缓存?
通过分段锁设计,我们将单一全局锁的竞争问题转化为多个独立锁的局部竞争,从而在高并发场景下显著提升 LRU 缓存的性能。兼顾了线程安全和高效性,非常适用于对缓存响应时间要求较高的业务场景。源码经过测试,拿走即用,你可以根据实际情况调整分段数及容量,进一步优化性能。加瓦点灯,每天推送干货知识!
2025-02-13 11:20:16
1703
原创 @SneakyThrows:是Java异常处理的“魔法外挂“,还是隐藏的“定时炸弹“?
SneakyThrows如同程序界的"悬浮咒"——用得好可让代码优雅飞行,滥用则可能导致系统失控。横空出世,号称能"悄无声息"地抛出异常,它究竟是解放生产力的神器,还是破坏代码规范的"危险品"?当你凝视@SneakyThrows时,@SneakyThrows也在凝视着你。一、@SneakyThrows初体验:如何让异常"隐形"?层层包裹代码导致"金字塔噩梦",要么在方法签名中不断。引言:当Java的异常机制成为"甜蜜的负担"始终问自己:这个异常是否真的应该被"隐藏"?尽量在方法级别使用,避免类级别注解。
2025-02-11 22:44:51
383
原创 一篇文章讲透Raft共识协议
通过本文的类比讲解,相信你已经掌握了Raft的核心思想。下次当你在Kubernetes上部署应用时,不妨想想etcd如何用Raft协议默默守护着集群状态;当你使用Consul做服务发现时,也能脑补出各个节点间精妙的日志同步过程。用“班级选班长”的故事讲透Raft协议(附Java开发者必知的应用案例)1. etcd(Kubernetes的核心存储)2. Consul(服务发现与配置中心)网络恢复后,高任期Leader自动接管。:建议3-5节点集群,过多节点影响性能。一、从班级选班长理解分布式系统的痛点。
2025-02-10 22:32:34
572
原创 大模型崛起的时代,AI越来越智能,程序员的出路在哪里
2024年和2025年是大模型和AI技术快速崛起的两年, 目前大模型已经在改变我们的工作方式,程序员应该如何顺应这一浪潮?:如操作系统、编译器、嵌入式系统等,对性能要求极高,AI 目前难以完全替代人类优化。,不仅写代码,还需要学会如何利用 AI 提高效率,专注于更高层次的创新和决策。:利用 LLM 开发 AI 辅助工具、AI 生成内容(AIGC)、智能客服等。:研究和开发 AI 相关的技术,如大模型微调、AI 训练、AI 伦理问题等。:大模型能生成代码,但构建高效、可扩展的系统架构仍然需要深入的工程经验。
2025-02-10 14:46:01
385
原创 索引失效的14种常见场景
在 MySQL 中,索引有时可能会失效,导致查询性能下降。: 尽量避免在查询条件中使用这些情况,或者使用合适的索引(如组合索引、覆盖索引)来优化查询。: 使用联合索引时,如果查询的列顺序与索引创建时的顺序不匹配,索引可能会失效。: 如果查询中使用的列的数据类型与索引列的数据类型不匹配,可能导致索引失效。子句时,如果没有明确的排序索引,MySQL 可能无法使用索引。连接的多个条件中有一个没有使用索引,可能会导致索引失效。: 如果查询中在索引列上应用了函数,索引可能失效。子句)没有涉及索引时,索引会失效。
2025-02-08 18:44:08
1225
原创 今日思考:程序是如何实现随机的?以及什么是真随机和伪随机
今日神游,忽然沉思:随机是指现实生活中无规律,不可预测的事情,例如:抛硬币。的,看似随机但可预测的数列。这类随机数由数学公式计算得出,如果使用相同的初始种子(seed),则会生成相同的随机数序列。模块使用 MT19937,周期长((2^{19937}-1)),适用于科学计算和游戏随机数。如果软件代码依赖了硬件(例如:硬件噪声)那么就可以实现真随机。(a)(乘数)、(c)(增量)、(m)(模数)是预定义的常数。:相同的种子(seed)会生成相同的随机数序列。:伪随机数使用数学公式生成,比真随机数快。
2025-02-08 10:46:37
1259
原创 高性能队列 Disruptor 在 IM 系统中的实战
在 IM 系统中,用户 A 发送消息给 B、C、D 时,需要根据 B、C、D 所在的服务器节点进行分组,并将消息转发到对应的节点上。通过 Disruptor,可以大幅降低锁竞争,提高 IM 系统的吞吐量,使其能够在高并发环境下稳定运行。还没有对应的 RingBuffer 时,我们需要创建一个新的 Disruptor,并将其存入。在IM系统用的应用实战,IM系统即社交聊天系统,对实时性的要求非常高,非常符合。根据用户所在的服务节点,进行消息转发(发送消息事件到Disruptor)
2025-01-23 23:41:31
453
原创 手把手教会你Disruptor的常用使用场景!(含详细代码示例)
上期介绍到Disruptor 是一个高性能的无锁并发队列,适用于需要极低延迟和高吞吐量的应用场景。今天介绍 Disruptor 的几个常见使用场景:事件处理、日志记录、消息传递、实时数据分析和并发任务调度,让你进一步加深对它的印象,下期将介绍Disruptor核心原理。Disruptor 在低延迟、高吞吐场景下表现优异,适用于事件处理、日志记录、消息传递、实时数据分析和并发任务调度等应用。Disruptor 适用于高吞吐量的消息传递系统,例如消息队列,以及实时消息等。的核心原理, 欢迎点击关注。
2025-01-22 16:24:47
271
原创 高性能队列Disruptor的初体验
Disruptor 是一个高性能、低延迟的无锁队列替代方案,最初由 LMAX 公司开发,专为处理高吞吐量和低延迟的消息传递系统而设计。它利用环形缓冲区(RingBuffer)和无锁的生产者-消费者模型,大幅提升并发性能。今天先初步了解Disruptor的简单用法,后续会继续介绍Disruptor的特性,为什么性能秒杀JDK提供的队列,以及相关原理分析。:用于协调生产者和消费者的进度,确保消费者不会读取尚未发布的数据。,用于跟踪当前生产和消费的位置。:一个消费者的输出作为另一个消费者的输入。
2025-01-21 18:14:19
876
原创 轻量级限流算法的实现,拿走即用!
这段限流算法实现的比较简易,仅适合单体服务,如果是分布式系统可以使用redis来实现。最后, 欢迎收看往期干货加瓦点灯。
2025-01-20 17:11:34
797
原创 应用“懒加载“模式,优化@Transactional事务性能(LazyConnectionDataSourceProxy 原理解析)
LazyConnectionDataSourceProxy原理解析
2025-01-19 17:40:43
699
原创 保姆级解析雪花算法原理,看完必懂!
算法结合了时间戳、机器节点ID和序列号,保证了生成的ID在分布式环境下的唯一性,并且能够高效地生成ID(,但是它在实现上做了若干调整,主要体现在时间的基准点、节点ID的位宽、序列号的位宽等方面。:为了确保在高并发环境下生成的ID是唯一的,并且避免多个线程同时生成ID时产生冲突,使用了自旋锁。节点ID的设计保证了在多节点环境下生成的ID不会冲突,每个节点生成的ID是唯一的。:此时没有更多的ID可以生成,因此需要等待直到系统时间继续前进,产生下一个毫秒的时间戳。
2025-01-18 22:43:30
596
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人