自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

埃泽漫笔

尘埃亦有光泽,微光终成星河

  • 博客(685)
  • 收藏
  • 关注

原创 mysql什么情况下会产生死锁

死锁的本质是“锁竞争的循环等待”,并非 MySQL 的 bug,而是并发事务中“锁策略”与“业务逻辑”共同作用的结果。诊断:通过定位死锁的事务和 SQL,找到锁竞争的根源;预防:从“锁定顺序、事务时长、锁类型、查询方式”四个维度优化,减少锁冲突的概率;兜底:依赖 InnoDB 的自动死锁检测与回滚,确保死锁发生后系统能快速恢复,不影响整体可用性。在实际业务中(如电商秒杀、金融交易),需结合具体场景选择优化方案,平衡“数据一致性”和“并发性能”,才能有效规避死锁问题。

2025-09-17 08:34:03 511

原创 mysql的redolog

本质:InnoDB 的物理日志,记录数据修改的“物理位置+内容”,是事务持久性和崩溃恢复的基础;核心机制:WAL(Write-Ahead Logging 先写日志,后写数据),用顺序写提升性能,用刷盘保证安全;关键配置(最安全)、调大(减少日志切换)、日志文件与数据文件分开存储(减少 IO 竞争);与 binlog 配合:redo log 负责崩溃恢复,binlog 负责主从复制,二者缺一不可。

2025-09-16 23:31:48 827

原创 Mysql的binlog的三种格式

在大多数情况下,它使用STATEMENT格式,但在某些情况下(如无法精确复制的语句)会自动切换到ROW格式。在某些情况下,语句的执行结果可能依赖于上下文环境(如系统变量、用户变量、当前时间等),可能导致主从复制时出现不一致的情况。结合了STATEMENT和ROW格式的优点,在大多数情况下保持较小的日志文件,同时在需要时提供高精度的行变化记录。日志文件较大,因为它记录了每一行的变化。在这种格式下,binlog记录的是每一行数据的实际变化。在这种格式下,binlog记录的是执行的SQL语句。

2025-09-16 08:40:57 593

原创 mysql的binlog是什么

启用必做:生产环境必须启用 binlog,否则数据丢失后无法恢复,也无法实现主从复制;格式选择:推荐使用ROW或MIXED格式,避免STATEMENT格式的主从复制一致性问题;空间管理:配置自动清理策略(或),定期检查磁盘空间;安全备份:重要业务的 binlog 需单独备份(如同步到异地存储),避免日志与数据同时丢失;主从注意:主从复制场景中,确保从库同步进度后再清理主库日志,避免复制中断。

2025-09-16 08:36:22 611

原创 mysql的隔离级别使用场景

隔离级别核心解决问题适用场景典型案例不适用场景性能排序读未提交(RU)极致并发,允许脏读实时访问量监控、临时粗略统计核心交易、财务、库存1(最高)读已提交(RC)避免脏读,实时读新商品详情页、个人中心、日志查询下单、对账、防超卖2可重复读(RR)事务内数据一致电商下单、库存防超卖、银行转账实时数据查询(如余额刷新)3串行化(Serializable)绝对数据一致年度审计、银行结算、稀缺资源分配高并发业务(秒杀、直播下单)4(最低)

2025-09-16 08:15:37 576

原创 MySQL 各隔离级别下的实现机制深度解析

假设事务 A 修改数据但未提交,事务 B 读取时直接获取事务 A 生成的未提交版本,若事务 A 回滚,事务 B 读取的就是“脏数据”。理解各隔离级别的实现机制,才能在业务中合理选择隔离级别,避免因隔离性问题导致的数据不一致,同时最大化数据库并发性能。MySQL 的事务隔离级别定义了多个事务并发执行时,数据可见性的规则,而不同隔离级别的实现,本质是通过。,通过“MVCC 快照复用 + 间隙锁”实现“可重复读”并基本解决幻读,是性能与一致性的最优平衡。写加行级 X 锁,读无锁;无(允许脏读、不可重复读、幻读)

2025-09-15 22:34:36 811

原创 MySQL中的锁

锁类型粒度核心作用适用场景表级读/写锁表全表操作时保证一致性全表备份、批量更新(MyISAM 引擎)行级 S/X 锁行并发读写单行数据高频读写场景(如订单更新、用户信息修改)间隙锁/临键锁范围防止幻读(RR 级别)范围查询并加锁(如BETWEEN条件更新)意向锁表协调表级与行级锁InnoDB 内部自动管理,无需手动操作自增锁表保证自增列唯一性含自增列的表插入操作MDL 锁表保护表结构不被并发修改DDL 与 DML 操作的并发控制。

