自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面试常见算法

示例:nums=[1,2,3,4,5], k=2 → 反转全数组 [5,4,3,2,1] → 反转前 2 个 [4,5,3,2,1] → 反转后 3 个 [4,5,1,2,3](结果)。若两链表相交,两指针会在相交节点相遇;核心定义:将数组元素按指定方向(左 / 右)、指定步数移动,溢出元素补到数组另一端(如右旋转 1 步:[1,2,3,4]→[4,1,2,3])。:按从大到小排序(10→5→1),保证枚举顺序一致,避免重复组合(如先选 10 分再选 5 分,不会出现先 5 分后 10 分的重复情况);

2025-12-11 00:27:28 873

原创 常见面试题

线程池配置首个任务是否初始化核心线程核心逻辑默认(未预热)是懒加载,首个任务触发。

2025-12-11 00:16:10 923

原创 RocketMQ面试题

消息队列消费机制由消费者分组和消息路由规则决定。单机消费时,消息被分配给组内特定实例处理;多机消费则需不同消费者组订阅同一主题。RocketMQ通过专属重试队列实现自动消息重试,采用指数退避延迟策略,最终无法处理的消息转入死信队列。ACK机制通过消费端明确反馈消息状态,确保消息正确处理或重试。整体设计兼顾消息可靠性和消费者负载均衡。

2025-11-19 00:11:37 430

原创 【P0】JVM面试篇

本文介绍了JVM类加载的核心机制。类加载采用按需方式,生命周期包含加载、验证、准备、解析、初始化、使用和卸载7个阶段。重点讲解了类初始化的过程(执行静态代码块和静态变量赋值)与父子类初始化顺序(父类优先、静态优先)。JVM类加载器采用三层架构:启动类加载器(核心库)、扩展类加载器(ext目录)和应用程序类加载器(用户类路径),通过双亲委派模型实现层级加载机制,确保基础类的唯一性和安全性。双亲委派模型要求加载请求先委派父类处理,父类无法完成时再由子类加载器处理。

2025-11-17 01:06:58 1032

原创 【P0】AQS & Atomic & ThreadLocal篇

AQS(AbstractQueuedSynchronizer)是Java并发包中的核心同步框架,通过FIFO队列和原子状态管理实现高效线程同步。它采用CLH队列保证线程有序获取资源,支持独占和共享两种模式。AQS封装了底层同步逻辑,开发者只需继承并重写关键方法即可实现ReentrantLock、Semaphore等同步工具。其核心包括volatile状态变量、CAS操作和队列管理机制,能有效处理高并发场景下的线程竞争问题。ReentrantLock等工具类通过AQS实现了公平/非公平锁等特性,大幅简化了并发

2025-11-17 01:04:30 809

原创 【P0】Java 锁篇-精炼

本文摘要: Java中的读写锁技术通过ReentrantReadWriteLock实现了读/写操作的分离控制。其主要特性包括:读锁(共享锁)允许多线程并发读取,写锁(排他锁)保证写操作的原子性,特别适合读多写少的场景。与普通互斥锁相比,它能显著提升系统吞吐量。该锁支持公平/非公平模式、可重入特性、锁降级(写锁转为读锁)和中断获取,但不支持锁升级。内存设计确保数据一致性,且仅写锁提供Condition支持。典型应用包括缓存查询等并发读取需求高的场景。

2025-11-17 00:12:04 998

原创 【P0】动静态代理篇

模式类型:结构型设计模式核心思想:通过代理对象控制对原始对象的访问主要用途:实现功能增强(如日志记录、事务管理)进行权限控制Java 中常见实现方式:静态代理JDK 动态代理CGLIB 代理Javassist 代理核心定义程序运行期间,通过 Java 反射机制和类动态生成代理类字节码的技术,无需手动编写代理类.核心特点基于接口实现代理,代理关系在运行时动态建立,无需在编译期确定具体代理类。JDK 动态代理是 Java 标准库提供的动态代理机制,位于important;

2025-11-13 01:33:42 711

原创 【P0】Java基础篇

