- 博客(601)
- 收藏
- 关注
原创 Async 默认线程池真坑!
Async由 Spring 框架提供,被该注解标注的类或方法会由异步线程执行。因此,在项目中,需要异步执行的地方通过@Async指定非常方便,但正是因为这种便利性,让开发人员对底层流程没有任何感知。如果不了解底层原理,直接使用@Async,那就可能会导致在未来的某一时刻出现服务不可用的情况。因为@Async默认使用 Spring 的线程池会为每一个异步任务创建一个线程执行,有 1w 个任务就会创建 1w 个线程,不会对线程进行复用,开销巨大。
2024-12-26 17:30:00
1111
原创 爆肝万字,AQS 源码分析!
最近一周在写 AQS 源码分析,AQS 属于并发的核心内容,很多同步器都基于 AQS 实现。可能很多同学并不太了解 AQS 学习到什么程度好,以及 AQS 中的 Node 节点状态是在是太复杂,看的眼花缭乱!通过这一周看 AQS 源码的经验,我觉得学习 AQS 只要把它内部的执行流程捋顺就可以了。AQS 主要是管理线程的入队、出队,以及队列中线程等待获取资源这一过程,所以自己在学习的过程中也有必要画画图,来看一下在入队、出队的时候,节点的状态是如何变化。通过画图,可以很好地理清思路。
2024-12-23 15:28:26
981
原创 多线程案例落地 - 库存扣减请求合并、库存一致性保证
文章内容已经收录在《高级技术专家成长笔记》,欢迎订阅专栏!从原理、系统设计出发,直击面试难点,实现更高维度的降维打击!海哥也给出了合并库存扣减请求的 Demo,是一个多线程的 Demo,对提升并发掌握很有帮助,这里也整理一篇文章进行分析!参考 B 站 up 主《极海Channel》,视频链接:https://www.bilibili.com/video/BV1Hv4y1P7ta对于库存扣减流程中的优化,最主要的优化就是库存扣减请求的合并,海哥也给出了 Demo,这里将整体设计、演进思路整理出来库存扣减请求
2024-11-28 16:03:26
1163
原创 高级专家性能调优手段,库存扣减场景,20 倍性能提升!
整体介绍了库存扣减优化思路,其中最核心的优化就是对库存请求进行合并,将性能瓶颈由数据库转移到合并算法的设计中,性能具体可以提升多少,取决于合并算法可以减少多少的数据库 IO 开销除了核心的请求合并优化,也进行了事务内部的 SQL 顺序调整,减少行锁持有时间并且将缓存更新由同步更新,改为异步更新,减少扣减库存接口的同步等待时间, 并且降低了 Redis 中库存数据的刷新频率。
2024-11-25 11:14:13
782
原创 超高流量多级缓存架构设计!
多级缓存架构在互联网电商场景中经常使用,因为读、写请求量级较大,RT 要求较低,这里讨论的多级缓存架构仅以读请求性能提升为目的为什么多级缓存架构可以提升读性能?缓存的本质就是数据冗余,通过将数据一层一层冗余,放在离用户更近、容量更小、价格更贵、速度更快的存储系统上,以此来提升系统的访问性能。
2024-11-21 12:49:49
2921
原创 电商服务-订单服务设计(万字长文分析)
对于分布式 ID 的生成方案,美团基础研发平台推出了 Leaf 作为分布式 ID 生成服务,已经广泛应用于美团金融、美团外卖、美团酒旅等多个部门,因此直接学习美团的开源解决方案即可Leaf-segment:基于 MySQL 生成唯一 IDLeaf-snowflake:基于雪花算法优化更加常用的方案是方案一和方案三通过方案一可以满足从用户维度的订单查询通过方案三可以实现更多维度的查询操作。
2024-11-20 14:56:03
1178
原创 Java线程池的核心内容详解
在线程池中可以自己去定义拒绝策略,如果线程池无法处理更多的任务了,可以在自定义的拒绝策略中,将拒绝的任务异步持久化到磁盘中去,之后再通过一个后台线程去定时扫描这些被拒绝的任务,慢慢执行保证严格的任务不丢失:如果线上机器突然宕机,线程池的阻塞队列中的请求怎么办?如果宕机,重启之后,线程池阻塞队列中的任务就会全部丢失如果想要解决这种情况的话,有这么一个解决方案。
2024-11-04 13:47:52
1230
原创 面试官:Elasticsearch 为什么能实现灵活的查询?
ES 中灵活的查询主要依赖于分词和倒排索引,通过这两个核心技术,实现了根据关键词搜索对应文档,并且可以对搜索结果的相关性进行排序除此之外,ES 还提供了高级查询 Query DSL(Domain Specified Language,领域专用语言),DSL 允许用户构建更加复杂的查询条件。
2024-10-31 14:12:27
405
原创 美团面试:Elasticsearch 深分页问题如何解决?
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,从原理出发,直击面试难点,实现更高维度的降维打击!
2024-10-30 13:11:16
1040
原创 JDK 下的高性能计数器 LongAdder 实现原理
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,从原理出发,直击面试难点,实现更高维度的降维打击!
2024-10-30 13:09:39
854
原创 写时复制(CopyOnWrite)落地实现
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,从原理出发,直击面试难点,实现更高维度的降维打击!
2024-10-21 13:37:29
1143
原创 指令重排导致的单例在并发场景下出现问题!
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,包含底层原理解析,带你冲破面试迷雾。
2024-10-21 13:36:14
1204
原创 【MySQL核心面试题】MySQL 核心 - Explain 执行计划详解!
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取该文章内容已经收录在,包含底层原理解析,带你冲破面试迷雾。
2024-10-20 21:06:05
789
原创 高性能无锁内存队列-Disruptor
缓存行的概念为了提升 CPU 速度,CPU 会有一个高速缓存(Cache),该缓存由很多个 cache line 组成,每个 cache line 通常是 64B,并且可以有效地引用主内存中的一块地址。Java 中 long 类型变量是 8B,因此一个 cache line 可以存储 8 个 long 类型变量CPU 每次从主存中拉取数据时,会把相邻的数据也存入同一个 cache line,那么在访问一个 long 数组时,如果数组中的一个值被加入缓存中,那么也会加载另外 7 个伪共享问题。
2024-10-20 15:36:39
936
原创 【MySQL核心面试题】面试官:不可重复读和幻读了解吗?MySQL如何解决对应问题?
在互联网公司面试中,MySQL 相关问题的出现频率相当之高,作为后端研发人员,几乎人人都要掌握 MySQL 底层原理,否则在面试第一关八股文就会被拦住,对应的内容也收录在了中,可以关注文章底部扫码关注公众号(11来了),即可领取。
2024-10-19 15:56:07
1060
原创 面试:了解 ThreadLocal 内存泄漏需要满足的 2 个条件吗?
ThreadLocal 用于存储线程本地的变量,如果创建了一个 ThreadLocal 变量,在多线程环境下访问这个变量的时候,每个线程都会在自己线程的本地内存中创建一份变量的副本,从而起到线程隔离的作用当 ThreadLocal 被定义为方法中的局部变量,那么当线程进入该方法的时候,就会将 ThreadLocal 的引用给加载到线程的栈中。
2024-10-19 15:53:17
1115
原创 【MySQL核心面试题】索引结构
在 Java 语言的 HashMap 中,当链表中的节点过多时,就会将链表转为红黑树来提升查询性能,HashMap 会经常的增加、删除节点,而红黑树的插入、删除效率较高。
2024-10-18 14:47:01
767
原创 【MySQL核心面试题】InnoDB 的自适应哈希索引
自适应哈希索引使得 InnoDB 在恰当的工作负载以及充足的 Buffer Pool 内存系统中,可以表现得更加像一个内存数据库,并且无需牺牲事务特性以及可靠性基于观察到的搜索模式,哈希索引是使用索引 key 的前缀来构建的,前缀可以是任意长度,并且可能只有 B 树中的某些值才出现在哈希索引中,哈希索引是根据需要为需要经常访问的索引页构建的。
2024-10-18 14:42:40
939
原创 【MySQL核心面试题】MyISAM 和 InnoDB 存储引擎的区别
MyISAM 存储引擎由于不支持事务,并且只有表锁没有行锁,导致了它如果执行发生错误容易丢失数据,并且锁的粒度太大了,导致无法承载高并发的写操作但是 MyISAM 可以支持很好的查询性能,因为它的索引和数据是分开存放的,因此可以缓存更多的索引,查询性能较好,在大量查询操作的场景中,MyISAM 可以有很好的性能表现InnoDB相对于 MyISAM 来说,更适合写操作比较多。
2024-10-18 14:41:58
718
原创 【MySQL核心面试题】为什么 mysql 删了行记录,反而磁盘空间没有减少?
欢迎关注公众号(文章末尾即可扫码关注) ,持续在我后台回复 「资料」 可领取在我后台回复「面试」可领取。
2024-10-18 14:41:33
424
原创 线程池扩展 - 快速定位异常任务的提交位置
线程池执行任务出现异常,会遗漏异常任务在哪里提交的日志打印,因此可以对线程池做扩展,在提交线程任务的时候,自己创建一个异常,保存调用的堆栈信息,如果任务执行失败,就将调用的堆栈信息也同时打印出来即可。
2024-10-18 12:20:33
464
原创 隐蔽的并发错误
对 cnt 加锁,看似逻辑上没有问题,但最终却出现了并发问题,是因为 JDK 将 java 代码编译为字节码指令,编译后的字节码指令与我们的预期不符,导致出现并发问题,虽然工作中也不会碰到,但是可以借此进一步了解 JVM 中的字节码指令字节码为了计算方便,为通过栈进行操作数的计算,在第 15 行通过 getstatic 获取 cnt 的 int 值压入栈中,在 25 行将常数 1 压入栈中,在 26 行将栈顶两个整数相加,执行完成cnt ++
2024-10-17 15:40:38
645
原创 多级缓存架构设计
应用 Nginx 本地内存Redis 缓存JVM 内存DB接入层 Nginx:处理入口流量,用作流量分发应用层 Nginx:接近业务层,处理业务逻辑,用作热点缓存的读取Nginx 作为高性能的 Web 服务器,经常被作为反向代理服务器用作负载均衡,这里多增加了一层应用层 Nginx,用来处理热点缓存数据,相比于 Tomcat 集群的本地内存来说,可承接的流量更高。
2024-10-14 15:20:50
1015
原创 用户“关注”系统设计方案
方案的设计是从无到有的过程,如果直接给出优化后的方案,缺少中间的思考过程是得不偿失的,因为在工作中碰到相同场景的几率是很小的,所以学习具体场景的解决方案对研发人员来说是性价比很低的,要学习其中对每一步方案的优缺点分析,以及如何优化!先介绍单表实现方案,通过 DB 表来完成用户关注关系的查询,使用 表来存储,如下:直接将用户的关联关系插入到表 表中单表方案存在问题: 将所有用户的关联关系都存储在单表中,会导致单表数据量大,存在性能问题单表数据量太大,因此分库分表进行存储,那么要考虑分片键的设定,有两种选择
2024-10-11 20:30:05
799
原创 缓存数据一致性保证通用方案
综上,介绍了 3 种保证缓存一致性的解决方案,在真正使用场景中,需要从业务场景对数据不一致时间、实现成本、维护成本等多个方面进行评估,选择适合的方案不过既然使用缓存,肯定就没办法保证绝对的一致性比如在 Linux 内核中,使用了 PageCache(在内存中) 来优化 IO 性能,所有的 IO 操作,数据并不是直接写入到磁盘中,而是先放入到了 PageCache 中,再统一时间将 PageCache 的数据刷入到磁盘中,以此来提升磁盘 IO 的效率。
2024-10-10 11:13:35
996
原创 面试官:MySQL 什么时候会出现死锁问题?为什么不推荐使用RR隔离级别?
欢迎关注公众号,持续在我后台回复 「资料」 可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!
2024-10-06 14:53:17
1517
原创 【MySQL面试高频误区】不可重复读和幻读到底有哪些区别?
欢迎关注公众号,持续在我后台回复 「资料」 可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!
2024-10-04 14:36:32
831
原创 【MyBatis 源码拆解系列】MyBatis 插件底层设计原理
Executor:MyBatis 核心接口之一,定义了数据库的基本操作,最终数据库的操作都是交给 Executor 来完成的ParameterHandler:为 SQL 语句的占位符绑定实参数据ResultSetHandler:将从数据库中查询到的结果集进行处理StatementHandler:MyBatis 核心接口之一,在 Executor 内部会通过 StatementHandler 去完成 SQL 的执行。
2024-10-02 14:14:03
1235
原创 【MyBatis 源码拆解系列】JVM 级别缓存能力设计:MyBatis 的一、二级缓存如何设计?
最后在总结一下,MyBatis 设计了一级缓存、二级缓存,虽然二级缓存我们并不使用,但是可以了解他的一个设计原理,这里总结一下重点内容:二级缓存:二级缓存是跨 SqlSession 级别的,因此是在 MappedStatement 中存储,MappedStatement 是解析 xml 文件时构建的,因此生命周期和 MyBatis 是一直的,因此可以跨 SqlSession二级缓存的能力支持是通过来完成的,用到了装饰器模式,BaseExecutor 提供一些公有的一级缓存能力。
2024-10-02 14:12:58
1231
原创 【MyBatis 源码拆解系列】执行 Mapper 接口的方法时,MyBatis 怎么知道执行的哪个 SQL?
最后再总结一下,学完本节可以收获什么?MyBatis 内部是如何对 SQL 语句的信息进行解析和存储?MyBatis 针对这个功能设计了哪些类?每个类的职责如何划分?MyBatis 是一个 ORM 框架,作为后端应用和数据库之间的桥梁,目的是帮助研发人员管理和执行 SQL 语句,将 SQL 语句定义在 xml 文件之后,MyBatis 肯定需要存储起来,并且在执行 UserMapper 接口对应的方法时,可以找到对应的 SQL 语句以及对应的一些信息,包括参数类型、返回值类型等等。
2024-09-27 13:11:36
1237
原创 【MyBatis 源码拆解系列】MyBatis 运行原理 - 数据库操作最终由哪些类负责?
MyBatis 内部源码有个特点,每个方法都很短,在查看源码的时候会在不同的类之间不断跳转,为什么呢?
2024-09-27 13:09:54
791
原创 【MyBatis 源码拆解系列】MyBatis 运行原理 - MyBatis 中的代理模式
欢迎关注公众号,持续在我后台回复 「资料」 可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!
2024-09-25 10:03:42
728
基于电商的高并发Redis专栏讲解
2024-01-26
Java春招面试突击pdf学习文档
2024-01-24
计算机专业考研(408)思维导图
2023-12-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人