自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(2564)
  • 资源 (1)
  • 收藏
  • 关注

原创 你不是 leader,怎么推动事情走下去?

你不是指挥官,但你是facilitator —— 促动者,让人听你不是因为你大,而是你有组织力。有时候你不说话,事情就真没人记得了。不是你说了算,但你提的方案有道理,大家就会照你说的做。为了不耽误进度,我先拟了一个初步下一步,欢迎补充修改。不是甩锅,而是聪明地引入该出现的人,顺带洗清责任。提前提醒一下,如果要推进,可能需要领导的决策。你作为这方面的专家,是不是可以牵头一下这块?这边我草拟了一个初步方案,欢迎大家补充建议。我只是想帮大家对齐一下,方便推进下一步。我把这个加进我们的进度表,方便持续关注。

2025-06-26 00:16:36 693

转载 服务端高并发分布式架构演进之路

1. 概述本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。特别说明:本文以淘宝为例仅仅是为了便于说明演进过程可能遇到的问题,并非是淘宝真正的技术演进路径2. 基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:分布式 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署

2021-05-25 17:47:54 510

转载 警惕软件复杂度困局

简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。写在前面软件设计和实现的本质是工程师相互通过“写作”来交流一些包含丰富细节的抽象概念并且不断迭代过程。另外,如果你的代码生存期一般不超过6个月,本文用处不大。一 软件架构的核心挑战是快速增长的复杂性越是...

2021-05-19 18:17:58 777

转载 常见代码重构技巧,非常实用

关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的作者Martin..

2021-05-13 10:01:52 1357

转载 JAVA线上故障排查全套路

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。一、CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用js

2020-09-22 17:45:24 560

转载 图解+代码|常见限流算法以及限流在单机分布式场景下的思考

大家好,我是 yes。今天来说说限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。当然在介绍限流算法和具体场景之前我们先得明确什么是限流,为什么要限流?。任何技术都要搞清它的来源,技术的产生来自痛点,明确痛点我们才能抓住关键对症下药。限流是什么?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。题外话:我之前看到个新闻,最不想卖门票的景区“

2020-09-22 13:06:08 693

转载 springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

本文都是springboot的常用和实用功能,话不多说开始吧定时任务1.启动类开启注解@EnableScheduling //开启基于注解的定时任务@MapperScan("com.pdzx.dao")@SpringBootApplicationpublic class VideoApplication { public static void main(String[] args) { SpringApplication.run(VideoApplicatio

2020-08-26 20:22:41 2118

原创 聊聊微服务架构及分布式事务解决方案

分布式事务场景如何设计系统架构及解决数据一致性问题,个人理解最终方案把握以下原则就可以了,那就是:大事务=小事务(原子事务)+异步(消息通知),解决分布式事务的最好办法其实就是不考虑分布式事务,将一个大的业务进行拆分,整个大的业务流程,转化成若干个小的业务流程,然后通过设计补偿流程从而考虑最终一致性。什么是事务事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻...

2020-04-21 22:34:45 724

转载 Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程...

2020-04-03 14:58:43 819

转载 Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

一、深入JVM锁机制:synchronizedsynrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁...

2020-04-01 16:00:25 652

转载 一文带你理解Java中Lock的实现原理

当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章发给他。在这里...

2020-04-01 15:04:40 1019

转载 业务复杂=if else?刚来的大神竟然用策略 工厂彻底干掉了他们!

对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分...

2019-10-24 13:41:06 961

原创 MySQL入门到精通-原理篇(十五 锁)

锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时锁机制。

2026-10-12 01:17:56 185

原创 MySQL入门到精通-原理篇(十三 事务基础知识)

事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通 过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失。

2026-10-12 00:48:35 164

原创 MySQL入门到精通-原理篇(十一 数据库的设计规范)

在关系型数据库中,关于数据表设计的基本原则、规则就称为范式。可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库,必须满足一定的范式。范式的英文名称是,简称NF。它是英国人E.F.Codd在上个世纪70年代提出关系数据库模型后总结出来的。范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。有的时候不能简单按照规范要求设计数据表,因为有的数据看似冗余,其实对业务来说十分重要。这个时候,我们就要遵循业务优先。

2026-10-08 23:40:14 57

原创 MySQL入门到精通-原理篇(八 索引的创建与设计原则)

只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。例如,如果一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。,因为不仅是聚簇索引中会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的I/O。

2026-10-08 22:51:59 135

原创 MySQL入门到精通-原理篇(四 逻辑架构)

比如:优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序,还有表达式简化、子查询转为连接、外连接转为内连接等。

2026-10-08 22:41:13 98

原创 MySQL入门到精通-原理篇(三 用户与权限管理)

对此连接上进来的每个请求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发挥作用的地方。使用REVOKE收回权限之后,用户账户的记录将从db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的账户记录使用DROP USER语句),db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据;并且像用户账户一样,角色可以拥有授予和撤销的权限。

2026-10-08 22:26:15 186

原创 MySQL入门到精通-原理篇(二 MySQL数据目录)