Java语言具有简单易学、面向对象、平台无关、内置多线程、高可靠性等特点,通过JVM实现跨平台运行。JVM是运行字节码的虚拟机,而JDK(开发工具包)和JRE(运行环境)分别面向开发者和普通用户。字节码是JVM可执行的中间代码,解决了传统解释型语言效率低的问题,同时保持可移植性。Java程序通过JIT编译器将热点代码转换为机器码以提高性能,结合解释执行和编译执行,实现高效跨平台运行。HotSpot采用惰性评估策略,仅对热点代码进行JIT编译优化。

2025-11-10 01:36:50 1161

原创 【P0】Java 锁篇

乐观锁是一种基于"读多写少"假设的并发控制机制,通过版本号或CAS(比较并交换)实现数据一致性。其核心特点是不阻塞读操作,仅在写操作时验证数据未被修改。主要实现方式包括Java的原子变量CAS操作和数据库的版本号控制,通过比较原始值与当前值来确保更新原子性。优点在于降低锁开销,提高并发性能;但存在ABA问题(值被多次修改后恢复原值导致误判)。适用于读多写少场景,如计数器、库存管理等业务场景。

2025-11-10 01:32:37 581

原创 分布式事务篇

事务是确保数据操作完整性的关键机制,具备ACID四大特性:原子性、一致性、隔离性和持久性。分布式事务在此基础上需要协调跨节点操作,常用2PC、3PC等协议保障一致性。根据CAP理论,分布式系统只能满足其中两个特性,实际应用中需权衡选择:CA系统适合非分布式场景,CP系统优先保障一致性,而AP系统则侧重可用性。不同业务场景应根据需求选择强一致性或最终一致性方案,平衡性能与数据准确性。

2025-11-10 00:37:01 859

原创 Redis 网络优化篇

Redis提供多层级内存回收机制,包括过期键删除(惰性+定期)、内存淘汰(LRU/LFU等策略)、内存碎片整理(4.0+版本支持自动合并碎片)、键主动清理(DEL/UNLINK命令)和临时内存释放(操作完成自动回收)。通过过期检查、内存超限兜底、碎片优化、主动删除和临时资源回收的协同机制,实现内存高效利用。其中碎片整理通过阈值触发后台处理,保障服务稳定性;内存淘汰提供多种策略应对不同场景;临时内存释放确保非持久化数据及时回收。

2025-11-09 16:22:52 902

原创 TCP 篇

TCP协议是面向连接的可靠传输层协议,通过序列号解决乱序问题,确认应答号解决丢包问题,控制位管理连接状态。相比不可靠的IP层,TCP确保数据无损坏、无间隔、非冗余且有序传输。TCP连接由Socket、序列号和窗口大小唯一确定,通过四元组(源/目的地址和端口)标识。虽然理论上TCP连接数可达2⁴⁸,但实际受文件描述符和内存限制影响。TCP提供一对一可靠通信,基于字节流传输,需建立连接(三次握手)和断开连接(四次挥手)。

2025-10-23 00:09:58 750

原创 HTTP1.0 VS HTTP_N

摘要:HTTP/1.1相比HTTP/1.0在性能上进行了多项优化,包括长连接(Keep-Alive)减少连接开销、缓存机制改进(Cache-Control/ETag)、管道传输提高并发性以及强制Host头支持虚拟主机。然而仍存在队头阻塞、TCP连接数限制、头部冗余等问题。与HTTP/2.0相比,HTTP/1.1缺乏二进制分帧、多路复用和头部压缩等关键特性。三个版本的核心差异体现在连接方式(短/长连接)和优化重点(如HTTP/2.0的服务器推送),其中HTTP/1.1状态码从HTTP/1.0的16种扩展至40

2025-10-23 00:09:00 821

原创 HTTP & HTTPS

HTTP与HTTPS核心区别在于安全性:HTTP明文传输存在风险,HTTPS通过SSL/TLS实现加密传输。HTTPS建立连接需完成TCP握手和SSL/TLS握手(含证书校验、非对称加密传密钥、对称加密传数据),默认使用443端口。HTTP是无状态协议,通过Host字段支持同一服务器托管多网站,Content-Length字段解决TCP粘包问题,Connection字段支持长连接复用。HTTP作为超文本传输协议,规范了浏览器与服务器间的交互行为。

