- 博客(63)
- 收藏
- 关注
原创 CTE聚合查询,性能优化不止10几倍
本文介绍了一种高效动态生成批量聚合报表的SQL模板。该方案通过CTE分步处理:首先动态查询目标公司ID列表(支持复杂业务逻辑),然后与主表关联获取基础数据,最后进行多维度聚合计算。其核心优势包括:自动计算目标公司无需前端传递、支持复杂筛选条件、确保数据完整性(补零行)、单一修改点、高性能和高可读性。文章还提供了进阶变种,如混合手动指定与自动补全公司、支持多粒度分析等场景。这种结构化的写法特别适合生产环境中动态业务报表的开发需求。
2025-12-03 23:39:00
357
原创 【无标题】
SQL中的OVER()窗口函数详解:OVER()是SQL窗口函数子句,允许在多行上执行计算而不合并行。基本语法包含PARTITION BY(数据分区)、ORDER BY(分区内排序)和窗口帧(定义计算范围)。常用函数包括排名函数(ROW_NUMBER、RANK)、聚合函数(SUM、AVG)和分布函数(PERCENT_RANK)。窗口函数保持原始行,兼具灵活性和高性能,适用于数据分析、报表等场景,能同时显示详细数据和聚合结果。
2025-11-24 17:10:58
282
原创 策略模式上下文管理
策略管理上下文(MqProducerContext)是策略模式的核心实现,它作为统一入口封装策略的注册、路由和执行逻辑。主要功能包括:1)自动扫描注册所有策略实现并建立消息类型映射;2)根据输入消息类型智能选择对应策略或降级到默认策略;3)为客户端提供简单统一的调用接口。相比让客户端直接处理策略选择,上下文模式能显著降低复杂度,集中处理公共逻辑(监控/日志/异常),并支持策略生命周期管理。这种设计实现了策略选择与业务逻辑的彻底分离,使系统更易维护和扩展,是策略模式的最佳实践。
2025-11-03 11:44:27
200
原创 Dubbo 是干嘛的
摘要: Dubbo 是一款高性能的 Java RPC 框架,专为分布式微服务系统设计。它通过服务注册中心(如 ZooKeeper/Nacos)实现服务的自动注册与发现,允许消费者像调用本地方法一样透明化调用远程服务。核心功能包括负载均衡、容错机制和服务治理,支持动态感知服务节点变化,提升系统弹性和高可用性。相比传统 HTTP API,Dubbo 采用自定义 TCP 协议,性能更高,并内置丰富的治理能力(如降级、动态配置)。适用于微服务架构中多服务的高效协作,是阿里巴巴开源的核心分布式通信解决方案。
2025-10-21 14:35:31
296
原创 Docker镜像和容器有什么区别
Docker镜像和容器是Docker技术的核心概念,镜像是一个静态的、只读的模板,包含运行应用程序所需的一切,而容器是镜像的运行实例,具有动态可写性。镜像通过Dockerfile构建或从远程仓库拉取,容器则通过镜像启动。镜像不可修改,容器可以在运行时进行修改,但默认情况下容器停止后数据会丢失。镜像用于分发和标准化,容器用于运行和隔离环境。两者的关系类似于“类与实例”或“模板与运行对象”。
2025-05-16 15:11:40
604
原创 最终一致性和强一致性
强一致性和最终一致性是分布式系统中两种重要的数据一致性模型,分别适用于不同的场景。强一致性要求所有节点在任何时刻都保持数据一致,确保写入成功后立即能读取最新值,适用于对数据准确性要求极高的场景,如金融交易,但在网络分区或节点故障时可能牺牲可用性。最终一致性则允许数据在不同节点间短暂不一致,但最终会达成一致,适用于对实时性要求不高但需要高可用的场景,如社交媒体动态。两者的核心区别在于数据同步方式、延迟和可用性,强一致性选择CP模型,最终一致性选择AP模型。根据实际需求选择合适的一致性模型是关键。
2025-05-13 22:53:13
809
原创 MyBatis-Plus的批量插入与原生JDBC效率对比
MyBatis-Plus与原生JDBC在批量插入方面各有优劣。MyBatis-Plus通过saveBatch()方法提供高度封装的API,代码简洁且开发效率高,但默认情况下可能逐条插入,性能较低。通过配置批处理模式和事务管理,性能可接近原生JDBC。原生JDBC则需手动编写SQL、管理连接和批处理操作,代码量大但性能最优,适合高性能或复杂场景。MyBatis-Plus适合标准CRUD操作,而原生JDBC适合需要极致性能或高度定制化的场景。选择时需根据具体需求权衡开发效率与性能。
2025-05-13 22:04:55
908
原创 ArrayList的扩容机制
ArrayList的扩容机制是其动态数组实现的核心,确保在添加元素时容量自动调整。默认初始容量为10,用户可通过构造函数指定初始容量以减少初期扩容次数。当添加元素时,若当前元素数量加1超过数组长度,则触发扩容。新容量通常为旧容量的1.5倍,若仍不足则直接使用所需最小容量。扩容涉及数组复制,时间复杂度为O(n)。用户可通过ensureCapacity()提前扩容,避免多次自动扩容的开销。理解ArrayList的扩容机制有助于优化代码性能,特别是在处理大量数据时。
2025-05-13 15:09:41
434
原创 SET NX互斥功能的实现原理
Redis 的 SET key value NX 命令通过原子性操作实现互斥功能,确保在键不存在时设置值,避免并发冲突。其核心在于 Redis 的单线程模型,保证了操作的原子性。底层数据结构为全局哈希表,通过哈希查找和条件写入实现高效操作。SET NX 常用于分布式锁,结合过期时间防止死锁。相比非原子的 GET + SET 方式,SET NX 避免了竞态条件,提供了简单、高效且可靠的互斥机制。
2025-05-12 23:38:41
638
原创 交易流水表的分库分表设计
交易流水表的分库分表设计需根据业务特点、数据增长趋势和查询模式进行优化。核心目标包括解决性能瓶颈、数据均衡分布、简化运维和兼容业务查询。常见的分库分表策略包括垂直拆分和水平拆分,其中水平拆分可进一步细分为按时间范围分表、按哈希分片、按业务主体分片和组合分片键。实施时需注意分片键选择、避免热点、扩容方案、查询优化和工具支持。运维建议包括数据归档、监控报警和灰度验证。最终方案应通过业务流量模拟验证,确保分片均匀且查询高效。
2025-05-12 23:36:39
847
原创 RDB和AOF的区别
Redis提供两种持久化机制:RDB和AOF,各有优缺点。RDB通过定期生成二进制快照实现数据备份,具有高性能和快速恢复的特点,但存在数据丢失风险。AOF通过记录每个写操作命令到日志文件,提供更高的数据安全性,但文件体积较大且恢复速度较慢。建议混合使用RDB和AOF,以兼顾数据安全性和恢复速度。纯RDB适用于允许分钟级数据丢失的场景,而纯AOF适用于数据安全性优先的场景。运维时需监控磁盘空间、制定备份策略并进行性能调优,以平衡数据安全性与性能。
2025-05-12 23:33:26
646
原创 利用互斥锁或者利用逻辑过期解决缓存击穿问题
缓存击穿是指某个热点数据缓存过期时,大量并发请求直接穿透缓存,同时访问数据库,导致数据库压力骤增甚至崩溃。以下是基于互斥锁和逻辑过期。
2025-04-17 23:04:42
1127
原创 逻辑过期怎么设计
设计“逻辑过期”通常用于缓存、令牌管理、数据有效性验证等场景,其核心是通过业务逻辑判断数据是否过期(而非单纯依赖物理时间)。每次访问数据时,
2025-04-17 22:46:38
625
原创 利用ziplist和skiplist实现排行榜的功能
为了利用ziplist和skiplist实现排行榜功能,可以结合两者的优势,在数据量较小时使用ziplist以节省内存,数据量增大时自动转换为skiplist以提升性能。定位起始位置,沿底层指针遍历N个节点(时间复杂度O(logN + N))。从最高层开始查找,累加跨度值直到找到成员,总跨度和即为排名。元素按分数降序排列(或升序,根据需求),每个节点存储。此方案平衡了内存与性能,适用于动态变化的排行榜场景。遍历列表,找到成员的位置,排名=位置索引+1。直接返回前N个元素(时间复杂度O(N))。
2025-04-08 14:43:39
957
原创 利用 Redis 和 RabbitMQ 实现高并发下的异步秒杀系统
通过结合 Redis 的原子性 Lua 脚本和 RabbitMQ 的异步消息队列,系统能够在高并发场景下保证数据一致性,同时通过异步处理提升整体吞吐量。
2025-04-08 12:45:04
321
原创 tcp的粘包拆包问题,如何解决?
选择依据:根据数据特点(文本/二进制、长度是否固定)选择合适方案。推荐做法:优先使用成熟框架(如Netty)的解码器,避免重复造轮子。注意事项:处理字节序、缓冲区溢出、数据校验等边界条件。通过明确数据包边界,结合应用层协议设计,可有效解决TCP粘包/拆包问题,确保可靠数据传输。
2025-04-02 21:51:14
819
原创 一个服务器算分布式吗,分布式需要几个服务器
通过通信网络共享资源、共同完成任务。,而非单纯堆砌服务器数量。分布式系统的核心在于。分布式系统的核心在于。
2025-04-02 21:50:24
953
原创 如果数据包的最后一段特别短,如何处理?
在处理TCP粘包/拆包时,如果最后一个数据段特别短(例如仅包含部分包头部或部分数据体),需要通过合理的缓冲区和协议设计来确保数据完整性。核心思想:将无法构成完整包的数据暂存到缓冲区,等待后续数据到达后拼接处理。框架内置的解码器已自动处理短包问题,无需手动管理缓冲区。
2025-04-02 21:49:40
472
原创 Spring 中常见设计模式及其典型应用场景的详细介绍
Spring 框架通过灵活运用设计模式,实现了高度模块化、可扩展和低耦合的架构。理解这些模式在 Spring 中的应用场景,不仅有助于更高效地使用框架,还能提升代码设计能力。AOP 代理解决横切关注点,模板方法简化重复代码,依赖注入实现松耦合,观察者模式支持事件驱动编程。这些模式共同支撑了 Spring 的核心功能(IoC、AOP、MVC 等),使其成为企业级开发的首选框架。
2025-03-31 15:08:30
541
原创 Spring Bean 的实例化有几种方式?
接口自定义复杂的 Bean 创建逻辑(如集成第三方库)。Spring 会调用。根据实际需求选择合适的实例化方式,可以灵活平衡配置的简洁性与代码的可控性。注解的方法显式定义 Bean。适用于需要精细控制实例化过程的场景。来创建新 Bean。需要先创建工厂 Bean,再调用其方法。返回 Bean 实例。适用于需要封装对象创建逻辑的场景。(无参构造器)创建 Bean 实例。接口,根据条件动态决定是否创建 Bean。方法获取实际 Bean。
2025-03-31 14:58:10
560
原创 雪花算法原理详解
的巧妙设计,在简单性、性能和扩展性之间取得平衡,成为分布式系统中最广泛使用的ID生成方案之一。,通过结合时间戳、机器ID和序列号生成全局唯一且有序的64位整数ID。雪花算法(Snowflake Algorithm)是 Twitter 开源的一种。若当前时间小于上一次生成ID的时间(如系统时钟回退),抛出异常或等待时钟同步。将时间戳、机器ID和序列号按位拼接,生成最终的64位ID。,既避免中心化协调的开销,又保证ID的唯一与有序。读取当前时间戳(毫秒),减去预设的起始时间戳(如。
2025-03-27 16:47:12
3286
原创 什么是令牌桶限流算法
算法,主要用于限制系统在单位时间内处理的请求量,避免突发流量导致服务过载。其核心思想是通过“令牌”的生成和消费来控制请求的速率,同时允许一定程度的流量突发。令牌桶算法(Token Bucket Algorithm)是一种经典的。
2025-03-27 16:17:26
768
原创 MySQL连接查询和子连接有什么区别,分别应用于什么场景
MySQL中的连接查询(JOIN)和子查询(Subquery)是两种不同的数据关联方式,它们在语法、执行逻辑和适用场景上有明显区别。
2025-03-26 12:47:03
775
原创 如何设计一个订单号生成服务?应该考虑那些问题?
通过上面的示例演示,下面针对这几种情况做一个分析与总结。尽可能的选择一种合理的方式。实现方案优势劣势数据库自增代码层面无需任何特殊处理;利用MySQL特点实现数据递增并发性能差;MySQL负担重UUID实现简单、方便;重复性低可读性低;过于冗长;数据库查询效率低雪花算法基于内存、速度快;性能高;不会产生额外的网络开销;数据依次成递增依赖于服务器时间,如变动服务器时间则存在重复的情况Redis基于内存、速度库;使用简单;可分布数据、扩展性强需要独立搭建一套服务、增加了维护成本;
2025-03-25 22:17:56
891
原创 说一下什么是TCP
的核心协议,属于 TCP/IP 协议族中的传输层协议。它负责在通信的两端(如客户端和服务器)之间建立稳定、有序的数据传输通道,确保数据准确无误地送达。,是互联网基础设施中不可或缺的协议。理解 TCP 的工作原理(如三次握手、流量控制)对于网络编程和故障排查至关重要。TCP(Transmission Control Protocol,传输控制协议)是互联网中一种。TCP 通过复杂的机制牺牲部分传输效率,换取了数据传输的。
2025-03-20 18:03:55
265
原创 滑动窗口是什么,解决了什么问题?
它通过动态调整发送和接收数据的范围,平衡网络吞吐量与资源限制,确保高效且有序的数据传输。若窗口大小为4,已发送数据1-4,收到ACK1后,窗口滑动至5-8,允许发送5-8。滑动窗口是TCP协议高效可靠传输的基石,深刻理解其原理对网络优化和故障排查至关重要。:发送窗口大小为4,发送数据包1-4。是TCP协议中用于实现。
2025-03-20 17:41:55
624
原创 MVCC(多版本并发控制)与乐观锁、悲观锁有相似之处吗?
MVCC(多版本并发控制)与乐观锁、悲观锁在并发控制的目标上有相似之处,但实现机制和应用场景存在显著差异。两者均通过“延迟冲突处理”提升并发性能,但MVCC是数据库内置的多版本机制,而乐观锁是应用层的版本校验策略。三者并非互斥,可根据业务需求组合使用(如MVCC+乐观锁实现高效且安全的并发控制)。MVCC通过无锁设计支持高并发读,悲观锁通过加锁确保强一致,但并发性较低。:在线订票系统的高并发抢票。
2025-03-20 17:23:16
385
原创 Redis自增ID怎么设计
通过合理设计键、持久化策略和集群分片,Redis能高效可靠地满足各类ID生成需求。高并发场景下,可批量获取ID区间,减少Redis交互次数。命令实现原子性递增,确保分布式环境下ID唯一且递增。
2025-03-20 01:06:30
429
原创 WebSocket怎么设计连接
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的场景(如聊天、实时数据推送、在线游戏等)。设计一个高效、稳定的 WebSocket 连接需要从。根据业务需求选择合适的库和架构,平衡性能和开发成本。
2025-03-20 01:05:11
779
原创 锁升级原理
Java 中的锁升级(Lock Escalation)是 关键字实现高效并发控制的核心机制。其本质是通过 对象头的 Mark Word 动态调整锁的粒度,从无锁状态逐步升级到重量级锁,以平衡性能与线程安全。以下是 Java 锁升级的详细原理和实现细节:每个 Java 对象在内存中分为三部分:Mark Word 是对象头中的关键部分(64 位 JVM 中占 64 位),记录了锁状态和标志位:Java 锁升级从低开销到高开销分为四个阶段,逐步适应竞争强度:Java 的锁升级是单向的:使用工具分析锁竞争:
2025-03-20 01:02:44
542
原创 如何设计锁降级
锁降级的设计主要应用于读写锁场景,确保在保持数据一致性的同时提高并发性能。此操作允许同一线程持有读锁,避免其他线程在写锁释放后篡改数据。同一线程可重复降级,但需确保每次降级操作配对(如多次获取读锁需对应释放次数)。若需升级,必须释放读锁后重新竞争写锁。通过严格遵循获取顺序和异常处理,锁降级能有效提升高并发场景下的系统性能。此时线程仅持有读锁,其他线程可并发获取读锁。若顺序颠倒,其他线程可能趁机获取写锁修改数据,导致不一致。线程首先获取写锁,确保独占访问以修改数据。块中释放锁,避免因异常导致锁泄漏。
2025-03-20 00:42:04
347
原创 ThreadPoolExecutor 源码分析
的源码是掌握 Java 线程池工作原理的关键。以下是其核心源码逻辑的深入分析,结合设计思想和关键代码片段。),通过位运算高效管理。
2025-03-18 22:28:57
792
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