自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 Docker镜像和容器有什么区别

Docker镜像和容器是Docker技术的核心概念,镜像是一个静态的、只读的模板,包含运行应用程序所需的一切,而容器是镜像的运行实例,具有动态可写性。镜像通过Dockerfile构建或从远程仓库拉取,容器则通过镜像启动。镜像不可修改,容器可以在运行时进行修改,但默认情况下容器停止后数据会丢失。镜像用于分发和标准化,容器用于运行和隔离环境。两者的关系类似于“类与实例”或“模板与运行对象”。

2025-05-16 15:11:40 331

原创 最终一致性和强一致性

强一致性和最终一致性是分布式系统中两种重要的数据一致性模型,分别适用于不同的场景。强一致性要求所有节点在任何时刻都保持数据一致,确保写入成功后立即能读取最新值,适用于对数据准确性要求极高的场景,如金融交易,但在网络分区或节点故障时可能牺牲可用性。最终一致性则允许数据在不同节点间短暂不一致,但最终会达成一致,适用于对实时性要求不高但需要高可用的场景,如社交媒体动态。两者的核心区别在于数据同步方式、延迟和可用性,强一致性选择CP模型,最终一致性选择AP模型。根据实际需求选择合适的一致性模型是关键。

2025-05-13 22:53:13 392

原创 MyBatis-Plus的批量插入与原生JDBC效率对比

MyBatis-Plus与原生JDBC在批量插入方面各有优劣。MyBatis-Plus通过saveBatch()方法提供高度封装的API,代码简洁且开发效率高,但默认情况下可能逐条插入,性能较低。通过配置批处理模式和事务管理,性能可接近原生JDBC。原生JDBC则需手动编写SQL、管理连接和批处理操作,代码量大但性能最优,适合高性能或复杂场景。MyBatis-Plus适合标准CRUD操作,而原生JDBC适合需要极致性能或高度定制化的场景。选择时需根据具体需求权衡开发效率与性能。

2025-05-13 22:04:55 730

原创 ArrayList的扩容机制

ArrayList的扩容机制是其动态数组实现的核心,确保在添加元素时容量自动调整。默认初始容量为10,用户可通过构造函数指定初始容量以减少初期扩容次数。当添加元素时,若当前元素数量加1超过数组长度,则触发扩容。新容量通常为旧容量的1.5倍,若仍不足则直接使用所需最小容量。扩容涉及数组复制,时间复杂度为O(n)。用户可通过ensureCapacity()提前扩容,避免多次自动扩容的开销。理解ArrayList的扩容机制有助于优化代码性能,特别是在处理大量数据时。

2025-05-13 15:09:41 294

原创 SET NX互斥功能的实现原理

Redis 的 SET key value NX 命令通过原子性操作实现互斥功能,确保在键不存在时设置值,避免并发冲突。其核心在于 Redis 的单线程模型,保证了操作的原子性。底层数据结构为全局哈希表,通过哈希查找和条件写入实现高效操作。SET NX 常用于分布式锁,结合过期时间防止死锁。相比非原子的 GET + SET 方式,SET NX 避免了竞态条件,提供了简单、高效且可靠的互斥机制。

2025-05-12 23:38:41 447

原创 交易流水表的分库分表设计

交易流水表的分库分表设计需根据业务特点、数据增长趋势和查询模式进行优化。核心目标包括解决性能瓶颈、数据均衡分布、简化运维和兼容业务查询。常见的分库分表策略包括垂直拆分和水平拆分,其中水平拆分可进一步细分为按时间范围分表、按哈希分片、按业务主体分片和组合分片键。实施时需注意分片键选择、避免热点、扩容方案、查询优化和工具支持。运维建议包括数据归档、监控报警和灰度验证。最终方案应通过业务流量模拟验证,确保分片均匀且查询高效。

2025-05-12 23:36:39 623

原创 RDB和AOF的区别

Redis提供两种持久化机制:RDB和AOF,各有优缺点。RDB通过定期生成二进制快照实现数据备份,具有高性能和快速恢复的特点,但存在数据丢失风险。AOF通过记录每个写操作命令到日志文件,提供更高的数据安全性,但文件体积较大且恢复速度较慢。建议混合使用RDB和AOF,以兼顾数据安全性和恢复速度。纯RDB适用于允许分钟级数据丢失的场景,而纯AOF适用于数据安全性优先的场景。运维时需监控磁盘空间、制定备份策略并进行性能调优,以平衡数据安全性与性能。