2025-10-23 00:08:22 1282

原创 【P0】Spring Cloud 面试篇

Spring Cloud微服务架构解析 摘要:Spring Cloud是基于Spring Boot的分布式微服务开发工具框架,通过模块化提供配置管理、服务发现、负载均衡等核心功能。它采用Eureka作为服务注册中心,Zuul实现网关路由,Ribbonuy提供负载均衡,Hystrix实现熔断保护。相比Dubbo,Spring Cloud采用Restful API通信,生态更完整。主要优势包括低耦合开发、简化配置、技术异构支持,但也面临部署复杂、数据一致性等挑战。关键架构思想是将单体应用拆分为独立运行的微服务,

2025-10-03 00:07:31 830

原创 【P0】SpringBoot面试篇

本文摘要了Spring框架相关核心知识点: SpringBoot:简化Spring开发的工具,提供自动配置、起步依赖等特性,提升开发效率。 @PostConstruct:Java原生注解,用于Bean初始化回调,执行顺序在依赖注入后、Bean可用前。 SpringAOP通知:包括5种Advice类型及其执行顺序,环绕通知可控制方法执行流程。 Bean注册流程:容器初始化→注册处理器→扫描Bean→刷新容器完成初始化。 循环依赖解决:通过三级缓存机制(未初始化Bean、工厂、完整Bean)实现单例Bean的循

2025-10-03 00:06:51 807

原创 【P0】Spring 面试篇

Spring是一个轻量级的Java企业级开发框架,提供一站式解决方案,通过IOC(控制反转)和AOP(面向切面编程)两大核心技术简化开发流程。IOC容器管理对象生命周期,实现依赖解耦;AOP模块抽取跨类共性功能,减少代码冗余。Spring具有模块化设计、声明式事务、兼容性强等优点,但也存在配置复杂、学习成本高等不足。作为Java企业级开发的"事实标准",Spring有效降低了开发复杂性,提升系统灵活性和维护性。

2025-10-03 00:06:09 478

原创 【P0】Java面试篇

本文介绍了Java编程基础中的核心概念,包括面向对象编程特点、JDK/JRE/JVM区别、==与equals方法的比较以及hashCode原理。面向对象通过封装、继承和多态三大特性实现代码复用与扩展;JDK是开发工具包,JRE提供运行环境,JVM执行字节码;==比较内存地址,equals比较对象内容;hashCode用于哈希表快速定位,与equals方法需保持逻辑一致。这些基础概念是掌握Java编程的关键。

2025-09-24 01:44:56 324

原创 【P0】动静态代理篇

代理模式是一种结构型设计模式,通过代理对象控制对原始对象的访问,主要用于功能增强和权限控制。Java中实现方式包括静态代理和动态代理(JDK、CGLIB等)。静态代理手动创建代理类,实现简单但维护成本高;动态代理运行时生成字节码,灵活性更强但性能略低。静态代理适用于接口稳定、性能敏感的场景,而动态代理更适合需要灵活扩展的复杂系统。两种方式各有利弊,应根据具体需求选择。

2025-09-24 01:43:29 1077

原创 【P0】设计模式篇

设计模式七大原则是构建高质量代码的基石,包括开闭原则(OCP)、单一职责原则、接口隔离原则、里氏替换原则、依赖倒置原则、迪米特法则和合成复用原则。这些原则旨在实现程序的高重用性、可读性、扩展性、可靠性和低耦合高内聚。单一职责原则要求每个类/接口/方法只承担一项职责,通过职责分离降低复杂度、提升可维护性,同时减少变更风险。例如将日志服务与用户服务分离,使系统更灵活稳定。遵循这些原则能有效解决软件开发中的耦合性和维护性问题。

2025-09-24 01:42:42 1028

原创 【P0】线程池篇

