- 博客(114)
- 收藏
- 关注
原创 面试官: 如何设计一个评论系统?
流量规模技术方案查询方式中小体量单表 + 两级 root_idMySQL 直接分页 + join中高体量分表 + root_id + 异步聚合分表查询 + Redis 缓存超大规模多层缓存 + KV 查询抛开业务谈设计都是耍流氓,根据不同的规模选择最合适的方案,满足现有业务发展需求,便是优秀的架构设计。小体量可采用通用设计模型,预留关键扩展点(如 ID 算法、root_id、MQ 链路),未来才能轻松应对流量爬坡。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注公众号:加瓦点灯,
2025-07-17 17:21:46
422
原创 Spring AI + Milvus 实现 RAG 智能问答系统实战
通过的组合,可以轻松构建强大的、基于RAG 架构的智能语义搜索和问答应用。Spring AI 极大地简化了 AI 能力集成,让 Java 后端也能快速拥抱大语言模型和向量数据库技术。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注公众号:加瓦点灯,每天推送干货知识!
2025-07-03 14:55:35
1010
原创 一文搞懂高性能定时器:时间轮
时间轮(TimeWheel)是一种高效的定时任务调度算法,适用于高并发场景。它通过环形数组和哈希思想实现O(1)的任务添加和到期检测,比传统基于优先级队列的定时器更轻量级。Netty的HashedWheelTimer是其典型实现,常用于连接超时管理等低时效性任务。在SpringBoot中,通过@Bean配置HashedWheelTimer并配合@PostConstruct和@PreDestroy进行任务调度和资源管理,可有效处理海量短周期定时任务。时间轮的优势在于性能与任务数量无关,但其精度存在±Tick
2025-06-27 17:24:05
1025
原创 读扩散 vs 写扩散:IM系统消息分发策略深度解析
这两个术语本质上是在讲:“消息写入和分发的责任,应该交给谁?选择写扩散当接收者数量有限(<100)实时性要求高读操作远多于写操作系统规模较小选择读扩散当接收者数量巨大(>1000)存储成本敏感允许一定延迟历史消息查询频繁混合策略适用大多数生产环境需要平衡实时性和资源消耗系统包含多种消息类型(私聊/群聊)总结在设计分布式消息系统时,理解业务场景的本质需求,结合读扩散和写扩散的互补优势,采用动态策略和分级处理机制,才能构建出既高效又经济的消息分发系统。
2025-06-26 16:22:34
713
原创 实战 | 如何设计一套真实、抗刷的文章阅读数统计系统?
阅读数看似简单,但在真实环境中要做好却并不容易。用户行为识别数据去重机制防刷策略缓存与数据库双写系统稳定性与性能优化通过本文设计的这套方案,我们可以兼顾准确性、防刷能力、系统性能与用户体验,构建一套可持续、可扩展的文章阅读统计系统。👋最后问一句:你网站的阅读数,可信吗?如果文章对你有帮助,点个免费的赞鼓励一下吧!关注公众号:加瓦点灯,每天推送干货知识!
2025-06-25 16:07:30
774
原创 浅谈Java Introspector:理解与应用 Java Bean 内省机制
摘要: JVM的优雅停机机制通过信号处理与Shutdown Hook实现应用资源的妥善释放。当收到SIGTERM或SIGINT等信号时,JVM会依次执行:冻结用户线程、运行注册的Shutdown Hook、触发finalizer(不推荐),最终退出。Spring Boot在此基础上封装了上下文关闭流程,提供多种方式处理停机逻辑。在Kubernetes环境中,需配合preStop钩子和terminationGracePeriodSeconds实现完整停机流程。注意:SIGKILL和System.halt()会
2025-06-23 14:10:38
878
原创 深挖 JVM 关闭钩子与 Signal 机制:优雅停机背后的秘密
摘要: JVM的优雅停机机制通过信号处理与Shutdown Hook实现应用资源的妥善释放。当收到SIGTERM或SIGINT等信号时,JVM会依次执行:冻结用户线程、运行注册的Shutdown Hook、触发finalizer(不推荐),最终退出。Spring Boot在此基础上封装了上下文关闭流程,提供多种方式处理停机逻辑。在Kubernetes环境中,需配合preStop钩子和terminationGracePeriodSeconds实现完整停机流程。注意:SIGKILL和System.halt()会
2025-06-20 15:33:24
303
原创 万字解析三大限流算法:时间窗口,令牌桶,漏桶
系统限流技术解析:滑动窗口、漏桶与令牌桶算法 摘要:限流机制是系统防护的关键技术,本文详细剖析了三种主流限流算法。滑动窗口算法通过精确统计动态时间段内的请求数实现限流;漏桶算法以恒定速率处理请求,适合平滑流量;令牌桶算法则允许一定突发流量,更具灵活性。文章从工作原理、数学模型、实现代码到优缺点进行了全面对比,为系统架构师提供了实用的算法选型指导,帮助构建稳定、高效的系统防护体系。
2025-06-20 15:00:38
463
原创 万字解析mysql锁机制
MySQL锁机制是数据库并发控制的核心组件,主要分为全局锁、表级锁、页级锁和行级锁。按锁的兼容性可分为共享锁(S)、排他锁(X)及意向锁(IS,IX);按加锁思想又分为乐观锁(应用层实现)和悲观锁(数据库实现)。不同事务隔离级别采用不同的锁策略,如InnoDB默认的RR级别使用Next-Key Lock防止幻读。锁机制通过协调并发访问,确保数据一致性和完整性,同时平衡性能与安全性。
2025-06-20 14:59:00
246
原创 理解 JVM 的 Safepoint:一次全面但不啰嗦的讲解
JVM的Safepoint机制解析与实践影响 摘要:Safepoint是JVM执行过程中的关键机制,它定义了线程可以安全暂停的特殊位置,用于支持垃圾回收、锁撤销、类卸载等需要全局一致性的操作。通过全局标志位和主动检查实现线程暂停,但存在长时间循环可能阻塞STW的风险。实践案例显示,监测工具jmap的误用会导致服务卡顿,因触发Safepoint时需等待所有线程响应。测试代码验证了当主线程等待子线程进入Safepoint时的延迟现象,可通过调整JVM参数优化。理解Safepoint机制对诊断JVM性能问题至关重
2025-06-20 14:58:10
416
原创 通过 Netty 的 Pipeline 学习责任链设计模式
责任链模式是一种解耦发送者和处理者的行为设计模式,通过链式传递请求让多个处理对象有机会处理。Netty框架的ChannelPipeline完美运用了这一模式,通过添加多个ChannelHandler形成双向链表,每个Handler处理特定业务逻辑或传递请求。源码分析显示,Netty通过ChannelHandlerContext包装Handler,使用ctx.fireXXX()方法实现链式调用。该模式支持动态插拔Handler、顺序执行和灵活组合等特性,在保持代码扩展性的同时降低了模块耦合度。LoggingH
2025-06-20 14:57:20
357
原创 对线面试官:Elasticsearch为什么快?
倒排索引是一种按关键词组织文档的数据结构,用于加快全文检索。简单说,就是“词 → 出现在哪些文档”。用倒排索引替代扫描匹配,避免全文遍历写入即建索,实现查询零延迟预处理Lucene 提供了极致的单机检索效率分布式结构使其天然支持扩展与并发多层缓存减少了磁盘 I/O 与 CPU 计算段合并与压缩保持系统长期健康稳定掌握这些原理,不仅能理解 Elasticsearch 的高性能本质,也能在实际使用中更好地优化查询速度与系统稳定性。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh。
2025-05-15 17:23:42
694
原创 为什么总有人觉得5万块钱可以做一个淘宝?
今天,我以淘宝的系统为例,给你介绍了一个系统逐渐由简单变复杂的发展历程,希望你能认清不同业务量级的系统本质上就不是一个系统。一方面,有人会因为对业务量级理解不足,盲目低估其他人系统的复杂度;另一方面,也有人会盲目应用技术,给系统引入不必要的复杂度,让自己陷入泥潭。作为拥有技术能力的程序员,我们都非常在意个人技术能力的提升,但却对在什么样情形下,什么样的技术更加适用考虑得不够。采用恰当的技术,解决当前的问题,是每个程序员都应该仔细考虑的问题。
2025-04-25 15:31:02
767
原创 Theadlocal内存泄露?没那么夸张
是 Java 提供的一种用于线程本地存储的机制。它可以为每一个线程提供一个变量的副本,使得每个线程都可以独立地修改自己的副本,而不会影响其他线程的变量。在多线程环境下,这样做的好处是避免了非线程安全的问题,无需使用锁来进行同步。是一个功能强大的工具,其核心价值在于线程封闭(Thread Confinement),将某些需隔离的资源绑定到线程生命周期,简化多线程编程复杂度。不要因为害怕内存泄露而不敢用,只要我们用完就清除,就不会泄露,大胆用起来吧!如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh。
2025-04-25 15:07:52
649
原创 SQL语句是怎么被执行的?一条sql语句的幕后旅程
虽然只是简单更新一个字段,但背后 MySQL 做了大量精密工作——从内存控制、日志写入到事务保障,处处体现出设计者的匠心。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-16 19:00:26
659
原创 从懵逼到上头:和MVCC死磕的108分钟顿悟时刻
MVCC,即多版本并发控制,是一种乐观并发控制技术。数据库为每一行记录保存多个版本。这些版本不仅包含数据的最新状态,还保留了历史状态,从而使得并发事务在读取数据时可以看到一个“快照”。每条记录通过内置的系统列保存版本信息,如事务 ID(通常称为 DB_TRX_ID)、回滚指针(ROLLBACK POINTER)以及删除标记等。这些信息构成了记录的版本链,帮助判断哪个版本对当前事务可见。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-14 17:34:10
1030
原创 从阻塞到 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
1134
原创 别再背线程池的七大参数了,现在面试官都这么问
Worker如何通过AQS实现不可重入锁状态机转换如何影响任务调度阻塞队列与线程存活的精妙配合七大参数对你来说不再是孤立的概念,而是有机组合的设计元素。这才是面试官真正想考察的——对并发编程本质的理解能力。下次面试时,不妨主动反问:“您是想了解参数设计的trade-off,还是具体的实现机制?” 这会让面试官眼前一亮。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!
2025-04-10 14:42:49
1023
原创 Spring状态机实战入门:Java程序的状态流转可以这样管
/ 订单状态枚举 /*** 订单状态枚举(有限状态集合)* 建议:状态命名要直观体现业务含义UNPAID, // 待支付(初始状态) PAID, // 已支付(支付成功后进入此状态) DELIVERING, // 发货中(商家操作发货后状态) COMPLETED // 已完成(用户确认收货后终止状态) } /*** 订单事件枚举(触发状态变化的操作)* 注意:事件命名建议使用动词形态。
2025-04-09 17:36:18
540
原创 受够了重复性工作,一怒之下手撸一个多平台文章同步工具
作为喜欢分享技术博客的程序员,我经常需要在**知乎、CSDN、今日头条、掘金**四个平台同步内容。于是开发了一个一键同步文章到多平台的工具
2025-04-02 17:45:19
545
原创 IM入门之:万人群聊系统设计的难点与架构优化实践
空间换时间通过内存缓冲、合并操作化解写入风暴异步化与批处理将同步操作转化为异步队列处理,提升系统吞吐数据分片与本地化避免全局状态依赖,利用哈希分片实现水平扩展柔性设计允许短暂延迟/数据不一致,换取系统整体可用性这些方案已在微博等亿级用户平台验证,可扩展至社交、IoT等需要海量消息分发的场景。在面对类似挑战时,开发者应重点关注写入放大与状态同步问题,通过分层治理实现系统弹性的跃升。加瓦点灯, 每天推送干货知识!
2025-03-29 23:21:17
882
原创 让代码自带「防重」Buff: 手写分布式幂等组件
实现,通过注解声明式配置,提供灵活、高性能的接口幂等性保障。支持快速失败与阻塞等待两种模式,集成自定义策略扩展能力,适用于springboot项目分布式场景下的重复请求拦截与处理。开发者无需修改业务代码即可集成,同时支持灵活扩展,适用于电商、金融等高并发场景,有效保障系统数据一致性。通过 Spring Boot starter 自动装配,支持自定义处理器工厂扩展,无缝集成现有系统。:默认基于 Redis 缓存,支持自定义处理器(如数据库持久化)。注解标记需幂等控制的方法,支持参数动态配置。
2025-03-22 23:12:47
679
原创 @ControllerAdvice无法捕获HandlerInterceptor拦截器里抛出的异常解决办法
@RestControllerAdvice 无法捕获WebMvcConfigurer拦截器里抛出的异常,怎么解决
2025-03-18 10:15:33
375
原创 对线面试官:Java中的锁机制
实现:通过CAS操作将Mark Word复制到线程栈中的Lock Record。在多线程并发编程中,锁是协调线程对共享资源访问的核心机制。等),理解这些分类有助于在实际开发中选择最合适的同步机制。Java显式锁的基石,采用CLH队列变体实现同步控制。不同的锁类型在Java并发包中都有典型实现(如。实现:通过操作系统的互斥量(mutex)实现。原理:在Mark Word中记录线程ID。:保证共享变量的修改对其他线程立即可见。:严格顺序用公平锁,高吞吐用非公平锁。的底层实现经历了多次优化,核心机制为。
2025-03-17 17:38:23
568
原创 Guava EventBus:程序员必备的事件驱动框架,你还没用过?
Google Guava EventBus是Guava工具库中的事件驱动组件,采用发布-订阅模式实现组件间解耦通信。它提供轻量级的事件总线机制,允许不同组件通过事件进行交互而无需直接引用彼此。
2025-03-08 19:57:17
1279
原创 培养项目中横向抽象的能力:构建可复用的技术中台思维
当这种思维成为团队的本能时,你会发现:原本错综复杂的业务系统,正在悄然进化为层次清晰的技术中台。在软件开发中,我们常遇到一类特殊需求:它们不直接属于业务逻辑,却像"毛细血管"般渗透到各个模块中,例如。本文将通过实际案例,揭示如何通过泛型、函数式接口和设计模式的组合拳,打造高复用性的技术中台能力。通过这种设计,开发者可以像搭积木一样组合技术能力,让业务代码保持简洁。:需要统计核心方法的执行耗时、入参和结果,但不希望污染业务代码。培养项目中横向抽象的能力:构建可复用的技术中台思维。,而处理它们的核心能力正是。
2025-02-28 15:36:32
259
原创 Java web后端转Java游戏后端
通过以上流程,Java后端开发者可逐步掌握游戏开发特性,重点需要转变的思维模式包括:从请求响应模式到实时状态同步、从CRUD主导到复杂逻辑计算、从分钟级延迟到毫秒级响应的要求。作为Java后端开发者转向游戏后端开发,虽然核心编程能力相通,但游戏开发在架构设计、协议选择、实时性处理等方面有显著差异。使用Netty/Mina框架处理高并发连接(单机支撑5W+连接是基本要求)动态调整同步频率(近距离玩家100ms/次,远距离500ms/次)采用WebSocket/TCP长连接(90%以上MMO游戏选择)
2025-02-26 11:19:31
800
原创 Java Fork/Join框架详解
在Java并发编程中,Fork/Join框架是一个强大的工具,它允许开发者轻松地利用多核处理器的优势来执行并行任务。作为一名资深Java开发工程师,我将在本文中深入探讨Fork/Join框架的概念、原理、使用场景以及具体的使用方法,并通过实例帮助你更好地理解和掌握这一技术。Fork/Join框架通过智能的任务分发和高效的工作窃取机制,成为处理可分解并行任务的利器。采用递归分解策略:将大任务拆分为子任务(Fork),并行执行后合并结果(Join)。每个线程维护双端队列,优先处理自己的任务。
2025-02-24 17:51:08
752
原创 用上了MethodHandle,妈妈再也不用担心我的反射性能不高了!
虽然它的学习曲线较为陡峭,但在需要高性能动态调用的场景(如规则引擎、RPC框架、动态代理等)中,掌握MethodHandle将使你拥有区别于普通开发者的核心竞争力。在Java的演进历程中,MethodHandle的引入(Java 7)彻底改变了我们对方法调用的传统认知。这个被称作"现代化反射"的特性,不仅带来了接近原生代码的执行效率,更为动态语言特性实现打开了新世界的大门。Java MethodHandle:颠覆你对方法调用的认知(附实战代码)二、基础实战:四步创建你的第一个MethodHandle。
2025-02-14 10:04:32
414
原创 高并发场景下,如何用无锁实现高性能LRU缓存?
通过分段锁设计,我们将单一全局锁的竞争问题转化为多个独立锁的局部竞争,从而在高并发场景下显著提升 LRU 缓存的性能。兼顾了线程安全和高效性,非常适用于对缓存响应时间要求较高的业务场景。源码经过测试,拿走即用,你可以根据实际情况调整分段数及容量,进一步优化性能。加瓦点灯,每天推送干货知识!
2025-02-13 11:20:16
1738
原创 @SneakyThrows:是Java异常处理的“魔法外挂“,还是隐藏的“定时炸弹“?
SneakyThrows如同程序界的"悬浮咒"——用得好可让代码优雅飞行,滥用则可能导致系统失控。横空出世,号称能"悄无声息"地抛出异常,它究竟是解放生产力的神器,还是破坏代码规范的"危险品"?当你凝视@SneakyThrows时,@SneakyThrows也在凝视着你。一、@SneakyThrows初体验:如何让异常"隐形"?层层包裹代码导致"金字塔噩梦",要么在方法签名中不断。引言:当Java的异常机制成为"甜蜜的负担"始终问自己:这个异常是否真的应该被"隐藏"?尽量在方法级别使用,避免类级别注解。
2025-02-11 22:44:51
401
原创 一篇文章讲透Raft共识协议
通过本文的类比讲解,相信你已经掌握了Raft的核心思想。下次当你在Kubernetes上部署应用时,不妨想想etcd如何用Raft协议默默守护着集群状态;当你使用Consul做服务发现时,也能脑补出各个节点间精妙的日志同步过程。用“班级选班长”的故事讲透Raft协议(附Java开发者必知的应用案例)1. etcd(Kubernetes的核心存储)2. Consul(服务发现与配置中心)网络恢复后,高任期Leader自动接管。:建议3-5节点集群,过多节点影响性能。一、从班级选班长理解分布式系统的痛点。
2025-02-10 22:32:34
598
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人