2025-09-15 22:28:18 692

原创 MVCC解决了什么问题

传统锁机制中,读操作(加 S 锁)和写操作(加 X 锁)互斥,导致并发性能低下。读操作读取历史快照(不加锁);写操作创建新数据版本(仅锁定当前行);读写操作可同时进行,无需相互等待。效果:在高并发场景(如电商商品详情页同时被万级用户浏览和库存更新)中,MVCC 可将吞吐量提升数倍。让读写操作并行执行,突破并发瓶颈;用无锁读操作减少锁争用,提升性能;提供稳定的一致性视图,简化业务逻辑。

2025-09-15 01:03:43 893

原创 当前读与快照读

当前读通过加锁获取最新数据,保证数据一致性和修改安全性,适用于 “读写结合” 的场景;快照读通过 MVCC 读取快照数据,不加锁以提升并发性能,适用于 “只读” 场景。理解两者的差异,能帮助我们在实际开发中合理选择查询方式 —— 例如,用快照读优化查询性能,用当前读保证交易准确性,最终在一致性和性能之间找到平衡。

2025-09-14 23:31:21 827

原创 mvcc是什么

数据行通过DB_TRX_ID和维护版本链;事务通过 Read View 的可见性规则判断数据版本是否可见;不同隔离级别通过调整 Read View 生成时机,平衡一致性与灵活性。

2025-09-14 23:05:29 653

原创 mysql半同步复制

半同步复制通过 “主库等待至少一个从库确认日志接收” 的机制,在性能与数据安全间取得了平衡,是生产环境核心业务的首选复制模式。主从库同时安装并启用半同步插件;合理设置超时时间(根据网络延迟调整);通过状态变量监控同步模式和确认次数。相比异步复制,半同步以微小的性能损耗(额外 10-100ms 延迟)显著降低了数据丢失风险;相比全同步,它又避免了因等待所有从库导致的性能灾难。

2025-09-14 03:51:35 703

原创 mysql的全复制、半复制、异步复制

异步复制牺牲一致性换取性能和可用性;全同步复制牺牲性能和可用性换取一致性;半同步复制是三者的折中,也是生产环境的主流选择。实际架构设计中,需结合业务对数据一致性的容忍度、性能要求和部署成本综合决策,避免过度设计(如为非核心业务用全同步)或忽视风险(如核心业务用异步)。

2025-09-14 02:03:08 387

原创 mysql主从同步延迟的原因和解决办法

主从同步延迟指从库(Slave)应用主库(Master)二进制日志的速度,落后于主库生成日志的速度,导致两者数据存在时间差。MySQL 中通过指标量化延迟(单位:秒),可通过Seconds_Behind_Master: 30 # 从库落后主库30秒读写分离场景下,读请求可能获取旧数据;主库故障切换时,从库数据不完整,导致数据丢失;实时性要求高的业务(如秒杀、库存扣减)出现逻辑错误。主从同步延迟的本质是 “主库日志生成” 与 “从库日志应用” 的速度不匹配。解决延迟需从。

2025-09-13 23:34:27 940

原创 mysql主从同步原理

MySQL 主从同步通过 “二进制日志复制 + 中继日志重放” 的机制,实现了主从库数据一致,是构建高可用、高并发数据库架构的基础。读写分离,分散数据库压力;数据冗余,提高系统可用性;灵活扩展,支持多从库分担读负载。

2025-09-13 23:19:53 982

原创 Mysql中的表分区

表分区是将一张逻辑上的大表,按预设规则拆分为多个物理子表(分区)的技术。这些分区共享相同的表结构,但数据独立存储,可分别位于不同文件或磁盘。逻辑层面:应用仍视为一张表,SQL 语句无需修改;物理层面:每个分区对应独立的数据文件(.ibd),可单独操作(如备份、删除)。核心价值:避免全表扫描,让查询仅命中目标分区,同时简化海量数据的管理。表分区是 MySQL 处理海量数据的 “利器”,其核心是按规则拆分数据,实现精准访问和高效管理。时间 / 数值范围 → 范围分区;离散枚举值 → 列表分区;

2025-09-13 22:55:22 804