线程池通过控制线程数量与任务队列调度实现高效任务执行。核心价值在于复用线程、降低资源开销,提升响应速度,并提供统一管理机制。Java的Executor框架作为线程池实现方案,提供任务组件(Runnable/Callable)、执行组件(Executor)和结果组件(Future),解决了传统Thread.start()的线程管理难题,避免this逃逸等问题,支持更高效可靠的并发编程。线程池适用于需要处理大量短期异步任务的场景,能有效控制系统资源消耗。

2025-09-24 01:40:56 598

原创 【P0】JUC 篇

Java并发编程核心工具包JUC(Java Util Concurrent)提供了简化多线程编程的解决方案。JUC通过线程池、并发集合、原子变量和同步器等组件,实现了高效、安全的并发控制,降低了开发复杂度。线程是进程内的最小执行单位,共享进程资源但拥有独立执行上下文,相比进程更轻量高效。进程则是操作系统资源分配的基本单位,拥有独立内存空间。JUC通过封装底层并发逻辑,帮助开发者无需深入细节即可构建高性能多线程应用。

2025-09-24 01:37:19 1222

原创 Redis 数据类型篇

Redis采用哈希表作为核心存储结构,通过四层架构实现高效键值存取:最上层redisDb封装数据库,dict结构管理两个哈希表(主表用于常规存储,副表用于rehash)。底层dictht存储哈希桶数组,每个dictEntry节点包含指向键值对象的指针。键值对象采用redisObject统一表示,通过type、encoding和ptr字段区分数据类型和底层结构。String类型使用SDS(动态字符串)实现,支持二进制数据,通过len字段实现O(1)复杂度获取长度,避免缓冲区溢出。这种分层设计结合哈希表O(1)

2025-09-23 00:53:15 654

原创 Redis 功能篇

Redis提供了多种过期时间设置方式,包括秒级/毫秒级的expire/pexpire命令和时间戳方式的expireat/pexpireat命令。通过过期字典(expires dict)实现key过期管理,判断key是否过期时先检查过期字典,再比对当前时间。Redis采用三种过期删除策略:定时删除(精确但消耗CPU)、惰性删除(访问时检查节省CPU但可能内存泄漏)和定期删除(折中方案,定期随机检查删除)。实际使用中可以根据业务需求选择合适的策略组合。

2025-09-23 00:49:58 846

原创 Redis 高可用篇

Redis主从复制通过主服务器同步数据到从服务器,解决单点故障和数据一致性问题。第一次同步分为三个阶段:首先建立连接并协商同步方式(全量复制);然后主服务器生成RDB文件发送给从服务器,从服务器清空旧数据后加载RDB;最后主服务器将同步期间的写操作通过replication buffer发送给从服务器,确保最终数据一致。整个过程通过replicaof命令触发,实现读写分离,提升系统可用性。

2025-09-23 00:45:29 1365

原创 Redis 缓存篇

缓存雪崩、击穿和穿透是Redis缓存系统的三大常见问题。缓存雪崩指大量缓存同时失效或Redis宕机,导致请求直接冲击数据库;缓存击穿是热点key失效引发大量并发请求;缓存穿透则是查询不存在的数据,绕过缓存直达数据库。解决方案包括:均匀设置过期时间、互斥锁、双key策略、后台更新缓存、服务熔断限流,以及构建高可用Redis集群。这些方法通过分散失效时间、控制并发访问、保障缓存可用性等方式,有效保护数据库并提升系统稳定性。

2025-09-23 00:42:26 1272

原创 Redis 面试篇

Redis是一款开源的高性能内存数据库,支持多种数据结构(String、Hash、List等)和原子性操作。其核心特性包括:内存级读写带来极高性能;支持RDB/AOF两种持久化方式;提供主从复制、哨兵和集群模式保障高可用性。相比Memcached,Redis支持更丰富的数据类型、持久化和集群功能,并能实现消息队列、分布式锁等扩展场景。Redis常作为MySQL缓存,通过内存操作和单线程原子性处理,有效解决数据库高并发访问压力,显著提升系统响应速度。

2025-09-23 00:40:42 732

