- 博客(1131)
- 资源 (11)
- 收藏
- 关注
原创 一次无脑的 `SELECT *` 报表导出,是如何引发线上 JVM 疯狂 STW 的?
月底财务结算日,下午 15:00。:后台管理与报表微服务。前端群里炸锅了:“报表系统怎么一抽一抽的?点个查询,平时 50 毫秒,现在要转圈 8 秒钟才出来!这是极其典型的症状!整个世界被强行暂停了。
2026-04-27 07:41:35
379
原创 Spring 事务的致命陷阱:一个缓慢的 HTTP 请求,是如何耗尽数据库连接池的?
周五晚 18:30,打车/外卖/电商晚高峰。:核心交易微服务。前端疯狂反馈页面一直转圈,最后提示“网络超时”。Exception整个系统就像一个植物人,除了微弱的呼吸,对外界没有任何反应。这叫作**“系统假死”**。
2026-04-26 07:03:26
509
原创 一条慢 SQL,是如何引发 Kafka 全站“假死”的?
Kafka Rebalance 的演进史,就是一部活生生的分布式一致性算法血泪史。从简单粗暴的 Eager 模式,到认祖归宗的静态成员机制,再到精雕细琢的增量协作模式。在分布式系统里,“全局锁”和“全局屏障 (STW)”是万恶之源。最极致的性能,永远来自于将全局冲突降维成局部协同。下一次,当线上的监控大盘再次出现消费曲线断崖式跌零时,不要慌张。查一查是不是某个新来的实习生,在消费者代码里写了一个没有设置 Timeout 的 HTTP 同步请求。
2026-04-26 06:58:25
457
原创 1000 万未支付订单,如何用 10 台机器在 5 分钟内扫完并取消?
在真实的业务战场上,没有绝对的碾压,只有最合适的选择。XXL-JOB (实用主义者):自带 Web UI 管理后台,轻量级,支持动态改 Cron 表达式,能满足 90% 互联网公司的日常需求。虽然它也支持分片广播,但底层重度依赖数据库锁。ElasticJob (重型装甲车):重度依赖 Zookeeper,缺少花里胡哨的管理后台,但它的去中心化设计和极致的分片模型,是处理金融级、海量级批处理任务的绝对王者。一句话总结:当你只面对几十万数据时,请用 XXL-JOB 享受开发的便捷;
2026-04-25 07:26:31
363
原创 突破单节点 10 万 QPS 物理极限!揭秘秒杀系统底层的“库存分片”与降维打击
当流量小的时候,系统拼的是代码规范和算法复杂度;当流量大到一定程度,系统拼的就成了物理学常识。Redis 的“单线程高性能”神话,在百万级并发写面前依然会被打破。通过“库存分片”,我们将系统对 CPU 单核的时钟周期压榨,转化为了对多台机器网卡和多核 CPU 的整体调度。配合精妙的 Failover 轮询机制,我们在性能极限与数据严谨性之间,找到了最美的平衡。
2026-04-25 07:23:01
453
原创 为什么大厂都在去 Spring Cloud 化?
在讲 Service Mesh 之前,我们必须先认清 Spring Cloud / Dubbo 这类传统微服务框架的pom.xml业务开发人员的目标是写好“计算购物车总价”的代码,他们凭什么要关心网络怎么路由、流量怎么限流?
2026-04-24 06:55:48
629
原创 为什么哈希槽是 16384 而不是 65536?
这是一个在面试中能直接绝杀的考点。既然公式用的是CRC16算法,它产生的数字范围明明是0∼655350∼65535(也就是 65536 个数)。那为什么 Redis 强行取模16384(只用 1/4),白白浪费了算法的精度?这个问题当年在 Github 上引发了激烈的讨论,Antirez 亲自下场回复,道出了底层极其残酷的网络 I/O 权衡:因为 Redis Cluster 是没有中心节点(没有 Zookeeper)的,节点之间如何知道对方是死是活?如何知道槽位怎么分配的?
2026-04-24 06:53:25
485
原创 如果光缆被挖断导致 Redis 出现两个 Master,怎么防止数据丢失?
Redis 脑裂,是一场由于“网络光缆”和“异步复制机制”共同上演的黑色幽默。当我们享受 Redis 单机数十万并发写入的极速快感时,我们实际上是把“数据一致性”作为筹码,换取了这种极致的速度。配置就像是给这辆狂奔的跑车装上了一个安全气囊:当系统发现自己驶入未知的浓雾(网络分区)时,强制踩死刹车,牺牲掉这段时间的可用性,换取车毁人亡前的最后生机。
2026-04-23 07:33:21
604
原创 从 ThreadLocal 到 HTTP Header:一文看懂分布式日志串联的 3 道鬼门关
过去的架构师谈论监控,看的是 CPU 利用率、内存消耗,这叫“监控物理机”。现在的云原生架构师谈论可观测性 (Observability),看的是Metrics(指标)、Logs(日志)、Traces(链路)这三驾马车。当 TraceId 把这三者彻底打通时,微服务架构的“黑盒”才真正变成了“白盒”。
2026-04-23 07:30:48
503
原创 Docker 明明很好用,K8s 为什么要多此一举发明 Pod ?
如果你把 JVM 当作是单机时代的巅峰,那么 K8s 就是分布式集群时代的操作系统。构建了绝对可靠的中枢神经。Pod解决了多容器协同调度的落地难题。声明式 YAML + 和解循环彻底解放了生产力,实现了系统的自动愈合与弹性伸缩。当你懂得了如何用 YAML 定义世界,你才真正跨入了大厂“云原生架构师”的大门。
2026-04-22 06:52:23
416
原创 Redis 分布式限流的四大算法与终极形态
从INCR的固定窗口,到 ZSet 的滑动窗口,再到数学逻辑极度紧凑的令牌桶。分布式限流的演进,本质上是在**“请求精准度”与“内存空间消耗”**之间寻找极限平衡的过程。在这个充满恶意攻击和突发流量的互联网黑暗森林中,没有限流的系统就像一台没有刹车的跑车。而掌握了基于 Redis Lua 的令牌桶魔法,你就在网关的最前线,立起了一面永远不会被轻易击穿的叹息之墙。
2026-04-22 06:50:12
570
原创 从 CMS 到 ZGC,JVM 是如何将停顿时间压缩到 1 毫秒的?
纵观 JVM GC 的演进史,其实是一场旷日持久的**“吞吐量 (Throughput)” 与 “延迟 (Latency)” 的零和博弈**。Parallel (吃苦耐劳的老黄牛):吞吐量极高,适合在后台跑离线数据批处理,不在乎卡顿几秒钟。CMS (老兵不死):Web 时代的第一代功臣,但败给了内存碎片引起的退化。G1 (中流砥柱):目前 JDK 8+ 生产环境的绝对主力,用 Region 划分完美平衡了吞吐量与停顿时间。ZGC (未来之光)
2026-04-21 08:45:00
373
原创 为什么你的 `ORDER BY` 拖垮了数据库?谈谈高频实时排序场景下的架构取舍
想象一下,你面前有一条单向链表,里面按从小到大的顺序排着 1 万个数字。你想找数字8900。在普通链表里,你只能从头开始,顺着指针一个一个往后摸,需要遍历 8900 次,时间复杂度是极其缓慢的ONO(N)ON。跳表的“开挂”逻辑:建高架桥!最底层的链表,包含了所有的 1 万个节点。我们从 L0 层里随机挑出一部分节点,提拔到 L1 层,并用指针连起来。再从 L1 层里随机挑出一部分节点,提拔到 L2 层。…… 以此类推。当你要找8900时,你不再走拥堵的“地面道路”(L0)。
2026-04-20 08:30:00
223
原创 为什么 ConcurrentHashMap 1.8 重新用回了笨重的 synchronized 锁?
看完源码,你会对空桶无锁,有桶加锁(CAS + Synchronized,极限压榨锁粒度)。多线程协同搬砖(把扩容的性能损耗均摊给了所有线程)。分散计数(解决高并发下单一计数器的热点问题)。理解了它,你再去理解分布式系统架构中的分片、限流、热点打散,其实都是在运用同一套底层哲学。
2026-04-19 08:30:00
189
原创 在微服务里造一个微缩版 Kafka:Spring Boot 整合 Redis Stream 全指南
Redis 从未停止过向更广阔的计算领域扩张。List只是一个简陋的玩具管子,Pub/Sub只是一个没有记忆的大喇叭。而Stream则是 Redis 真正向成熟的事件驱动架构(EDA)交出的一份完美答卷。通过XGROUP和XACK构建起护城河,利用PEL兜底故障,Redis 用极简的 C 语言代码和逆天的内存压缩率,硬生生在自己的地盘里,为开发者搭建了一座微缩版的 Kafka。
2026-04-18 07:02:09
468
原创 ThreadLocal 为什么会引发内存泄漏?揭秘底层“弱引用”的致命陷阱
在多线程环境下,为了保证线程安全,我们通常会加锁。但加锁会导致线程排队,极其消耗性能。有没有一种方法,既能保证线程安全,又不需要加锁呢?有,那就是**“一人发一份,各玩各的”**。这就是。像 Spring 的事务管理(保证同一个事务用同一个数据库连接)、用户登录的 Session 信息传递,底层全都是靠实现的。听起来很完美,但只要你用了线程池,就会化身为隐藏在 JVM 里的“内存刺客”。
2026-04-18 06:59:55
371
原创 Redis 6.0 客户端缓存如何终结“百万级热点 Key”战争?
微博突然爆出惊天大瓜。吃瓜群众疯狂刷新,某个大 V 的个人主页(单 Key)每秒承受的GET请求。你的 Redis 集群有 100 台机器,但因为这是一个单 Key,按照 Hash 路由,这 200 万次请求全打在了上。哪怕 CPU 扛得住,服务器的万兆网卡(10Gbps)也早就被这每秒几百 MB 的出站流量打得千疮百孔,直接瘫痪。你在应用层加了 Guava/Caffeine 本地缓存。请求全挡在了应用服务器内存里,Redis 压力清零,网卡恢复。5 分钟后,大 V 删除了那条动态(数据变更)。
2026-04-17 07:41:15
409
原创 从 CAS 到 CLH 队列,通俗易懂推演 AQS 抢锁大战
用volatile+ CAS 保证了极限性能下的无锁状态切换。用 CLH 队列管理海量线程,避免了群集效应。用实现了精准的线程挂起与唤醒。在 Java 并发领域,我们今天能够如此轻松地写出千万并发的微服务,全靠 AQS 在底层默默承受着所有线程的争抢与蹂躏。
2026-04-17 07:38:05
579
原创 大模型只会胡说八道?一文看懂向量数据库与 RAG 的底层魔法
不要把 AI 当成抢饭碗的敌人,要把大模型当成系统中计算资源的一个特殊组件(推理引擎)。传统的 Controller 层接收 HTTP 请求。未来的 AI 应用层接收人类的自然语言。大模型负责理解意图并规划任务。向量数据库提供精准的知识召回。我们写好的底层微服务接口,化身成为 AI 随时调用的“武器库”。一句话总结:大模型只是硅谷大佬们提供的一个超级大脑,但如何把这个大脑接上神经网络,让它在复杂的业务系统里跑起来,这依然是我们后端架构师的天下!
2026-04-16 07:09:40
396
原创 Redis 变成多线程了,那我的 SETNX 和 Lua 脚本还需要加锁吗?
Redis 6.0 的多线程,是一场克制且精准的“微创手术”。它保留了单线程模型在内存操作上的绝对纯粹与极速,同时又无情地剥离了网络协议解析的 CPU 负担。真正的极客,从不会为了追逐新概念而盲目重构,他们永远只在系统最痛的那个物理瓶颈上动刀。
2026-04-16 07:06:04
557
原创 除了 LRU,你还知道 Redis 4.0 引入的 LFU(最不经常使用)算法吗?
Redis 内存淘汰机制的演进史,就是一部与“内存开销”和“业务边缘场景”死磕的极客史。从拒绝笨重的双向链表,发明随机抽样的近似 LRU;再到为了抵御全表扫描,将 24 bit 掰成两半,用对数函数和时间衰减硬生生造出LFU。
2026-04-15 07:08:24
375
原创 极简的“绝对优先级”队列:一行代码搞定 VIP 用户插队特权
在追求极简架构的路上,深入理解基础命令的潜规则,往往能省下数十行的复杂代码和沉重的中间件部署。BRPOP对多键从左至右的偏心监听,就是这样一个被设计好的底层彩蛋。它极其适合业务复杂度不高、优先级阶梯固定的插队场景。用最简单的机制,解决最棘手的商业化痛点,这就是资深后端工程师的代码艺术。
2026-04-14 17:30:18
453
原创 加了分布式锁,为什么用户还是被扣了两次钱?
分布式锁只能解决“性能”问题(防止大家一拥而上),不能解决“正确性”问题。当网络不可靠、时间不可靠时,锁随时会背叛你。只有把数据库当成最后一道防线,通过幂等设计让系统无视重试,你才能在深夜里睡个安稳觉。
2026-04-13 08:30:00
627
原创 你以为写个 SETNX 就是分布式锁了?揭秘死锁危机与 Redisson 续期魔法
分布式锁的演进,是一场与并发、网络、宕机时间进行极限博弈的战争。从裸奔的SETNX,到带过期时间的SET EX NX;从 Lua 脚本防误删,再到 Redisson WatchDog 的自动续期守护。我们穷尽了工程学的智慧。使用 Redisson 时,如果你不懂底层原理,千万不要画蛇添足地给lock()方法传过期时间参数。相信那只默默无闻的看门狗,它比你更懂什么时候该放手。
2026-04-13 08:30:00
382
原创 删了 5GB 数据,内存却一点没降?揭开 Redis 内存碎片的“幽灵”面纱
当 5GB 内存凭空消失时,不要慌张,它只是变成了 Linux 内存页里的“幽灵”。理解了jemalloc的分配机制和的诊断指标,你就能自信地对运维说出:“不是代码内存泄露,是碎片率到了 1.8”。打开的开关,调整好 CPU 油门,看着奇迹般地一点点降下来,这是属于资深服务端架构师的独特浪漫。
2026-04-12 06:34:42
402
原创 为什么阿里开发手册强制要求 Long 类型必须转 String 传给前端?
数据交换不是白给的。每一次序列化都是对 CPU 的一次压榨,每一次反序列化都是对信任的一次挑战。
2026-04-12 06:32:00
491
原创 发现超级大 Key 怎么办?千万别敲 DEL!揭秘 UNLINK 异步删除魔法
从DEL的同步阻塞,到UNLINK的异步分离。这表面上是一个简单命令的替换,背后其实是架构师对**“临界区与后台任务分离”**设计思想的深刻理解。下一次,当你通过监控抓住了那个让服务器瑟瑟发抖的“超级大 Key”时,请收起你准备敲击D-E-L的手指,优雅地输入UNLINK,然后深藏功与名。
2026-04-11 07:42:07
426
原创 为什么加了 100 台服务器还是崩了?聊聊高并发下的“连环车祸”
因为在这个混乱、无序、充满 Bug 的数字宇宙里,我们是唯一的守望者。我们享受那种**“泰山崩于前而代码不乱”的镇定,享受那种“在废墟中重建秩序”**的成就感。
2026-04-11 07:38:33
470
原创 一核有难,九核围观?打爆 Redis 集群的“数据倾斜”与热点追踪实战
Redis Cluster 是一张极具弹性的网,但 Hash Tag 就像是绑在这张网上的铅块。我们在享受它带来的“多 Key 事务”便利时,必须时刻监控流量的倾斜。真正的高并发架构师,不在于能写出多复杂的 Lua 脚本,而在于能在流量洪峰到来前,凭借敏锐的嗅觉识别出“热点”与“大 Key”,用本地缓存和分片打散机制,化解单机物理瓶颈于无形。
2026-03-16 08:30:00
326
原创 “TODO:以后重构”,这是程序员在这个世界上撒过最大的谎
当你还是个新手时,你觉得编程是魔法。你敲下回车,屏幕上亮起,你觉得自己无所不能。当你成为老手时,你发现编程是拆弹。你战战兢兢地看着满屏的警告,知道哪怕少写一个,整个世界都会崩溃。但当你真正登顶编程,是一门关于“妥协与平衡”的哲学。你懂得在“完美的架构”和“明天必须上线”之间找到平衡。你懂得在“无尽的性能优化”和“高昂的服务器成本”之间做出取舍。你懂得承认自己的无知,写下详尽的注释,因为你知道几个月后的自己也会变成个傻瓜。你不再追求写出没有任何 Bug 的神级代码。
2026-03-16 08:30:00
397
原创 单机切 Redis Cluster 后,为何满屏都是 CROSSSLOT 报错?
从单机走向集群,意味着你必须放弃一部分“为所欲为”的便利性,去拥抱分布式的物理法则。Hash Tag ({}) 是对这条法则的合法“欺骗”。它让你在享受集群海量吞吐力的同时,保留了局部操作的原子性和极致性能。但记住,物理法则不可违抗。过度使用 Hash Tag 捆绑数据,就是在亲手拆毁你的集群,把它重新变回一个脆弱的单点系统。
2026-03-15 08:45:00
520
原创 订单表拆成 100 张后,那些要命的查询该怎么做?
分库分表是关系型数据库被逼到悬崖边上的无奈之举。它用极度复杂的“路由与聚合”逻辑,换取了存储容量和并发写入的上限。非分片键查询:用“基因法”把路由信息刻在 ID 里,或者用 Binlog 异构同步到 Elasticsearch。跨库深分页:坚决对产品经理说不,改用“游标法 (Cursor)”,或者交由专业的搜索引擎来处理。
2026-03-15 08:45:00
506
原创 打包 100 万条命令进 Pipeline 会怎样?
很多技术灾难的起源,并不是因为我们不懂高阶工具,而是因为我们把高阶工具当成了没有边界的银弹。Pipeline 的本质是用本地内存去换取网络时间。当你妄图在一个网络请求里塞入无尽的数据时,操作系统的缓冲区和 JVM 的垃圾回收器一定会让你付出惨痛的代价。
2026-03-14 08:30:00
473
原创 Java Agent 字节码增强技术到底有多野?
Java Agent(Java 代理)不是什么第三方框架,而是 JVM 亲生的底层机制。它的本质是一个特殊的 Jar 包。当你启动 Java 程序时,JVM 会在执行你写的main()方法之前,先去执行这个 Agent 里的特殊方法。这就好比在程序的“受精卵”阶段,你就把一个“间谍”植入了进去。Java Agent 字节码增强技术,赋予了架构师“运行时上帝视角”。优势:绝对的零侵入,业务团队毫无感知;能力通天,可以监控、诊断、甚至热修复线上 Bug(Arthasredefine指令)。代价。
2026-03-14 08:30:00
563
原创 如果不用 Pipeline,MGET 查 5 万个 Key 会怎样?
架构优化从来不是靠死记硬背几个命令,而是对计算机底层物理法则(网络 I/O、CPU 周期、内存模型)的敬畏。如果你需要异构命令的网络提速,请拥抱Pipeline。如果你需要单一数据的极速获取,请使用MGET/MSET。当你面对海量大盘数据,请用Chunked 切片 + 混合双打,这才是兼顾吞吐量与系统稳定性的宗师级手法。
2026-03-13 08:30:00
282
原创 如何从零手写一个 Maven 插件 (Plugin)?
自动化测试强管控:写一个插件,在test阶段扫描代码覆盖率,低于 80% 直接,强行阻断团队打包。字节码防篡改:在package阶段,自动为所有 class 文件打上公司专属的水印或进行代码混淆。零侵入生成:基于数据库表结构,在阶段瞬间生成全套的 Controller、Service 和 Mapper。
2026-03-13 08:30:00
329
原创 如果 Canal 跑得比 MySQL 主从同步还快,脏数据怎么防?
在架构的世界里,所有的高并发问题,归根结底都是时间差的问题。当我们引入了 Canal 和 MQ 追求极速解耦时,千万不要忘了底层 MySQL 主从复制那蹒跚的脚步。通过**“MQ 延迟二次删除”去等待它,或者通过“路由标记法”**去绕过它,都是系统走向成熟、经得起双十一流量重锤的必修课。
2026-03-12 08:30:00
1040
原创 如何从零手写一个企业级 Spring Boot Starter?
封装 Starter 的过程,其实就是面向对象编程中“高内聚、低耦合”思想的巅峰体现。高内聚:短信发送的所有底层复杂逻辑、API 签名、重试机制,全部在这个 Starter 内部解决。低耦合:业务团队的开发人员,只需要在pom.xml里加一行代码,@Autowired一下,就能拥有神级能力。
2026-03-12 08:30:00
401
原创 为什么所有大牛都建议“删除”缓存,而不是“更新”缓存?
无论是双删还是 Canal,最后一步的操作都是Delete,而不是Set。为什么?如果你改了 100 次价格,但在此期间没有任何人访问这个商品。如果你每次都去 Update 缓存,就是白白浪费 CPU。直接 Delete,等下一次真实用户访问时再查库回写,效率最高。线程 A 把价格更新为 80,线程 B 把价格更新为 90。由于网络延迟,线程 B 先执行了,线程 A 后执行了。数据库里是最新的 90,缓存里却被错误覆盖成了旧的 80。Delete 操作天然免疫这种顺序覆盖问题。
2026-03-11 08:30:00
997
1
原创 自动装配:干掉 XML 的幕后黑手是谁?扒开 @SpringBootApplication 的底裤
触发点:执行main()方法,触发。拿名单去各个 jar 包里读取.imports或文件,把官方写好的 100 多个配置类名单全拿出来。过安检:Spring 挨个检查这 100 多个类头上的条件注解。按需装配:因为你只引入了,所以只有 Web 相关的条件成立。其余 90 多个无关组件的配置类全部被无情丢弃。大功告成:最终通过安检的几个配置类被实例化,Tomcat 启动,DispatcherServlet 就绪。一句话总结:Spring Boot 就是一个带了 100 多份合同(配置类)的万能中介。
2026-03-11 08:15:00
957
gradle+spring+springmvc+springjdbc
2015-09-14
JAVA工具类
2015-08-18
dubbo-admin-0.0.1-SNAPSHOT.jar
2020-05-28
human_resources
2015-04-24
jquery.validationEngine校验插件
2015-08-07
gralde+spring+springmvc+springjdbc+mysql
2015-09-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