1)InnoDB表结构.frmmysql8.0不存在,合并到.ibd文件中表数据和索引系统表空间 ibdata1独立表空间 .ibddb.opt 数据库相关信息,比如字符集和比较规则 mysql8.0不存在2)MyISAM表结构MySQL5.7.frmMySQL8.0.sdi表数据信息 .MYD表数据索引 .MYI。

2026-10-08 22:19:40 145

原创 公用表表达式、临时表、视图

CTE (WITH) 属于 SQL 语法层面的中间结果集,生命周期仅限单条 SQL,不支持索引;会话临时表是会话级别的真实表对象,连接不断就一直存在,多条 SQL 复用,支持索引增删改;CTE 底层有可能由 MySQL 自动生成内部临时表,但用户无法干预索引。

2026-10-08 01:47:43 327

原创 MySQL 事务隔离级别实现原理

RC 保留行 (记录) 锁是为了解写写冲突防止丢失更新;去掉间隙锁,允许间隙插入,并发更好。RR 增加临键锁(记录锁 + Gap),专门用来对付范围当前读时别的事务插入新行造成的幻读。RR 幻读分快照读和当前读两套结果,是 MVCC 和锁两套机制分别生效带来的现象。拓展:SERIALIZABLE 隔离级别,全部读变成当前读加锁,所以不管快照读、当前读幻读全部消除。

2026-10-08 01:35:18 346

原创 Java虚拟线程(六)

❌禁止池化虚拟线程;并发限流改用 Semaphore;❌synchronized 块内部不要放 IO;IO 锁改用 ReentrantLock;❌不要依赖 InheritableThreadLocal 自动继承上下文 (traceId);手动传参或者 APM 新版增强 Executor;❌ThreadLocal 用完尽量 remove,防止海量虚拟线程堆大对象内存泄漏;❌CPU 密集任务不要交给虚拟线程;保留固定平台线程池;⚠️jstack 慎用,优先 JFR 观测;

2026-10-02 12:39:46 329

原创 Java虚拟线程(五)

虚拟线程本身只是线程,不分同步异步。它最大特点是支持同步阻塞编程模型,当发生 IO 阻塞时 JVM 自动释放底层载体线程,提升并发能力。如果在当前虚拟线程直接调用方法,属于同步执行;如果通过submit提交给虚拟线程执行器新建虚拟线程跑任务,属于异步提交;但不管哪种方式,任务内部 DB/RPC 调用依然是同步阻塞代码,和 WebFlux 的非阻塞事件异步模型完全不同。

2026-10-01 22:37:10 271

原创 Java虚拟线程(四)

直接写,天然跑在 Web 虚拟线程,无需额外代码并行提交方法异步解耦(@Async):全局替换 TaskExecutor 为虚拟线程执行器后台独立任务:注入手动 submit只把 Tomcat 的 HTTP 处理线程改成虚拟线程,不会自动改造业务异步任务。Controller 同步业务天然跑在虚拟线程;并行 IO 可以在接口内创建虚拟线程执行器;@Async 需要手动替换 TaskExecutor;新开虚拟线程要手动传递 MDC,并且使用 Semaphore 限制下游并发。

2026-10-01 22:21:30 265

原创 Java虚拟线程(三)

✅互不争抢载体资源SpringBoot3.2 开启时,Tomcat 的载体线程是 Tomcat 自己维护的平台线程池,不是 JDK 的 commonPool。你代码里另外写的又是独立的平台线程集合。三者是完全独立的 OS 线程集合,资源隔离,不存在互相抢。例:Tomcat 载体 max=200;业务有个固定线程池核心 = 10。这 200 个 + 10 个,是操作系统上不同的平台线程,互不抢占。✅ 平台线程池是独立线程,不会抢载体池❌。

2026-10-01 01:22:36 156

原创 Java虚拟线程(二)

*** 信号量最大许可数*//*** 资源名称,用于监控日志,区分不同下游*//*** 获取许可超时时间,单位毫秒;0=无限等待*/虚拟线程虽然线程创建廉价,但无法保护下游依赖,所以通过 AOP + 自定义注解封装 Semaphore,做应用层并发控制;Semaphore 阻塞可以卸载载体线程,对虚拟线程友好;按下游资源隔离并发配额,增加超时和监控,实现双层防护(应用层信号量 + DB 连接池)。

2026-10-01 00:41:11 237

原创 Java虚拟线程(一)

SpringBoot3.2 + 可以一行配置开启虚拟线程,让 Tomcat 使用虚拟线程处理 HTTP 请求;虚拟线程不是线程池,任务随用随建;优势是 IO 阻塞时释放底层载体平台线程,大幅提升 IO 场景并发能力;但必须搭配信号量做下游限流,避免压垮数据库和 RPC,同时尽量避免内长时间阻塞。

2026-10-01 00:39:15 309

原创 SpringGateway、Servlet‑Tomcat、SpringSecurity(四)

原生 Servlet Filter:Tomcat 创建实例,无法直接注入 Spring Bean;顺序靠 web.xml/FilterRegistrationBean 设置Security FilterChainProxy:本身实现 Servlet Filter 接口,但是由 Spring 托管;内部可以编排一整条过滤器链,还支持匹配不同 url 使用不同安全链;