原创 怎么做数据冷热分离?

简单来说,冷热分离是根据数据访问频率将其分类存储热数据:最近产生、高频访问的数据(如近 3 个月的订单、活跃用户信息),需要高性能存储支撑;冷数据:历史沉淀、低频访问的数据(如 1 年前的日志、归档订单),可降低存储成本。通过分离存储,既能让热数据享受 SSD (Solid State Drive)级的高速读写,又能让冷数据 “躺” 在低成本的 HDD(Hard Disk Drive) 或归档系统中,实现 “性能不打折,成本不飙升”。

2025-09-13 21:32:13 609

原创 B树和B+树的区别?

场景需求优先选择核心原因单点查询频繁,范围查询少B树内节点可能直接命中数据,减少访问层级范围查询、排序、分页频繁B+树叶节点链表支持高效范围遍历和顺序访问数据动态性高(频繁增删字段)B树插入删除可操作任意节点,适配灵活结构结构化数据,关联查询多B+树空间利用率高,适配多表关联的索引设计B树与B+树的差异本质是“单点查询效率”与“范围查询效率”的取舍。理解这种设计取舍,不仅能帮助我们优化数据库索引(如为范围查询字段建立B+树索引),还能在自定义数据结构设计时做出合理选择。

2025-09-12 23:20:55 1036

原创 mysql的explain有哪些列

EXPLAIN命令是 MySQL 性能优化的 “显微镜”,通过解读其输出的typekeyrowsExtra优先关注type字段,确保查询至少达到range级别;避免和,通过索引优化排序和分组;利用实现覆盖索引,减少回表操作。

2025-09-12 01:25:35 430

原创 InnoDB引擎的4大特性

插入缓冲/Change Buffer解决非聚簇索引的随机写入问题;二次写保障数据页完整性,是可靠性的最后一道防线;自适应哈希索引加速高频等值查询,弥补 B+树的短板;预读提前加载数据,减少查询时的 I/O 等待。理解这些机制不仅能帮助开发者写出更优的 SQL 语句(如避免在唯一索引上频繁随机插入),还能在调优时有的放矢(如根据访问模式调整预读阈值)。对于数据库性能优化而言,深入底层机制是突破瓶颈的关键。

2025-09-11 23:43:05 582

原创 ConcurrentHashMap 与 HashMap 对 null 的处理差异分析

禁止null键值是为了在并发场景中避免歧义性和潜在错误,确保操作的确定性和线程安全;而HashMap允许null则是为了在单线程环境中提供更高的灵活性。这一设计差异体现了“场景决定实现”的原则——工具的特性始终服务于其核心使用场景。理解这一点,能帮助开发者在不同场景下正确选择集合,并规避潜在的null相关问题。

2025-09-11 22:53:22 987

原创 什么是fail-safe机制

Fail-Safe 机制通过“写时复制”和“副本遍历”的设计,在并发场景下保证了迭代过程的安全性和稳定性,是多线程环境中处理集合的重要选择。其核心优势在于线程安全和迭代无异常,但需权衡内存开销和数据实时性。理解这一机制的原理和适用场景,能帮助开发者在高并发场景下做出合理的数据结构选择,平衡性能与安全性。

2025-09-11 00:59:47 345

原创 什么是fail-fast机制

Fail-Fast 机制是 Java 集合框架提供的一种快速检测迭代期间结构性修改的保护机制,通过modCount与迭代器的对比实现。其核心价值在于在开发和测试阶段及时发现不当的集合操作,但不能依赖它保证线程安全。单线程迭代时,如需修改集合,务必使用迭代器的remove()方法。多线程场景下,优先使用包中的并发集合,避免 Fail-Fast 异常和数据不一致问题。理解 Fail-Fast 机制,有助于写出更健壮的集合操作代码,避免因不当修改导致的隐性 bug。

2025-09-10 23:05:39 346

原创 ArrayList的添加与删除元素为什么慢

ArrayList 的增删操作性能受限的核心原因是数组的连续内存特性,导致中间位置的操作需要移动大量元素。虽然尾部操作可达到 O (1) 复杂度,但整体而言,ArrayList 更适合查询频繁、增删集中在尾部的场景。理解其性能特性,能帮助我们在实际开发中做出合理的数据结构选择,平衡代码可读性与运行效率。

2025-09-09 23:16:51 468

原创 ArrayList是如何扩容的?