原创 MySQL-慢SQL优化?

SQL性能优化指南 摘要: 本文分析了SQL变慢的常见原因,包括临时性缓慢(如脏页刷新、锁竞争)和持续性缓慢(如索引失效、全表扫描)。提供了全面的SQL优化方案:1)索引优化,遵循最左匹配原则,避免失效;2)SQL语句优化,如分页查询改写;3)数据库结构优化,如表拆分;4)利用优化器特性如MRR。还介绍了慢查询日志配置和分析方法,通过EXPLAIN分析执行计划关键指标(type、key等)。特别指出写多读少场景下普通索引的优势,以及索引区分度对查询性能的影响。

2025-09-22 01:02:49 831

原创 MySQL 锁篇

MySQL锁机制主要包括全局锁、共享锁(S锁)和排他锁(X锁)。全局锁通过flush tables with read lock实现全库只读,主要用于备份但会阻塞业务;可通过事务隔离级别和MVCC特性实现无锁备份。共享锁允许多事务并发读,排他锁则独占数据,禁止其他事务读写。InnoDB中锁的行为与索引密切相关,无索引查询会升级为表锁,行锁则依赖索引键。实际应用中需注意锁冲突规则,如UPDATE/DELETE自动加X锁,SELECT需显式加锁。合理使用这些锁机制能有效解决并发问题。

2025-09-22 01:02:13 1105

原创 MySQL 索引篇

摘要:索引是用于快速查询数据的特殊数据结构,采用"空间换时间"策略提升检索效率。InnoDB默认使用B+Tree索引,其非叶子节点存储索引信息,叶子节点存储实际数据并形成双向链表。索引按数据结构可分为B+Tree、Hash、Full-text等;按物理存储可分为聚簇索引和二级索引;按字段特性可分为主键、唯一、普通索引等。创建索引需权衡查询效率与存储开销,避免在低区分度字段或频繁更新的列上创建索引。索引失效常见于使用函数、类型转换、模糊查询等情况。优化方法包括覆盖索引、前缀索引和联合索引等

2025-09-22 00:59:33 1143

原创 MySQL 事务篇

事务隔离级别通过ACID特性保障数据一致性,其中InnoDB引擎通过redo log实现持久性、undo log实现原子性、MVCC/锁机制实现隔离性。并发事务可能引发脏读(读取未提交数据)、不可重复读(同一事务内多次读取结果不同)和幻读(查询记录数量不一致)问题。MySQL通过设置不同隔离级别(如读未提交、读已提交、可重复读、串行化)来规避这些问题,其中可重复读通过MVCC机制有效解决脏读和不可重复读,而幻读需通过间隙锁等特殊机制处理。

2025-09-22 00:57:47 621

原创 MySQL 日志篇

UPDATE语句执行过程及日志机制解析 UPDATE语句执行包含6个基础流程:连接验证、跳过查询缓存、语法解析、语义校验、优化执行计划、执行更新操作。核心差异在于更新操作需联动三大日志系统: undo log:记录旧数据,支持事务回滚和MVCC,保障原子性 redo log:记录新数据,确保故障恢复时的持久性 binlog:记录操作逻辑,用于数据备份和主从同步 隐式事务机制:增删改操作自动开启事务,通过undo log实现崩溃回滚。不同操作记录不同内容: INSERT记录主键 DELETE记录完整行 UPD

2025-09-22 00:56:34 813

原创 MySQL 内存篇

MySQL 通过 Buffer Pool 机制提升性能:在内存中缓存磁盘数据(包括索引页、数据页等),减少磁盘 I/O。采用 Free 链表管理空闲页,Flush 链表追踪脏页异步刷盘,并通过 LRU 算法优化缓存命中率。建议 Buffer Pool 大小设为服务器可用内存的 60%-80%,以最大化性能。

2025-09-22 00:55:39 989

原创 MySQL 面试题