2025-05-12 23:33:26 406

原创 利用互斥锁或者利用逻辑过期解决缓存击穿问题

缓存击穿是指某个热点数据缓存过期时,大量并发请求直接穿透缓存,同时访问数据库,导致数据库压力骤增甚至崩溃。以下是基于互斥锁和逻辑过期。

2025-04-17 23:04:42 947

原创 逻辑过期怎么设计

设计“逻辑过期”通常用于缓存、令牌管理、数据有效性验证等场景,其核心是通过业务逻辑判断数据是否过期(而非单纯依赖物理时间)。每次访问数据时,

2025-04-17 22:46:38 534

原创 WebSocket 实现数据实时推送原理

WebSocket 实现数据实时推送的核心机制在于其全双工通信能力和持久的连接特性。

2025-04-17 22:29:51 1221

原创 finally块一定会执行吗?

但以下特殊情况会导致。

2025-04-10 23:17:40 383

原创 利用ziplist和skiplist实现排行榜的功能

为了利用ziplist和skiplist实现排行榜功能,可以结合两者的优势,在数据量较小时使用ziplist以节省内存,数据量增大时自动转换为skiplist以提升性能。定位起始位置,沿底层指针遍历N个节点(时间复杂度O(logN + N))。从最高层开始查找,累加跨度值直到找到成员,总跨度和即为排名。元素按分数降序排列(或升序,根据需求),每个节点存储。此方案平衡了内存与性能,适用于动态变化的排行榜场景。遍历列表,找到成员的位置,排名=位置索引+1。直接返回前N个元素(时间复杂度O(N))。

2025-04-08 14:43:39 896

原创 利用 Redis 和 RabbitMQ 实现高并发下的异步秒杀系统

通过结合 Redis 的原子性 Lua 脚本和 RabbitMQ 的异步消息队列,系统能够在高并发场景下保证数据一致性,同时通过异步处理提升整体吞吐量。

2025-04-08 12:45:04 198

原创 使用分布式锁和乐观锁解决超卖问题

在电商、秒杀等高并发场景中,“超卖”问题指库存被过量扣减,导致实际库存不足。以下是使用和。

2025-04-07 21:49:03 757

原创 tcp的粘包拆包问题,如何解决?

选择依据:根据数据特点(文本/二进制、长度是否固定)选择合适方案。推荐做法:优先使用成熟框架(如Netty)的解码器,避免重复造轮子。注意事项:处理字节序、缓冲区溢出、数据校验等边界条件。通过明确数据包边界,结合应用层协议设计,可有效解决TCP粘包/拆包问题,确保可靠数据传输。

2025-04-02 21:51:14 647

原创 一个服务器算分布式吗,分布式需要几个服务器

通过通信网络共享资源、共同完成任务。,而非单纯堆砌服务器数量。分布式系统的核心在于。分布式系统的核心在于。

2025-04-02 21:50:24 698

原创 如果数据包的最后一段特别短,如何处理?

在处理TCP粘包/拆包时,如果最后一个数据段特别短(例如仅包含部分包头部或部分数据体),需要通过合理的缓冲区和协议设计来确保数据完整性。核心思想:将无法构成完整包的数据暂存到缓冲区,等待后续数据到达后拼接处理。框架内置的解码器已自动处理短包问题,无需手动管理缓冲区。

2025-04-02 21:49:40 353

原创 Java 各版本的新特性

Java 各版本的新特性主要集中在提升开发效率、性能优化、语言功能增强和模块化支持等方面。如需更详细特性,可参考。

2025-04-01 14:12:38 623

原创 CPU 密集型 vs I/O 密集型

在计算机任务处理中,和是两种常见的任务分类,理解它们的差异对系统设计、资源分配和性能优化至关重要。

2025-04-01 14:07:34 826

原创 基于 Java 的异步任务管理器的设计与实现方案

如果需要更具体的实现(如分布式任务分片、动态扩缩容)或某个框架的详细用法,请进一步说明!

2025-04-01 13:56:41 452

原创 Spring 中常见设计模式及其典型应用场景的详细介绍

Spring 框架通过灵活运用设计模式,实现了高度模块化、可扩展和低耦合的架构。理解这些模式在 Spring 中的应用场景,不仅有助于更高效地使用框架,还能提升代码设计能力。AOP 代理解决横切关注点,模板方法简化重复代码,依赖注入实现松耦合,观察者模式支持事件驱动编程。这些模式共同支撑了 Spring 的核心功能(IoC、AOP、MVC 等),使其成为企业级开发的首选框架。