ArrayList 的扩容机制是 "动态数组" 设计的核心体现,通过 1.5 倍扩容策略在内存利用率和性能之间取得了平衡。合理设置初始容量,减少不必要的扩容开销;选择合适的添加方式(如批量添加)优化性能;避免在大容量场景下因频繁扩容导致的性能瓶颈。

2025-09-09 22:34:08 1225

原创 ArrayList初始容量是多少

在 Java 中,ArrayList 的默认初始容量为 10,这是 JDK 规范中定义的标准值。// 默认初始容量为 10这个值的设定是 Java 开发团队基于大量实践场景的平衡选择 —— 既不会因容量过小导致频繁扩容,也不会因容量过大造成内存浪费。预估元素数量:创建 ArrayList 时,根据业务场景预估元素数量并指定初始容量避免频繁扩容:对于大型数据集(如 1000 个以上元素),显式指定容量可显著提升性能理解版本差异。

2025-09-09 22:27:49 592

原创 介绍一下常见的list实现类

ArrayList 是最常用的 List 实现类,线程不安全,内部是通过数组实现的,继承了AbstractList,实现了List。Vector 与 ArrayList 一样,也是通过数组实现的,Vector和ArrayList用法上几乎相同,但Vector比较古老,一般不用。即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢。是三种经典实现,它们基于不同的数据结构设计,适用于不同的业务场景。

2025-09-09 22:21:42 935

原创 Java 守护线程(Daemon Thread)

在 Java 中,"后台进程" 的概念通常通过实现。守护线程是一种运行在后台的特殊线程,主要用于提供辅助服务,其生命周期依赖于用户线程(非守护线程)的存在。本文将详细解析守护线程的特性、使用方法及注意事项。

2025-09-08 22:15:42 611

原创 线程池的shutDown和shutDownNow的区别

调用shutdownNow()后,线程池会尽快停止所有正在执行的任务,并返回尚未开始执行的任务列表。需要注意的是,无法保证所有正在执行的任务都能被中断。根据业务场景选择合适的关闭方式,既能保证任务执行的可靠性,又能在必要时快速释放资源,是编写健壮并发程序的重要基础。ExecutorService接口中,shutdown()和shutdownNow()是用于关闭线程池的方法。)的使用中,正确关闭线程池是确保资源释放和任务完整执行的关键操作。shutdown()方法会启动线程池的关闭过程。

2025-09-08 22:10:32 743

原创 线程池的拒绝策略有哪些

除了内置的拒绝策略,还可以通过实现RejectedExecutionHandler接口来定义自己的拒绝策略。@Override// 自定义的拒绝处理逻辑// 使用自定义拒绝策略。

2025-09-07 23:26:16 246

原创 如何重构一个线程工厂

通过自定义的线程工厂创建线程池,确保线程具有一致的属性设置。i < 10;i++) {});

2025-09-07 23:23:57 615

原创 Java 线程池工作流程

在 Java 并发编程中,线程池是一种高效管理线程资源的机制。d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常 RejectExecutionException。线程池通过预先创建一定数量的线程,复用它们处理多个任务,从而有效解决了上述问题。c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;这一阶段确保了线程池始终维持核心数量的线程,以应对日常任务负载。

2025-09-06 23:24:01 582

原创 线程池的核心构造参数有哪些

线程池中始终保持运行的最小线程数,即使这些线程处于空闲状态也不会被销毁。当提交一个新任务时,如果当前运行的线程数少于corePoolSize,即使有空闲线程,也会创建一个新线程来处理任务。当线程池中的线程数超过corePoolSize时,多余的空闲线程在等待新任务的最大时间。线程池允许创建的最大线程数。当任务队列已满且当前运行的线程数小于maximumPoolSize时,会创建新线程来执行任务。当任务队列已满且线程数量达到最大线程数时,新的任务会被拒绝执行。用于保存等待执行的任务的队列。

2025-09-05 23:23:00 717

原创 介绍下常用的java的线程池

避免使用 Executors 工厂方法实际开发中,Executors创建的线程池可能存在隐患(如 FixedThreadPool 和 SingleThreadExecutor 的无界队列可能导致 OOM,CachedThreadPool 和 ScheduledThreadPool 的最大线程数无上限)。推荐直接使用自定义参数,明确核心线程数、最大线程数、队列大小和拒绝策略。根据任务特性选择长期任务 → FixedThreadPool(控制并发数)。

