- 博客(93)
- 收藏
- 关注
原创 缓存的三大问题分析与解决
文章摘要: 本文系统分析了缓存系统中的三大核心问题:缓存穿透、缓存击穿和缓存雪崩。缓存穿透指查询不存在数据导致请求直达数据库,解决方案包括布隆过滤器、空值缓存和参数校验。缓存击穿发生在热点key失效时,应对策略有互斥锁、单飞机制和永不过期设计。缓存雪崩由大规模缓存同时失效引发,可通过TTL随机化、多级缓存和预热机制缓解。文章还补充了缓存一致性问题,建议采用Cache Aside模式结合消息队列实现。针对每个问题,作者提供了检测指标、解决方案和代码示例,兼具理论指导和工程实践价值。
2025-08-11 23:58:35
1069
原创 Redis 数据结构及特点
Redis是一个高性能的键值存储系统,支持多种数据结构。本文详细介绍了Redis的10种核心数据结构及其特点:1)String(字符串)支持简单KV存储;2)List(列表)提供有序的双端队列;3)Hash(哈希表)适合存储对象;4)Set(集合)实现无序不重复集合;5)Sorted Set(有序集合)支持按分数排序;6)Bitmap(位图)用于二进制位操作;7)HyperLogLog提供基数统计;8)Geospatial处理地理位置;9)Stream实现消息队列功能。每种结构在底层实现(如SDS、跳表等)
2025-08-11 23:55:30
921
原创 TCP 如何保证可靠性
摘要: TCP是一种面向连接的可靠传输协议,通过多种机制确保数据有序、不丢失、不重复地传输。核心机制包括:三次握手建立连接,序列号和确认号保证顺序,校验和检测数据完整性,确认应答和超时重传应对丢包,滑动窗口实现流量控制,以及拥塞控制算法优化网络性能。相比UDP,TCP牺牲了部分传输效率,但提供了更高的可靠性,适用于文件传输、网页浏览等场景。其设计确保了在不可靠的IP网络上实现端到端的可靠数据传输。
2025-08-08 00:02:48
920
1
原创 TCP粘包问题详解与解决方案
TCP粘包与拆包问题是由于TCP协议面向字节流的特性导致的,发送方可能合并或拆分数据包,接收方无法区分消息边界。常见原因包括Nagle算法、缓冲区读取不及时等。解决方案包括:固定消息长度、添加分隔符、长度前缀(推荐)、或使用高级协议(如Protobuf)。推荐的长度前缀方法在消息头添加长度字段,接收方先读取长度再获取完整数据。理解并解决粘包问题对网络编程至关重要。
2025-08-07 23:58:44
1032
原创 InnoDB 存储引擎对 MVCC 的实现详解
MVCC(多版本并发控制)是InnoDB实现事务隔离的关键机制,通过隐藏列(DB_TRX_ID、DB_ROLL_PTR)、Undo Log和Read View实现。它允许不加锁的一致性读,提高并发性能。不同隔离级别下Read View的创建时机不同:READ COMMITTED每次SELECT新建,REPEATABLE READ复用事务首次创建的视图。MVCC解决了不可重复读问题,但幻读仍需Next-Key Lock配合。优点包括减少锁竞争,缺点则是Undo Log可能膨胀,需控制长事务。MVCC通过版本链
2025-08-06 23:33:10
948
原创 MySQL 索引下推(Index Condition Pushdown, ICP)笔记
索引下推(ICP)是MySQL 5.6引入的查询优化技术,通过将WHERE条件下推到存储引擎层执行,减少回表次数,提高查询效率。它适用于二级索引的范围查询或复合条件,在存储引擎层提前过滤不符合条件的记录,显著降低I/O消耗。ICP的生效条件包括使用二级索引、条件涉及索引列等,可通过EXPLAIN的"Using index condition"标识判断是否启用。相比传统查询方式,ICP能大幅减少无效回表操作,提升查询性能,但对覆盖索引和主键查询无效。该技术默认开启,是MySQL优化器的重要
2025-08-06 00:24:45
929
原创 MySQL 中 VARCHAR 和 TEXT 的区别
MySQL中的VARCHAR和TEXT类型在存储字符串数据时各有特点。VARCHAR是可变长度字符串,适用于长度可预估的数据(如用户名、标题),最大65535字节,支持索引和默认值。TEXT专为大文本设计(如文章正文),分为4种子类型,最大支持4GB数据,但存储在溢出页中,访问较慢,不支持默认值且索引需指定前缀长度。VARCHAR行内存储性能更高,TEXT适合存储大文本但查询效率较低。实际应用中应根据数据长度和查询需求选择合适类型。
2025-08-05 23:57:07
1133
原创 MySQL 如何优化慢查询
本文介绍了MySQL慢查询优化的核心方法。主要内容包括:慢查询的定义及日志配置方法;优化思路(定位SQL、执行计划分析、SQL改写、索引优化);常见慢查询原因(索引失效、大表扫描等);具体优化技巧(EXPLAIN分析、避免SELECT*、分页优化、索引设计);以及表结构优化和参数调整建议。文章还提供了常用工具和面试高频问答,总结出"减少扫描行数+合理索引+SQL改写"的核心优化原则,为数据库性能调优提供了系统性的解决方案。
2025-08-05 23:53:57
1266
原创 可重复读(Repeatable Read)能解决幻读吗?
MySQL的InnoDB引擎在默认的Repeatable Read隔离级别下,通过MVCC(多版本并发控制)和Next-Key Lock(记录锁+间隙锁)机制有效避免了幻读问题。MVCC确保普通查询基于事务开始时的快照读取,而Next-Key Lock则在对数据进行加锁操作时锁定记录和相邻间隙,防止其他事务插入新行。虽然SQL标准规定Repeatable Read不保证避免幻读,但InnoDB的这一实现使其在保持高性能的同时解决了幻读问题,通常无需使用性能更低的Serializable隔离级别。
2025-08-04 22:06:08
1417
原创 MySQL InnoDB 表数据结构存储方式详解
InnoDB是MySQL默认存储引擎,采用行存储结构,支持事务、行级锁和外键。其数据存储采用B+树索引,分为表空间、段、区、页和行五个层次,页为最小管理单元(16KB)。InnoDB表是索引组织表,数据按主键顺序存储在聚簇索引中,二级索引仅存储索引列和主键值。页结构包含文件头、页头、用户记录等部分,行格式支持COMPACT、DYNAMIC等多种类型。关键特性包括行级锁、事务支持、MVCC机制和缓冲池优化。InnoDB建议显式定义主键以优化存储性能。
2025-08-04 21:17:49
945
原创 CAP 理论笔记
摘要: CAP理论指出分布式系统无法同时满足一致性(C)、可用性(A)和分区容忍性(P)。由于网络分区不可避免,系统只能在C和A之间取舍:CP系统(如ZooKeeper)保证强一致性但牺牲可用性;AP系统(如Redis)优先可用性,采用最终一致性。单机数据库(如MySQL)属于CA系统,但不适用于分布式环境。实际工程中常通过BASE理论(基本可用、最终一致性)实现AP方案。CAP理论为分布式系统设计提供了关键权衡框架。
2025-08-03 23:50:07
1172
原创 MySQL 事务原理 + ACID笔记
MySQL事务的核心是保证ACID特性(原子性、一致性、隔离性、持久性)。原子性通过Undo Log实现,记录修改前的数据用于回滚;一致性由完整性约束和事务控制共同保证;隔离性通过MVCC和锁机制实现,不同隔离级别解决脏读、不可重复读和幻读问题;持久性依赖Redo Log和WAL机制确保数据不丢失。事务执行流程包括生成Undo Log、修改Buffer Pool、写Redo Log和binlog等步骤。Redo Log用于崩溃恢复,binlog用于主从复制,二者通过两阶段提交保证数据一致性。
2025-08-03 23:19:03
966
原创 MySQL 索引失效的场景与原因
MySQL索引失效的常见场景包括:1)使用左模糊或全模糊匹配(LIKE '%abc'),因B+树无法定位前缀;2)对索引列使用函数或表达式计算,破坏原始值匹配;3)隐式类型转换导致列被函数处理;4)联合索引未遵循最左匹配原则;5)OR条件包含非索引字段。解决方法包括使用右模糊匹配、避免列运算、保持类型一致、遵循索引顺序、改用UNION等。理解这些失效机制有助于优化SQL查询性能,避免全表扫描。
2025-08-03 23:04:18
1380
原创 线程崩溃是否导致进程崩溃
文章摘要: 栈溢出不会影响其他进程,因为每个进程拥有独立的虚拟地址空间,越界访问会被操作系统隔离。线程崩溃是否导致进程崩溃需分情况:Java子线程未捕获异常仅终止自身;主线程异常可能引发JVM退出;C/C++线程段错误或调用exit()会终止整个进程,而pthread_exit()不影响其他线程。线程破坏共享资源可能间接导致进程不稳定。建议通过异常处理器(如Java的UncaughtExceptionHandler)增强多线程健壮性。栈溢出和线程崩溃的影响范围取决于异常类型和系统处理机制。
2025-07-29 22:49:48
1309
原创 对象的创建过程
Java对象创建过程主要分为五个步骤:首先检查类是否已加载,未加载则触发类加载过程;接着在堆中分配内存,根据堆规整性选择指针碰撞或空闲列表方式;然后将实例字段初始化为零值;随后设置对象头,包含类元数据、哈希码等信息;最后执行构造方法完成初始化。整个过程涉及JVM底层机制,内存分配方式与GC算法相关,且需要考虑线程安全问题。
2025-07-29 22:29:56
934
原创 JVM 内存共享区域详解
本文系统介绍了JVM内存结构,重点分析了共享内存区域。JVM内存分为线程共享和非共享区域,共享区域包括堆(存储对象实例)、方法区(存储类信息、静态变量等)、运行时常量池和字符串常量池。其中,JDK 1.8将方法区实现由永久代改为元空间,字符串常量池也从永久代迁移到堆中。非共享区域包括程序计数器、虚拟机栈和本地方法栈。文章还对比了各区域特点,并总结了面试常见考点,如内存结构变化、直接内存使用等。
2025-07-28 23:29:06
1367
原创 JVM 笔记:类加载、内存管理、垃圾收集与垃圾收集器
Java虚拟机(JVM)是Java跨平台能力的核心,通过类加载、内存管理、垃圾回收和字节码执行引擎实现高效运行。类加载机制分为加载、连接(验证、准备、解析)和初始化阶段,由Bootstrap、Extension和Application三类加载器协作完成。内存划分为堆(分新生代、老年代)、方法区、虚拟机栈等,堆是GC主要区域。垃圾回收算法包括标记-清除(老年代)、复制(新生代)、标记-整理及分代收集,不同场景适用不同算法(如CMS低延迟但碎片多,G1平衡吞吐与延迟,ZGC支持超大堆超低延迟)。面试常考
2025-07-28 23:08:16
1018
原创 后端项目中大量 SQL 执行的性能优化
摘要: 针对后端项目150个扫描器执行约1000条SQL时因千万级数据量导致的性能瓶颈,提出多维度优化方案: 数据库层面:优化索引(复合/覆盖索引)、减少查询范围、调整缓存与连接池; 查询优化:拆分复杂SQL、批量查询、避免子查询; 架构改进:引入并发扫描、异步任务、数据分片及分布式数据库; 缓存策略:利用Redis缓存高频结果,降低数据库压力; 监控与动态调整:分析慢查询日志,动态调节扫描器数量与任务拆分。 综合运用可显著提升系统响应速度。
2025-07-25 21:27:44
1093
原创 lock 和 synchronized 区别
本文对比了Java中两种线程同步机制:synchronized关键字和Lock接口。synchronized是内置关键字,使用简单但功能有限,自动加锁/解锁,不支持中断和公平锁。Lock是显式接口,提供更灵活的锁控制,支持中断、超时、公平锁及读写锁等特性,但需手动释放锁。synchronized适合简单同步场景,而Lock适用于高并发和复杂控制需求。开发者应根据具体场景选择合适的同步工具,以优化性能和可维护性。
2025-07-25 20:53:35
1323
原创 解决qq好友发送过来的文件未下载,过期了如何恢复
QQ文件过期或丢失时,可通过以下方法恢复:1.直接联系发送者重新发送文件;2.检查聊天记录或云备份;3.在设备本地或QQ文件管理中查找;4.通过QQ云文件功能恢复;5.使用收藏、下载或转发等操作尝试获取(特别是小于100MB的文件)。若文件不可直接操作,可尝试在聊天框多选文件后重新尝试下载或转发。
2025-07-25 16:16:52
4891
原创 Java 并发容器:ConcurrentHashMap 笔记(JDK 1.8)
ConcurrentHashMap是Java中线程安全的高效哈希表实现,采用锁分离+CAS+红黑树优化方案。JDK1.8版本摒弃了1.7的分段锁设计,改用数组+CAS+synchronized+红黑树结构,通过细粒度的桶位节点锁提升并发性能。核心机制包括:无锁读操作、CAS乐观锁插入、synchronized锁冲突节点、多线程协作扩容等。相比HashMap和Hashtable,它具备更高的并发安全性,但不支持null键值。其优化特性包括红黑树转换、弱一致性遍历和多线程扩容,特别适合高并发场景下的共享数据访问
2025-07-24 17:33:29
1202
原创 Hashtable 与 HashMap 的区别,以及为何 Hashtable 已经过时
本文对比了Java中Hashtable和HashMap的主要区别,分析了Hashtable过时的原因。Hashtable作为早期线程安全实现,采用粗粒度锁导致性能低下,不支持null键值,且使用过时的Enumeration遍历方式。相比之下,HashMap功能更全面、灵活性更高,在多线程场景下推荐使用ConcurrentHashMap。官方已明确建议用HashMap(非并发场景)和ConcurrentHashMap(并发场景)替代Hashtable,新项目应避免使用这一过时类。
2025-07-24 11:22:39
528
原创 Java 抽象类 vs 接口(Abstract Class vs Interface)对比笔记
抽象类与接口是Java中两种抽象机制。抽象类用于定义通用父类(abstract class),支持继承(extends)、含构造器和成员变量,但仅支持单继承;接口(interface)定义行为规范,通过implements实现,支持多继承,仅含常量及抽象/默认方法(Java 8+)。核心区别:抽象类强调“是什么”(is-a),接口聚焦“能做什么”(can-do)。选择依据:需代码复用选抽象类,需多态扩展选接口。现代接口还支持default/static方法(如日志工具),增强灵活性。实际开发中可组合
2025-07-23 14:41:25
602
原创 Java 中 == 与 equals()的区别笔记
Java中==和equals()的区别: ==是运算符,比较基本类型的值或引用类型的地址; equals()是Object类方法,默认比较对象地址,但可被重写(如String类重写为比较内容)。 使用时建议: 判断对象内容是否相等用equals(); 判断是否为同一对象引用用==; 注意字符串常量池和堆对象的地址差异。 核心区别在于==比较内存地址,equals()可根据需求自定义比较逻辑。
2025-07-23 11:29:51
570
原创 Elasticsearch 学习笔记
Elasticsearch是一个基于Lucene的分布式开源搜索引擎,支持全文检索、结构化查询和聚合分析。它采用RESTful API,核心概念包括集群、节点、索引、文档等。文章介绍了Elasticsearch的安装部署、索引/文档操作、查询语法(Query DSL)、聚合分析等核心功能,并提供了性能优化建议和常用命令速查表。作为ELK技术栈的核心组件,Elasticsearch广泛应用于日志分析、电商搜索、实时数据分析等场景。
2025-07-22 21:47:36
680
1
原创 了解类加载器吗?类加载器的类型有哪些?
类加载器(ClassLoader)是JVM的核心组件,负责将.class文件加载到内存并生成Class对象。JVM内置三类加载器:Bootstrap(核心类库)、Extension(扩展类)、Application(应用类),支持自定义类加载器。类加载采用双亲委派机制,优先委派父加载器处理,确保核心类安全并避免重复加载。自定义类加载器通过继承ClassLoader实现,常用于热部署、插件系统等场景。线程上下文类加载器(如SPI)可突破双亲委派限制。理解类加载机制对Java模块化开发和安全部署至关重要。
2025-07-21 23:01:29
1505
原创 JVM 类加载过程笔记
JVM类加载过程详解:从字节码到可执行对象 摘要:JVM类加载是将.class文件转换为可执行对象的过程,分为加载、验证、准备、解析和初始化五个核心阶段。加载阶段读取字节码并生成Class对象;验证确保代码安全性;准备分配静态变量内存;解析转换符号引用;初始化执行静态代码块。JVM采用双亲委派模型,通过启动类加载器、扩展类加载器和应用类加载器实现层次化加载。类卸载需满足Class对象和类加载器均无引用条件。该机制保证了Java程序的安全性和灵活性,支持动态扩展和自定义加载逻辑。
2025-07-21 22:01:57
1257
原创 Java 创建线程的方式笔记
Java创建线程主要有四种方式:继承Thread类(简单但耦合度高)、实现Runnable接口(任务与线程分离,推荐)、实现Callable接口(支持返回值和异常)、使用线程池(资源复用,生产环境首选)。线程池是最佳实践,支持任务调度、资源控制和拒绝策略。推荐使用ThreadPoolExecutor构造线程池,避免直接new Thread()。对于定时任务可用ScheduledExecutorService。此外,Callable+Future适合需要获取结果的异步任务,而Java8+的Lambda可以简化
2025-07-20 16:54:32
876
原创 乐观锁实现原理笔记
乐观锁是一种高并发环境下的并发控制策略,通过版本号或时间戳实现无锁并发访问。它假设冲突概率低,仅在更新时检查数据是否被修改,适合读多写少场景。实现方式包括SQL版本号校验和ORM框架集成,需配合重试机制处理冲突。相比悲观锁,乐观锁性能更高但需手动处理数据一致性,适用于秒杀、配置更新等低冲突业务,不适用于高并发写入场景。分布式系统中可结合Redis、ZooKeeper等实现跨节点乐观控制。
2025-07-20 16:49:22
1102
原创 Apache Kafka 学习笔记
Kafka是一个高吞吐、分布式的消息发布-订阅系统,具备持久化、高可用等特性。其核心架构包含Producer、Broker、Consumer等组件,采用Topic和Partition机制实现并行处理。文章详细介绍了Kafka的生产消费原理、存储机制、高可用设计及性能优化方法,包括分区副本、ISR同步等机制,并提供了常用命令和实践指南,如消息丢失/重复处理、与其他组件整合等。Kafka广泛应用于日志处理、实时分析等场景,是构建分布式系统的关键组件。
2025-07-19 20:51:42
1405
原创 Redis 如何保证高并发与高可用
Redis通过单线程模型结合I/O多路复用、高效数据结构实现高并发处理能力,利用主从复制、哨兵机制和Cluster集群确保高可用性。其内存操作特性与可选持久化机制(RDB/AOF)保障了性能与数据安全。最佳实践建议采用集群部署、开启持久化、配置哨兵监控,并通过Pipeline优化、冷热数据分离等措施提升系统稳定性。Redis以独特架构实现了高并发读写与自动故障转移,成为分布式场景下的高效缓存解决方案。
2025-07-19 20:42:27
1241
原创 ThreadLocal 在 Spring 与数据库交互中的应用笔记
ThreadLocal是Java提供的线程本地存储工具,在Spring事务管理中发挥关键作用。它通过线程隔离机制确保同一线程内的数据库操作共享一个连接,支持事务一致性和传播机制。Spring利用ThreadLocal缓存连接对象、跟踪事务状态,并通过TransactionSynchronizationManager进行资源绑定。使用时需注意内存泄漏风险,避免跨线程使用连接。该机制实现了连接池与Spring事务的高效协同,保证事务上下文的线程安全性。核心价值在于:线程级连接共享、事务状态管理和资源生命周期控制
2025-07-18 20:36:28
1067
原创 RPC 与 Feign 的区别笔记
RPC与Feign技术对比摘要: RPC(如gRPC、Dubbo)采用二进制协议实现高效远程调用,适合高性能场景;Feign是Spring Cloud封装的声明式HTTP客户端,基于RESTful风格,开发便捷但性能中等。核心差异:RPC通过TCP长连接传输,支持多语言但调试复杂;Feign基于HTTP/JSON,易集成易调试。选型建议:内部高性能通信选RPC,常规微服务调用优先Feign。二者在Spring Cloud生态中可互补,Feign处理服务间HTTP调用,RPC用于特定高并发场景。
2025-07-18 20:31:37
1554
原创 HTTP 状态码笔记
HTTP状态码是服务器对请求响应的三位数字代码,分为五类:1xx(信息性)、2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误)。常见状态码包括200(成功)、301/302(重定向)、400(请求错误)、404(资源不存在)、500(服务器错误)等。状态码通过响应首部返回,如"HTTP/1.1 200 OK"。不同状态码对应不同场景,如201表示资源创建成功,304表示使用缓存内容。开发者可通过状态码快速定位问题,MDN文档和RFC规范提供了更详细的参考信息。
2025-07-17 20:56:13
1366
原创 访问网页的全过程笔记
本文详细介绍了从浏览器输入URL到页面渲染完成的完整流程。首先解析URL并查询DNS获取IP地址,通过TCP三次握手建立连接。HTTPS需额外进行TLS握手确保安全通信。浏览器发送HTTP请求后,服务器处理并返回响应数据,最终由浏览器解析HTML/CSS构建DOM树和渲染树完成页面展示。整个过程涉及DNS解析、TCP连接、TLS握手、HTTP通信、资源加载和页面渲染等多个环节,并可通过DNS预解析、HTTP/2多路复用等技术优化性能。
2025-07-17 20:48:21
938
原创 TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记
TCP慢启动机制是拥塞控制的核心算法之一,通过逐步探测网络带宽来防止初始阶段发送过快导致拥塞。其工作原理是:初始拥塞窗口(cwnd)设为1MSS,每收到一个ACK确认就增加1MSS,使窗口在每RTT周期内呈指数增长。当cwnd达到慢启动阈值(ssthresh)后,转为线性增长的拥塞避免阶段。若发生丢包,cwnd会重置为1并重新慢启动。该机制能快速利用可用带宽,同时通过动态调整ssthresh来避免网络拥塞,实现高效的网络资源利用。
2025-07-16 21:45:27
1705
原创 TCP 三次握手与四次挥手笔记
TCP连接通过三次握手建立(SYN→SYN+ACK→ACK),确保双方收发能力正常并同步序列号,防止历史连接干扰。断开连接采用四次挥手(FIN→ACK→FIN→ACK),因全双工特性需双方独立关闭各自通道,TIME_WAIT状态保证最终ACK可靠到达。三次握手解决失效请求问题,四次挥手确保数据完整传输,TIME_WAIT避免延迟包干扰新连接,是TCP可靠传输的核心机制。
2025-07-16 21:40:50
1139
原创 操作系统笔记:进程调度(Process Scheduling)
进程调度是操作系统核心功能,负责在多进程环境中合理分配CPU资源。主要包括长程、中程和短程三类调度,其中短程调度(CPU调度)最为关键。常见调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)和优先级调度等,各有优缺点。多级反馈队列(MFQ)因兼具公平性和适应性成为实际常用方案。调度性能指标包括周转时间、响应时间等。面试常考察调度原理、算法比较及实际系统应用(如Linux的CFS)。理解不同调度策略的适用场景是核心要点。
2025-07-15 21:10:54
1637
原创 I/O 多路复用详解笔记
I/O多路复用是一种让单线程同时监听多个I/O描述符的技术,适用于高并发服务器场景。主要有三种实现方式:select(效率低,有连接数限制)、poll(无连接数限制但效率仍不高)、epoll(Linux特有,高效支持大规模连接)。epoll采用事件驱动机制,提供水平触发(LT)和边缘触发(ET)两种模式,其中ET模式性能更高但需配合非阻塞I/O。相比select/poll,epoll通过内核维护数据结构,减少遍历开销,显著提升性能。该技术广泛应用于网络服务器、事件驱动编程等场景,是高性能服务开发的核心技术。
2025-07-15 20:59:33
869
原创 Spring的`@Value`注解使用详细说明
Spring的@Value注解主要用于从外部配置文件(如application.properties)或表达式注入属性值到Bean中。它支持注入常量、默认值、SpEL表达式结果、集合类型及复杂数据结构。通过${}引用配置文件属性,#{}使用SpEL表达式,还可注入方法参数和构造函数参数。该注解简化了配置管理,支持灵活的动态值注入,是Spring应用开发中处理外部配置的重要工具。
2025-07-14 22:04:08
871
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