- 博客(986)
- 收藏
- 关注
原创 子查询对多层join优化记录
查询时间从300ms级优化到10ms内IO消耗降低98%支持每秒5000+次的高并发查询天然防SQL注入(使用参数化查询时)
2025-05-16 18:22:07
732
原创 java算法的核心思想及考察的解题思路
典型应用:霍夫曼编码、Dijkstra算法、最小生成树。将问题分解为重叠子问题,存储子问题的解避免重复计算。典型应用:背包问题、最长公共子序列、斐波那契数列。将大问题分解为小问题,递归解决小问题后合并结果。典型应用:链表环检测、滑动窗口、有序数组求和。典型应用:归并排序、快速排序、二分查找。:设计典型、边界和随机测试用例验证代码。典型应用:八皇后问题、数独、排列组合。:状态定义、状态转移方程、边界条件。:双指针、滑动窗口、哈希表记录。:考虑空输入、极端值等特殊情况。:虚拟头节点、快慢指针、递归。
2025-05-07 22:40:23
774
原创 项目中数据结构为什么用数组,不用List
1,从内存和性能角度,数组占用更小的内存(),访问性能更高()分配效率:数组在内存中是连续分配的一块固定空间访问速度:直接操作内存,数组的读写操作是直接通过索引计算偏移量(O(1)时间复杂度),无额外开销2,List好处,更符合开发习惯,方法丰富。
2025-04-24 11:07:35
1043
原创 redis close+连接参数设置+并发情况风险分析
如果并发很高,每次查询都需要获取连接查询,并发几万的情况下,需要设置很大吗,如果设置比如200,每次查询完成后,可以及时释放连接吗。
2025-04-23 12:09:42
208
原创 记录一次会议警示内容
5,不要觉得理所当然,事情小,不要把脑袋陷入一个局限区域的困境。要以第一次做的情况,去思考,去检查。3,对自身掌握能力和承担风险能力要有自知之明,不做能力之外,和无法掌控,后果无法承担后果事情。1,每一行代码都去检查,不检查就极大可能出现问题。4,不仅要做好,还要持续做好。2,细心,不能出错,就一次机会。买股票投入过大,可能一次输光。一次事故,导致前期的努力白费。
2025-04-18 09:21:50
115
原创 mybatis 单值或多值传参存在风险举例分析
WHERE budget_year = 2023 AND budget_year IN (2024) -- 永远无结果。-- 改为不同名 -->-- 如果是集合则用!子句随着数组变大可能影响性能(建议超过 1000 值时改用临时表)-- 添加 javaType 确保类型安全 -->内部使用时可能产生歧义(取决于 MyBatis 版本)可能是 Collection 而非数组,需要改用。-- 单值优先 -->-- 多值备选 -->
2025-04-17 17:42:11
569
原创 @Async 默认线程池为什么 在高并发场景下会导致耗尽系统资源
如果线程数超过 CPU 核心数(如 8 核 CPU 跑 1000 个线程),CPU 会花费大量时间在线程调度上,而不是真正执行任务,导致。线程的创建、销毁和上下文切换(Context Switching)会占用大量 CPU 资源。每个线程可能打开 Socket、文件等资源,占用文件描述符(FD)。✅ 根据业务特点(CPU 密集型 / IO 密集型)调整线程池参数。(CPU、内存、线程数限制等)。(CPU 100%、内存 OOM、线程数超限),因此。(减少创建/销毁开销,提高性能)。
2025-04-14 14:01:03
646
原创 @Async 为什么要自定义线程池,使用默认线程池风险
资源控制可以设置核心线程数、最大线程数,防止资源耗尽可以设置合理的队列容量隔离性可以为不同业务配置不同的线程池,实现隔离避免一个业务影响其他业务的异步处理可配置性可以设置线程名前缀,便于监控和问题排查可以配置拒绝策略,处理任务满的情况性能优化根据业务特点(CPU密集型/IO密集型)优化线程池参数可以设置合理的线程存活时间。
2025-04-14 13:50:42
304
原创 延时双删除实现方案
log.warn("缓存删除失败,尝试重试({}/{}), key: {}", attempts, maxAttempts, key);log.error("延时双删失败,将记录日志人工处理", e);log.info("延时双删成功,key: {}", key);log.error("缓存删除最终失败", e);log.info("执行延时双删,key: {}", key);log.error("延时任务提交失败,直接同步删除", e);log.error("延时双删异常", e);
2025-04-02 13:48:14
514
转载 redis缓存为什么要延时双删
另外,该方式(第5种,相对第2种,只后删缓存的,可以大大的减少获取到旧缓存的数量)哈希锁因为引入的分段锁来保证锁创建和销毁的同步,这个锁的思想是借助java的弱引用来创建锁,把锁的销毁交给jvm的垃圾回收,来避免额外的消耗。问题2:为了避免缓存清除失败带来的风险,起到在每次操作数据库之前,都还原到没有产生缓存之前的效果。在三中,第二次清空缓存之前,多延时一会儿,等B更新缓存结束了,再删除缓存,这样就缓存就不存在了,其他事务查询到的为新缓存。问题:先删缓存,在改库前,其他事务又把旧数据放到缓存里去了。
2025-04-02 13:35:50
97
原创 redolog与binlog区别
**强制刷盘策略** | 依赖`sync_binlog`参数配置 | 默认每次事务提交刷盘(innodb_flush_log_at_trx_commit=1) |- **binlog**:由 **MySQL Server 层**实现,与存储引擎无关(如InnoDB、MyISAM均支持)。2. **Commit阶段**:写入`binlog`后,提交`redo log`(标记为commit状态)。- **redo log**:由 **InnoDB 引擎**特有,其他存储引擎(如MyISAM)没有此日志。
2025-04-02 08:38:11
347
原创 sql优化
**组合索引策略**:遵循最左匹配原则(如索引 `(a,b,c)` 支持 `a=1`、`a=1 AND b=2`,但不支持单独 `b=2`)。- **索引覆盖**:将查询字段包含在索引中(如 `SELECT a,b FROM table`,索引设为 `(c,a,b)`)。- **常用列加索引**:对高频查询的 `WHERE`、`JOIN`、`ORDER BY` 列建立索引。- 关注 `type` 列:避免 `ALL`(全表扫描),目标至少为 `range` 或 `ref`。
2025-04-01 08:22:47
412
原创 企业微信token及相关接口关联分析
用户级权限,只能访问授权用户的数据。access_token: 企业的 access_token,通过 corpid 和 corpsecret 获取。access_token: 企业的 access_token,通过 corpid 和 corpsecret 获取。如果用户是非企业成员(如外部联系人),返回 OpenId(用户在微信中的唯一标识)。8,企业 access_token 与用户 access_token 的区别。如果用户是企业成员,返回 UserId(用户在企业微信中的唯一标识)。
2025-03-27 23:12:05
594
原创 RocketMQ怎么实现延时消息的?
修改Broker配置文件properties复制# 自定义延时级别(时间单位为毫秒)注意:需要重启Broker生效,且必须保持18个级别。
2025-03-27 14:01:10
758
转载 7个方面总结:审批工作流设计
审批流程是中后台工作流的基础应用,我们在设计的过程中,把握的核心要点是“提高效率,规范管理”,在设计过程中要时时回头审视,以免脱离了这个最重要的目标。
2025-03-21 17:04:41
290
转载 常见的工作流引擎(osworkflow、jbpm、activiti、flowable、camunda)比较
-imptt市场上比较有名的开源流程引擎有osworkflow、jbpm、activiti、flowable、camunda。其中:Jbpm4、、Flowable、camunda四个框架同宗同源,祖先都是Jbpm4,开发者只要用过其中一个框架,基本上就会用其它三个。开发低代码平台、OA系统、BPM软件均需要流程可视化功能,而流程可视化核心是流程引擎和流程设计器,对于市场上如此多的开源流程引擎,哪个功能和性能好,该如何选型呢?
2025-03-21 14:37:35
173
原创 Kafka常见问题
• Topic: 消息队列,生产者和消费者面向的都是一个Topic• Broker: 一个Kafka服务器就是一个Broker,一个集群由多个Broker组成。一个Broker可以容纳多个Topic• Producer: 消息生产者,向Kafka Broker发生消息的客户端• Consumer: 消息消费者,向Kafka Broker取消息的客户端• Consumer Group(CG): 消费者组,由多个Consumer组成。
2025-03-21 09:07:10
695
原创 Docker原理最全详解
镜像可以基于其他镜像构建,并且是层叠的,每一层都代表了对原始镜像的修改,镜像可以从 Docker Hub 、或者私有仓库中获取。当创建一个新的容器时,Docker 会在基础镜像的基础上添加一个读写层,这个读写层包含了:容器中新增的文件、和修改过的文件。Docker 仓库,是存储和分享 Docker 镜像的地方,开发者可以从仓库中获取镜像,并将自己的镜像推送到仓库中。这样,容器的文件系统实际上是由多个层组成的,每个层都代表了对原始镜像的修改,从而实现了文件系统的共享和高效利用。
2025-03-21 09:05:28
348
转载 Java百万数据导出Excel性能优化
在导出的数据量比较多的时候(分页查询有很多页),上述代码会比较慢,一是因为此代码写入时会阻塞下一页的查询,如果每次写入需要0.1秒,百万数据的导出,分页查询每页1万条,则有近10秒的时间浪费了;二是,查询性能通常数倍慢于写入速度,查询一般都经过网络,网络耗时+SQL执行耗时比较多,而写入一般是直接写入到本地磁盘中(或先写入本地临时文件,再通过IO流输出到HTTP响应中),所以上述代码有两个性能优化的点,一是读写分离,写入时不要影响到下一页的读,二是,可以改为。,减少因为写入太快而需要等待查询数据的时间;
2025-03-20 00:10:32
116
原创 零拷贝分析
零拷贝是一种高效的数据传输技术,通过减少数据拷贝次数来提升系统性能。常见的零拷贝技术包括sendfilemmap、DMA 和splice。零拷贝广泛应用于文件传输、消息队列、网络通信和数据库等场景。Kafka 和 RocketMQ 等高性能消息队列系统都使用了零拷贝技术来优化消息的读写性能。
2025-03-17 22:38:39
1103
原创 扫码登录分析
手机端扫码,判断二维码是否生效。根据token+二维码ID,获取pc端token。pc端生成二维码(请求服务),通过轮询服务端判断是否过期。pc端token存redis key=二维码ID value=token。二维码状态:未扫描,已扫描,已过期。手机端:已登陆,获取token。手机端 pc端 服务端。
2025-03-17 22:30:30
161
原创 kafka rocketmq rabbitmq 都是怎么实现顺序消费的
特性KafkaRocketMQRabbitMQ顺序性保证分区内有序,分区间无序队列内有序,队列间无序默认不保证顺序全局顺序消费单分区主题或按 Key 分区单队列主题或按 Key 选择队列单队列单消费者或消息分组并行处理能力高(多分区)高(多队列)低(单队列单消费者)实现复杂度中等中等高(需要外部排序或分组)适用场景高吞吐量、分区顺序消费高吞吐量、队列顺序消费低吞吐量、简单顺序消费Kafka和RocketMQ通过分区或队列的机制,天然支持分区或队列内的顺序消费,适合高吞吐量的场景。
2025-03-14 00:22:39
1063
原创 kafka连问
一个分区只能由一个消费者组中的一个消费者实例消费。通过消费者组和分区分配,Kafka实现了消息的并行处理和负载均衡。如果需要更高的并发处理能力,可以增加主题的分区数,并相应地增加消费者实例的数量。Kafka 默认保证分区内有序,但不保证分区间有序。如果需要实现多个分区的总体有序消费,可以通过以下方式:使用单分区主题(简单但性能受限)。按 Key 分区(推荐,平衡顺序性和性能)。消费者端排序(复杂,适合特定场景)。外部全局序列号(需要额外资源)。使用事务或幂等生产者(适合高可靠性场景)。
2025-03-14 00:09:59
1152
3
原创 ELK traceId 通过A服务调用B服务举例
通过上述实现,我们完成了 A 服务调用 B 服务时的traceId传递和日志跟踪。traceId通过 HTTP 头在服务间传递,并通过MDC在日志中输出,确保整个请求链路的日志能够被追踪。
2025-03-12 23:54:37
912
原创 ELK traceId实现跨服务日志追踪
通过上述步骤,我们实现了一个简单的traceId日志跟踪系统。在请求进入时生成traceId并将其放入MDC,在请求完成后清理MDC。日志配置确保traceId能够被输出到日志中,从而方便我们在ELK中追踪请求的完整链路。
2025-03-12 23:53:31
805
原创 URLEncoder.encode
是 Java 中用于对字符串进行 URL 编码的标准方法。它主要用于编码查询参数或路径片段,以确保 URL 的正确性和安全性。使用时需要指定字符编码格式(如UTF-8),以避免乱码问题。如果需要解码,可以使用。
2025-03-10 13:39:25
956
原创 RReadWriteLock读写锁应用场景
不存在:把当前操作数据放入redis 缓存中(同时这个动作加写锁),在加写锁的过程中,是不允许其他读锁读取数据的。操作涉及一批数据,如订单,可能存在多个场景下操作,先使用读锁,从redis缓存中获取操作中数据。先判断当前操作的数据,是否在其他地方操作中(在redis set结构中),set,数据不重复,可以计算交集,判断是否在当前元素中。操作完成,删除缓存中数据(同时加写锁)存在:提示稍后再操作,业务流程终止。关于缓存数据redis结构选取。然后,进行业务逻辑处理。
2025-03-09 22:37:19
255
原创 消息队列为什么会有消费组的概念,什么作用,以订单系统为例说明
消息队列可能会将Partition 1的消息分配给Consumer A,Partition 2的消息分配给Consumer B,Partition 3的消息分配给Consumer C。在分布式系统中,消费组允许多个消费者实例共同消费同一个主题(Topic)中的消息,从而提高消息处理的速度和系统的吞吐量。:如果消费组中的某个消费者失败,其他消费者可以接管其未处理的消息,确保消息不会丢失,提高系统的可靠性。如果没有消费组的概念,可能需要一个强大的消费者来处理所有的订单消息,这在订单量大的情况下会成为瓶颈。
2025-03-08 23:18:38
225
原创 从java角度 抖音直播发布消息量这么大,怎么实时展示的,用了哪些技术实现的,如果用到mq消息不会积压吗
抖音直播的实时消息展示是通过WebSocket + 消息队列 + 分布式缓存 + 流式计算等技术实现的。消息队列的积压问题可以通过水平扩展、动态扩容、消息优先级等方式解决。整体架构设计注重高并发、低延迟和高可用性,确保用户体验流畅。
2025-03-08 21:58:51
414
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人