2025-09-05 23:17:53 928

原创 线程的基本方法

优先级范围从Thread.MIN_PRIORITY(1) 到Thread.MAX_PRIORITY(10),默认优先级为Thread.NORM_PRIORITY(5)。线程创建以后,并不会自动运行,需要我们调用start(),将线程的状态设为就绪状态,但不一定马上就被运行,得等到CPU分配时间片以后,才会运行。线程中断是一种 “协作式” 机制,并非强制终止线程,而是通过设置中断标记通知线程 “希望你终止”,由线程自行决定是否响应。:直接调用run()方法不会启动新线程,而是在当前线程中执行run()方法。

2025-09-04 22:42:58 729

原创 Java线程的生命周期

例如,调用Thread.sleep(long millis)方法,Object.wait(long timeout)方法,Thread.join(long millis)方法,或者LockSupport.parkNanos(long nanos)方法。例如,调用Object.wait()方法,或者Thread.join()方法(不带超时时间),或者LockSupport.park()方法。在Java中,线程的生命周期包括多个状态,每个状态表示线程在其生命周期中的不同阶段。线程在这个状态下实际执行任务。

2025-09-04 22:29:49 330

原创 Java线程的创建方式

简单场景:若仅需简单测试,用「继承 Thread 类」或「Lambda 表达式」;基础并发:若无需返回值且需解耦,用「实现 Runnable 接口」;需返回结果:用「实现 Callable 接口 + FutureTask」;生产环境高并发:必须用「线程池」(如自定义参数,而非Executors工厂方法,避免默认参数风险);Java 8+ 开发:优先用「Lambda 表达式」简化RunnableCallable实现,结合线程池提升效率。

2025-09-03 22:29:39 734

原创 用户线程与守护线程区别

用户线程是应用程序主动创建的核心执行线程,用于处理业务逻辑、计算任务等关键功能,是程序运行的 “主体”。JVM 会将用户线程视为 “必须完成的任务”,只有所有用户线程执行完毕,JVM 才会触发退出流程。守护线程是为用户线程提供后台支持服务的线程,如垃圾回收、日志记录、监控检测等。它的生命周期依赖于用户线程 —— 当所有用户线程终止时,守护线程会被 JVM 强制终止,无论其是否执行完毕。用户线程是应用的 “核心执行者”,JVM 会等待其全部完成;守护线程。

2025-09-03 22:17:15 674

原创 说下进程、线程、管程、协程

进程是操作系统进行资源分配和调度的基本单位,是一个正在运行的程序实例。每个进程拥有独立的内存空间、文件描述符、寄存器状态等系统资源,是程序运行的 “容器”。线程是进程内的一个执行单元,是 CPU 调度的基本单位。一个进程可以包含多个线程,所有线程共享进程的内存空间、文件描述符等资源,但拥有独立的栈和寄存器。管程(也称为 “监视器”)是一种封装共享资源及访问逻辑的同步机制,通过互斥锁和条件变量,保证同一时间只有一个线程访问共享资源,并协调线程间的执行顺序。协程是由程序自身(用户态)调度的轻量级执行单元。

2025-09-03 22:03:55 680

原创 方法的形参在哪块区域

Java 方法的形参在 JVM 中存储于当前方法栈帧的局部变量表this引用占索引 0,形参从索引 1 开始;静态方法:形参从索引 0 开始;64 位类型(long、double)占用两个连续索引。这一机制通过栈帧的局部变量表实现了形参的高效存储与访问,同时保证了内存安全和方法调用的独立性。理解形参的存储位置,有助于深入掌握 JVM 的方法调用机制和内存模型,尤其是在分析栈溢出、调试多线程问题时具有重要意义。

2025-09-02 23:23:14 744

原创 Java的osgi

OSGi 通过强模块化、动态服务和版本管理,为 Java 应用提供了灵活的拆分与协作方案,尤其适合需要长期维护、动态扩展的大型系统。尽管存在学习成本,但在解决 “JAR 地狱”、支持热部署和松耦合服务方面的优势,使其在企业级开发和嵌入式领域仍被广泛采用。理解 OSGi 的核心概念(Bundle、服务注册表、DS)是掌握其用法的关键,而结合具体容器(如 Equinox)的实战练习,能更深入体会其动态模块化的价值。

2025-09-02 23:11:23 853

空空如也

空空如也

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

TA关注的人

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