MySQL存储引擎对比 InnoDB支持事务、行锁、外键和崩溃恢复,适合高并发写入场景;MyISAM仅支持表锁,无事务但读写快,适合读多写少场景。 SQL性能优化 通过EXPLAIN分析索引使用情况,未使用索引可能因类型不匹配、LIKE以%开头或数据量小。优化包括合理建索引、避免SELECT *、分表分库等。 锁与事务机制 InnoDB行锁在写操作时触发,表锁在无索引条件时触发。避免死锁需固定访问顺序、缩短事务时间,MySQL会自动检测并回滚死锁事务。 日志与复制 binlog用于主从复制,redo log

2025-09-22 00:54:47 936

原创 MySQL 集群篇

本文系统梳理了MySQL主从架构、读写分离及集群相关知识点。主从复制通过binlog实现异步/半同步数据同步,提供多种故障排查方法;读写分离通过路由规则分散负载,需解决主从延迟问题;集群方案包括MGR高可用和分库分表策略,需关注一致性、性能监控等指标。核心涵盖:主从复制原理与优化、读写分离实现方案、集群高可用设计及监控要点。

2025-09-22 00:54:02 765

原创 MySQL 基础篇

NULL 值的存储:Compact 行格式通过NULL 值列表标记 NULL 列,NULL 值不存于真实数据区;NULL 值列表占 1 字节(允许 NULL 字段时),若所有字段设为,则无此列表,节省 1 字节空间。varchar (n) 实际数据大小的获取:借助变长字段长度列表存储变长字段(如 varchar)的真实字节数,读取时通过该列表定位数据长度。

2025-09-22 00:53:20 1127

原创 网络基础篇

TCP/IP网络模型采用分层设计,共分为四层:应用层、传输层、网络层和链路层。其核心目的是解决不同设备间的进程通信问题,通过标准化协议打破设备差异带来的兼容性壁垒。应用层直接面向用户,提供HTTP、FTP等服务;传输层通过TCP/UDP协议实现可靠或高效的数据传输,并利用端口号标识应用进程;网络层负责数据路由和转发,主要使用IP协议;链路层处理物理网络连接。这种分层架构使各层功能解耦,便于独立优化和维护,最终实现跨设备通信的完整机制。

2025-09-19 01:05:36 898

原创 RabbitMQ篇

RabbitMQ是一款基于AMQP协议的开源消息中间件,采用Erlang语言编写,具有高可靠性、灵活路由、可扩展性等特点。它支持多种协议和语言客户端,提供集群、镜像队列等机制保证高可用性。AMQP协议采用三层架构(Module、Session、Transport),核心组件包括交换器、队列和绑定。消息队列的主要作用是实现异步处理、服务解耦和流量削峰,但也存在系统复杂度增加、一致性问题等缺点。为确保消息可靠性,RabbitMQ提供了持久化、传输确认等机制。整体而言,RabbitMQ是分布式系统中重要的消息通信

2025-09-03 22:41:59 998

原创 滑动窗口篇

滑动窗口算法的本质是双指针法中的左右指针法,所谓滑动窗口,就像描述的那样,可以理解成是一个会滑动的窗口,每次记录下窗口的状态,再找出符合条件的适合的窗口。它可以将双层嵌套的循环问题,转换为单层遍历的循环问题。使用两个指针一左一右构成一个窗口,就可以将二维循环的问题转化成一维循环一次遍历,相当于通过旧有的计算结果对搜索空间进行剪枝,使时间复杂度从O(n²)降低至O(n),比如经典字符串查找算法Rabin-Karp 指纹字符串查找算法。

2025-08-27 02:05:59 412

原创 二分法篇章

while(left < right) 的终止条件是 left == right,写成区间的形式就是 [left, right],或者带个具体的数字进去 [2, 2],这时候搜索区间非空,还有一个数 2,但此时 while 循环终止了。while(left <= right) 的终止条件是 left == right + 1,写成区间的形式就是 [right + 1, right],或者带个具体的数字进去 [3, 2],可见这时候搜索区间为空,因为没有数字既大于等于 3 又小于等于 2 的吧。

2025-08-27 02:04:36 616

Redis 网络优化篇f

Redis 网络优化篇f

2025-11-09

空空如也

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

TA关注的人

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