2026-09-30 22:48:30 210

原创 SpringGateway、Servlet‑Tomcat、SpringSecurity(三)

Gateway 网关层鉴权、token 校验 → 优先自定义想在路由匹配之前就拦截(跨域 CORS) → 使用WebFilter❌不要写 HandlerInterceptor,❌不要使用 javax.servlet.Filter,网关环境无效!Gateway 的是 WebFlux 封装对象;没有 HttpServletRequest。

2026-09-30 22:41:59 148

原创 SpringGateway、Servlet‑Tomcat、SpringSecurity(二)

属于Servlet 规范原生组件,不是 Spring 的。在 Servlet 执行之前拦截请求,Servlet 结束之后拦截响应位置:最外层,Tomcat 容器层面。可以拦截所有进入 web 应用的请求,静态资源、jsp、servlet 全部拦得到。特点:拿到的是原生 ServletRequest,还没有到 Spring 的封装;不能直接拿到 Spring 的 @Controller 入参。Filter:Servlet 容器层面,更早,Servlet 之前;不属于 Spring。

2026-09-30 22:35:18 245

原创 SpringGateway、Servlet‑Tomcat、SpringSecurity(一)

组件所属体系适用 Gateway?说明❌不可用Servlet 拦截器,WebFlux 没有这套东西Servlet❌不可用Servlet 过滤器,Gateway 非 servlet 环境无效WebFilter✅可用WebFlux 原生 web 过滤器,网关外层✅全局网关内部全局过滤器,路由匹配后执行✅路由局部绑定单个路由的过滤器,可以配置文件写。

2026-09-30 22:03:07 164

原创 Shell 编程

Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容。Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条。这种从键盘一输入命令,就可以立即得到回应的对话方式,称为交互的方式。

2026-09-27 00:09:16 173

原创 MySQL入门到精通-基础篇(十七 MySQL8新特性)

MySQL从5.7版本直接跳跃发布了8.0版本,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。

2026-09-17 00:32:08 133

原创 MySQL入门到精通-基础篇(十六 触发器)

MySQL从5.0.2版本开始支持触发器。MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序。触发器是由事件来触发某个操作,这些事件包括INSERTUPDATEDELETE事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

2026-09-17 00:19:49 175

原创 MySQL入门到精通-基础篇(十五 存储过程与函数——变量、流程控制与游标)

定义条件是事先定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式,并且保证存储过程或函数在遇到警告或错误时能继续执行。这样可以增强存储程序处理问题的能力,避免程序异常停止运行。说明:定义条件和处理程序在存储过程、存储函数中都是支持的。定义条件就是给MySQL中的错误码命名,这有助于存储的程序代码更清晰。它将一个错误名字和指定的错误条件关联起来。这个名字可以随后被用在定义处理程序的语句中。DECLARE 错误名称 CONDITION FOR 错误码(或错误条件)和。

2026-09-14 23:14:02 195

原创 MySQL入门到精通-基础篇(十四 存储过程与函数)

含义:存储过程的英文是。它的思想很简单,就是一组经过预先编译的 SQL 语句的封装。执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。好处1、简化操作,提高了sql语句的重用性,减少了开发程序员的压力2、减少操作过程中的失误,提高效率3、减少网络传输量(客户端不需要把所有的 SQL 语句通过网络发给服务器)

2026-09-14 00:55:37 141

原创 MySQL入门到精通-基础篇(十三 视图)

视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的价格,则不会提供给他。再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段。刚才讲的只是视图的一个使用场景,实际上视图还有很多作用。最后,我们总结视图的优点。1. 操作简单。

2026-09-12 00:33:22 215

原创 MySQL入门到精通-基础篇(十二 约束)

约束是表级的强制规定。可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。

2026-09-10 23:56:24 216

原创 Undo Log、Redo Log、Binlog

redo log、undo log:InnoDB 存储引擎层(引擎层),属于 InnoDB 自己实现,MyISAM 没有。binlog:MySQL Server 服务层(server 层),和存储引擎无关,不管 InnoDB/MyISAM 都会生成。

2026-09-10 00:08:48 132

原创 NULL / NOT NULL 和 默认值

优先 NOT NULL,搭配合理 DEFAULT;字符串默认 '',数字默认 0。只有业务上 “缺失” 是独立语义,才允许 NULL,并且显式写。NOT NULL 的字段禁止省略 DEFAULT,否则插入容易报错。TEXT/BLOB 不支持 DEFAULT,由应用层处理空值。时间字段优先 DATETIME,显式写,拒绝隐式时间行为。程序层面:NOT NULL 字段,数据库不会返回 null,减少 NPE;允许 NULL 的字段,Java 代码必须判空。推荐显式写。

2026-09-08 23:18:03 349

Claude Code的使用

Claude Code的使用

2026-07-28

Java8 新特性.rar

Java8新特性,包含代码实例与技术文档。

2020-03-29

空空如也

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

TA关注的人

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