2025-03-31 15:08:30 438

原创 Spring Bean 的实例化有几种方式?

接口自定义复杂的 Bean 创建逻辑(如集成第三方库)。Spring 会调用。根据实际需求选择合适的实例化方式,可以灵活平衡配置的简洁性与代码的可控性。注解的方法显式定义 Bean。适用于需要精细控制实例化过程的场景。来创建新 Bean。需要先创建工厂 Bean,再调用其方法。返回 Bean 实例。适用于需要封装对象创建逻辑的场景。(无参构造器)创建 Bean 实例。接口,根据条件动态决定是否创建 Bean。方法获取实际 Bean。

2025-03-31 14:58:10 409

原创 雪花算法原理详解

的巧妙设计,在简单性、性能和扩展性之间取得平衡,成为分布式系统中最广泛使用的ID生成方案之一。,通过结合时间戳、机器ID和序列号生成全局唯一且有序的64位整数ID。雪花算法(Snowflake Algorithm)是 Twitter 开源的一种。若当前时间小于上一次生成ID的时间(如系统时钟回退),抛出异常或等待时钟同步。将时间戳、机器ID和序列号按位拼接,生成最终的64位ID。,既避免中心化协调的开销,又保证ID的唯一与有序。读取当前时间戳(毫秒),减去预设的起始时间戳(如。

2025-03-27 16:47:12 434

原创 什么是令牌桶限流算法

算法,主要用于限制系统在单位时间内处理的请求量,避免突发流量导致服务过载。其核心思想是通过“令牌”的生成和消费来控制请求的速率,同时允许一定程度的流量突发。令牌桶算法(Token Bucket Algorithm)是一种经典的。

2025-03-27 16:17:26 530

原创 Docker 命令分类整理

掌握这些命令后,您可以高效管理 Docker 容器和镜像。

2025-03-26 13:20:31 703

原创 MySQL连接查询和子连接有什么区别,分别应用于什么场景

MySQL中的连接查询(JOIN)和子查询(Subquery)是两种不同的数据关联方式,它们在语法、执行逻辑和适用场景上有明显区别。

2025-03-26 12:47:03 509

原创 如何设计一个订单号生成服务?应该考虑那些问题?

通过上面的示例演示,下面针对这几种情况做一个分析与总结。尽可能的选择一种合理的方式。实现方案优势劣势数据库自增代码层面无需任何特殊处理;利用MySQL特点实现数据递增并发性能差;MySQL负担重UUID实现简单、方便;重复性低可读性低;过于冗长;数据库查询效率低雪花算法基于内存、速度快;性能高;不会产生额外的网络开销;数据依次成递增依赖于服务器时间,如变动服务器时间则存在重复的情况Redis基于内存、速度库;使用简单;可分布数据、扩展性强需要独立搭建一套服务、增加了维护成本;

2025-03-25 22:17:56 772

原创 Spring Boot 的启动流程

Spring Boot 的启动流程是一个复杂的自动化过程,核心围绕的初始化与run()方法展开。

2025-03-25 18:08:33 795

原创 说一下什么是TCP

的核心协议,属于 TCP/IP 协议族中的传输层协议。它负责在通信的两端(如客户端和服务器)之间建立稳定、有序的数据传输通道,确保数据准确无误地送达。,是互联网基础设施中不可或缺的协议。理解 TCP 的工作原理(如三次握手、流量控制)对于网络编程和故障排查至关重要。TCP(Transmission Control Protocol,传输控制协议)是互联网中一种。TCP 通过复杂的机制牺牲部分传输效率,换取了数据传输的。

2025-03-20 18:03:55 192

原创 滑动窗口是什么,解决了什么问题?

它通过动态调整发送和接收数据的范围,平衡网络吞吐量与资源限制,确保高效且有序的数据传输。若窗口大小为4,已发送数据1-4,收到ACK1后,窗口滑动至5-8,允许发送5-8。滑动窗口是TCP协议高效可靠传输的基石,深刻理解其原理对网络优化和故障排查至关重要。:发送窗口大小为4,发送数据包1-4。是TCP协议中用于实现。

2025-03-20 17:41:55 544

原创 MVCC(多版本并发控制)与乐观锁、悲观锁有相似之处吗?

MVCC(多版本并发控制)与乐观锁、悲观锁在并发控制的目标上有相似之处,但实现机制和应用场景存在显著差异。两者均通过“延迟冲突处理”提升并发性能,但MVCC是数据库内置的多版本机制,而乐观锁是应用层的版本校验策略。三者并非互斥,可根据业务需求组合使用(如MVCC+乐观锁实现高效且安全的并发控制)。MVCC通过无锁设计支持高并发读,悲观锁通过加锁确保强一致,但并发性较低。:在线订票系统的高并发抢票。

2025-03-20 17:23:16 314

原创 Redis自增ID怎么设计

通过合理设计键、持久化策略和集群分片,Redis能高效可靠地满足各类ID生成需求。高并发场景下,可批量获取ID区间,减少Redis交互次数。命令实现原子性递增,确保分布式环境下ID唯一且递增。

2025-03-20 01:06:30 287

原创 WebSocket怎么设计连接

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的场景(如聊天、实时数据推送、在线游戏等)。设计一个高效、稳定的 WebSocket 连接需要从。根据业务需求选择合适的库和架构,平衡性能和开发成本。

2025-03-20 01:05:11 509

原创 锁升级原理

Java 中的锁升级(Lock Escalation)是 关键字实现高效并发控制的核心机制。其本质是通过 对象头的 Mark Word 动态调整锁的粒度,从无锁状态逐步升级到重量级锁,以平衡性能与线程安全。以下是 Java 锁升级的详细原理和实现细节:每个 Java 对象在内存中分为三部分:Mark Word 是对象头中的关键部分(64 位 JVM 中占 64 位),记录了锁状态和标志位:Java 锁升级从低开销到高开销分为四个阶段,逐步适应竞争强度:Java 的锁升级是单向的:使用工具分析锁竞争:

2025-03-20 01:02:44 429

原创 如何设计锁降级

锁降级的设计主要应用于读写锁场景,确保在保持数据一致性的同时提高并发性能。此操作允许同一线程持有读锁,避免其他线程在写锁释放后篡改数据。同一线程可重复降级,但需确保每次降级操作配对(如多次获取读锁需对应释放次数)。若需升级,必须释放读锁后重新竞争写锁。通过严格遵循获取顺序和异常处理,锁降级能有效提升高并发场景下的系统性能。此时线程仅持有读锁,其他线程可并发获取读锁。若顺序颠倒,其他线程可能趁机获取写锁修改数据,导致不一致。线程首先获取写锁,确保独占访问以修改数据。块中释放锁,避免因异常导致锁泄漏。

2025-03-20 00:42:04 273

原创 ThreadPoolExecutor 源码分析

的源码是掌握 Java 线程池工作原理的关键。以下是其核心源码逻辑的深入分析,结合设计思想和关键代码片段。),通过位运算高效管理。

