- 博客(66)
- 收藏
- 关注
原创 从接口400ms到20ms,记录一次JVM、MySQL、Redis的混合双打
:Redis内存报警,某个2MB的缓存Key导致慢查询。:热点商品缓存失效瞬间,5万QPS直接打穿DB。:1000条数据插入从12s → 。接到报警短信,核心接口响应时间突破。:单次查询从1200ms → 。,DB CPU飙到100%。
2025-04-10 17:40:28
380
原创 《从 MyBatis-Plus 到 Elasticsearch:一个后端的性能优化踩坑实录》
最近接手了一个老项目,单表查询用 MyBatis-Plus 写得飞起,但一到多表关联+模糊搜索就卡成 PPT。痛定思痛,决定引入 Elasticsearch 优化查询性能,结果踩坑无数……记录下这次从 ORM 到搜索引擎的升级历程,分享给同样被慢查询折磨的你。MyBatis-Plus 的 在单表操作中确实优雅:但遇到跨表 JOIN + 高并发模糊查询时,MySQL 直接裂开:结论:MP 适合 OLTP 简单场景,OLAP 复杂查询得换方案。面对海量数据搜索,纠结了两
2025-04-09 23:34:22
412
原创 Linux开发过程中常用命令整理
查看端口占用(图中显示的LISTENING并不表示 端口被占用,不要和LISTEN混淆哦,查看具体端口时候,必须要看到tcp,端口号,LISTEN那一行, 才表示端口被占用了)情况。语法:systemctl start | stop | restart | disable | enable | status 服务名。docker ps -a查看所有(包括已经停止的)先cd 到logs目录(里面有xx.out文件)杀死进程 -- kill -9 pid。如何查看最近1000行日志。
2025-04-08 23:18:47
227
原创 动态数据源切换--DruidDataSourceBuilder.create().build()方法
是 Alibaba Druid 数据库连接池提供的便捷方法,用于通过配置文件快速构建数据源实例。其核心作用是根据配置属性自动创建并初始化对象。
2025-04-07 10:33:50
476
原创 @transaction和mybatis执行流程串联--在开启了事务的方法中切换数据源无效原理解析
所以,在有Spring事务的情况下,连接的获取实际发生在Spring事务管理器中,而不是在MyBatis的执行流程里。MyBatis的Executor会从Spring的事务同步器中获取已绑定的连接,而不是从数据源获取新连接。准确地说,在Spring事务环境下,连接的获取是在MyBatis执行流程开始前,由Spring的事务管理器完成的。而MyBatis(主要是Executor)只是使用这个已经存在的连接。SqlSession委托给Executor执行。Executor尝试获取连接。执行SQL并处理结果。
2025-03-31 17:50:31
237
原创 Spring多数据源环境下的事务与数据源切换
正确用法: 子方法单独创建事务或父方法使用@Transactional(propagation = Propagation.REQUIRES_NEW)为所有子方法创建新事务。禁止父方法使用@Transactional创建事务,子方法使用@DataSource切换数据源。这个注意事项涉及Spring中事务管理和动态数据源切换的关键约束,让我深入解释这个问题。同一个事务下是无法切换数据源。
2025-03-31 11:40:48
320
原创 Jar包和War包的区别
在前后端分离架构中,后端仅提供API服务,不包含前端页面。此时,后端可打包为JAR,通过内嵌Tomcat独立运行,前端则单独部署(如Nginx或CDN)。这种模式简化了部署流程,适合云原生场景。若项目未分离前后端(如JSP+Servlet架构),需将前端页面和后端代码一并打包为WAR,部署到Servlet容器。此时,静态资源与后端代码耦合,不利于独立维护。后端以JAR包提供API,前端单独构建并部署到静态服务器,两者通过HTTP交互。这种架构解耦了开发流程,提升了可维护性。
2025-03-30 23:29:27
335
原创 海量数据场景题--出现频率最高的100个词
假如有一个 1G 大小的文件,文件里每一行是一个词,每个词的大小不超过 16 bytes,要求返回出现频率最高的 100 个词。内存限制是 10M。很容易就会发现一个问题,如果第二步中,如果这个 1 G 的大文件中有某个词的频率太高,可能导致小文件大小超过 10 M,这种情况该怎么处理呢?在此疑问上,我们提出了第二种解法。出现频率最高的100个词。
2025-03-26 22:23:15
754
原创 海量数据场景题--查找两个大文件的URL
例如,URL "http://example.com"在文件A中分配到a42,则在文件B中也必分配到b42。给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,找出 a、b 两个文件共同的 URL。哈希冲突仅影响不同URL被分到同一文件,但匹配时通过精确比对HashSet中的原始URL可避免误判。仅需比较同一编号的ai与bi,无需跨文件比较(如a3只与b3对比)直接排序需将320GB文件全部排序,归并时仍需多次I/O,总耗时比分治法更高。查找两个大文件共同的URL。
2025-03-26 22:22:33
223
原创 EasyExcel实现数据导入导出
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。编写监听类,实现ReadListener<T>,在invoke方法中读取excel每一行的数据。通过EasyExcel.write方法向excel写入数据。通过EasyExcel.read 方法读取excel。针对excel中的数据设计模型类。针对要写入的数据编写模型类。准备好要写入的数据。
2025-03-25 16:22:32
831
原创 SQL调优
另一种分表方式是根据id的范围进行分表(分片),它会划出一定的范围,比如以2kw为一个分表的大小,那02kw就放在这张分表中,2kw4kw放在另一张分表中,数据不断增加,分表也可以不断增加,非常适合动态扩容,但它要求id自增,如果id递增,数据则会出现大量空洞。同样由于最前面是时间,随着时间流逝,也能保证id趋势递增。可以看出,只要处于同一毫秒内,所有的雪花算法id的前42位的值都是一样的,因此在这一毫秒内,能产生的id数量就是 2的10次方✖️2的12次方,大概400w,肯定是够用了,甚至有点多了。
2025-03-25 16:21:22
939
原创 注册中心之Nacos相较Eureka的提升分析
Nacos通过主动推送 + 定时拉取的组合模式,既解决了传统拉取模式的延迟问题,又通过兜底机制保证了可靠性。这种设计使得服务列表更新更及时,尤其适合对故障恢复要求高的场景。
2025-03-24 21:33:59
539
原创 同步双写与删缓存在缓存一致性的实践对比
通过 Canal 或 Debezium 监听 MySQL 变更日志,异步更新或删除缓存,实现最终一致性。在删缓存和更新数据库时加锁,确保同一时刻仅一个线程操作数据。在单线程或无并发冲突的场景下,同步双写能确保缓存与数据库的。在缓存值中嵌入版本号,更新时校验版本,防止旧数据覆盖。
2025-03-23 22:36:56
626
原创 通俗详解redis底层数据结构哈希表之渐进式rehash
比如你查了个数据,Redis搬完旧表第0个位置的数据后,把rehashidx+1,下次搬第1个位置。总结:渐进式rehash就是“蚂蚁搬家”,把大任务拆成小步骤,边服务边迁移,既保证速度,又不影响用户体验。• 用一个标记rehashidx(类似搬家进度条),初始设为0,表示从旧表的第0个位置开始搬。• 删/改数据:两个柜子都要操作,比如删旧柜子的数据,新柜子有的话也得删。• 等旧表全搬空了,就把旧表扔掉,新表改名叫“旧表”,等待下次扩容。• 搬完位置3后,旧表清空,换上新表,搬家完成!
2025-03-21 15:45:33
352
原创 Redis Lua脚本实现令牌桶限流算法
根据容量和速率计算合理TTL(如容量10,速率5/秒,TTL=4秒),避免内存泄漏。指令牌长时间没人拿然后一直占用内存。
2025-03-21 10:31:22
481
原创 Redis命令详解--集合
SADD key member1 [member2...] 向集合添加一个或多个成员。SREM key member1 [member2...] 移除集合中一个或多个成员。SRANDMEMBER key [count] 随机返回指定数量元素(不删除)SISMEMBER key member 判断元素是否存在于集合中。SPOP key [count] 随机移除并返回指定数量元素。SMEMBERS key 获取集合中所有成员。SCARD key 获取集合成员数量。
2025-03-20 23:17:51
226
原创 Redis数据结构详解--列表
范围索引:LRANGE 和 LTRIM 支持负数索引(例如 LRANGE key 0 -1 表示获取全部元素)阻塞操作:BLPOP/BRPOP 常用于实现消息队列,当列表为空时线程会挂起等待新元素。使用场景:消息队列、最新动态(如朋友圈时间线)、分页查询。原子性:所有列表操作均为原子性,适用于高并发场景。
2025-03-20 23:16:47
1235
原创 SpringMVC的执行流程详解
对象(传统MVC模式),包含模型数据(Model)和视图名称(View)。对象,包含目标处理器(如Controller方法)和可能配置的拦截器(Interceptor)。(处理器适配器)调用具体的处理器(如Controller方法)。(处理器映射器),根据请求URL解析出对应的处理器(Handler)。它是整个流程的调度中心,负责请求的统一分发和响应。返回JSON数据,此时跳过视图解析步骤,由。处理,最终直接响应给前端,无需视图渲染。进行修改(仅对传统MVC有效)。,则流程终止并直接返回响应。
2025-03-17 14:50:34
264
原创 三级缓存无法解决的@Async的循环依赖异常以及@Lazy解决方案
在 Spring 中,@Async注解用于将方法标记为异步执行,其底层依赖实现。当 Bean 之间存在循环依赖且使用了@Async时,会因而抛出异常。Spring 通过对于大多数代理(如),Spring 会在生成代理对象,并提前暴露到三级缓存中,确保依赖链中的其他 Bean 注入的是代理对象。此时,A 和 B 依赖的都是代理对象,版本一致,循环依赖正常解决。@Async@Async的代理对象生成时机@Async@Async@Async@Lazy@Lazy通过和@Lazy。
2025-03-17 13:35:10
1532
原创 Dijkstra算法允许重复入队和BFS不允许重复入队的分析
Dijkstra算法允许重复入队的原因在于其需要处理带权图中的过程。具体来说,允许同一节点多次进入优先队列是为了确保后续发现的更短路径能够及时更新其邻接节点的最短距离。
2025-03-14 16:30:30
328
原创 @Async注解在SpringBoot项目中的使用
需通过代理对象调用(如注入自身 Bean 或使用。异步方法抛出的异常需通过。Spring 默认使用。(每次新建线程),但。
2025-03-10 11:34:19
278
原创 出现FullGC的排查思路
定位原因:首先通过GC日志和监控工具(如jstat、jmap)确认Full GC触发场景(如老年代不足、显式调用等)。代码审查:排查显式GC调用、大对象创建、静态集合未清理等代码问题。内存分析:生成堆快照,使用MAT或JProfiler分析大对象及内存泄漏。参数调整:根据场景调整堆大小、元空间限制或GC算法(如G1)。业务优化:从设计层面避免内存瓶颈,如分库分表、缓存分离。关键点:Full GC多数由代码问题引起,需优先排查业务逻辑,而非盲目调整JVM参数。
2025-03-06 23:25:40
807
原创 [场景题]如何实现购物车
此外,需处理用户登录前后的购物车合并,以及商品信息变更时的同步问题。用户登录后,将未登录时的临时购物车(如Cookie或LocalStorage)与数据库购物车合并。用户登录后,将临时购物车(如Cookie中的商品列表)与Redis中的购物车合并。:将购物车数据存储在用户会话(Session)中,适用于无需持久化的临时购物车。:用户登录后,将临时购物车(Session)与用户数据库中的购物车合并。:将购物车数据持久化到数据库,适用于用户登录后长期保存购物车。:将购物车数据缓存到Redis,减少数据库查询。
2025-03-05 23:17:52
2006
原创 [场景题]如何实现排行榜
通过结合具体业务需求(如实时性、数据规模、持久化要求),选择最合适的实现方案,并展示对技术选型的深入理解。:Redis默认按字典序排序,若需按时间排序,可将时间戳作为分数的小数部分(如。:通过数据库查询排序,结合Java代码处理排名逻辑。遍历查询结果,动态计算排名(处理并列情况)。数据结构,天然支持按分数排序和排名查询。存储数据,通过排序算法维护排行榜。获取指定区间的用户及分数。(降序排名,从0开始)。
2025-03-05 23:16:13
580
原创 Synchronized解析
通过对象锁实现互斥,每个Java对象都可以关联一个Monitor(监视器),其底层由JVM用C++实现。线程可重复获取同一把锁,避免死锁。例如,递归调用同步方法不会阻塞。线程执行完同步代码或抛出异常时,JVM自动释放锁,无需手动干预。代码块时,会尝试获取与锁对象关联的Monitor所有权。),进入方法前需获取实例锁。对象),作用于所有实例。
2025-03-04 23:48:52
277
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人