2025-03-18 22:28:57 696

原创 MySQL 事务的实现原理

Redo Log保障持久性和崩溃恢复。Undo Log保障原子性和 MVCC。锁 + MVCC实现隔离性。事务 ID 和版本链支持多版本并发控制。InnoDB 通过上述机制高效实现了事务的 ACID 特性,同时在高并发场景下平衡了性能与一致性。现代应用推荐默认使用 InnoDB,仅在特殊场景(如只读分析)考虑其他引擎。

2025-03-18 21:24:29 1031

原创 Mysql如何解决幻读问题

幻读(Phantom Read)是指在同一事务中,两次范围查询()的结果集不一致,因为其他事务在范围内**插入(INSERT)或删除(DELETE)**了数据。-- 事务 A-- 返回 3 条记录-- 事务 B 插入一条 age=25 的数据并提交-- 事务 A 再次查询-- 返回 4 条记录(出现幻读)快照读(MVCC):通过版本链和 ReadView 保证多次查询结果一致。当前读(Next-Key Locks):通过锁住记录和间隙,禁止其他事务插入新数据。

2025-03-18 16:25:22 413

原创 讲一下wait和notify这个为什么要在synchronized代码块中?

在 Java 中,wait()和notify()(以及)必须用在代码块或同步方法中,这是由它们的和决定的。

2025-03-13 18:39:37 546

原创 如何设计高效的数据库索引

同时避免资源浪费。需结合业务场景,通过分析查询模式、数据分布和系统特性,动态调整索引策略。定期监控和优化是维持高性能的必备手段。设计高效的数据库索引需要综合考虑。

2025-03-13 17:57:46 705

空空如也

空空如也

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

TA关注的人

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