自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【集合篇01】:ArrayList和LinkedList的详细对比

ArrayList与LinkedList的底层结构差异显著:前者基于动态数组,支持O(1)随机访问但插入删除需移动元素;后者采用双向链表,插入删除效率高(O(1)头尾操作)但查询需遍历(O(n))。内存方面,ArrayList更紧凑,LinkedList因存储指针占用更多空间。两者均非线程安全,可通过synchronizedList实现线程安全。选择依据:频繁随机访问选ArrayList,频繁插入删除选LinkedList。

2025-07-06 08:45:00 140

原创 【Spring篇10】:制作自己的spring-boot-starter依赖2

本文介绍了Spring Boot Starter的概念与制作流程。Starter是Spring Boot生态中的核心组件,通过打包依赖、配置和自动装配逻辑,简化开发者的使用。文章详细讲解了制作标准流程:创建项目结构、编写配置类、使用注解、注册配置和打包发布。并以"Hello World" Starter为例,展示了如何实现一个包含属性配置、服务类和自动配置的完整Starter。最后给出了命名规范和条件注解等最佳实践建议,帮助开发者创建规范的Spring Boot Starter模块。

2025-07-04 09:00:00 788

原创 【Spring篇09】:制作自己的spring-boot-starter依赖1

在企业级应用开发中,重复编写通用功能模块(如日志处理、RPC调用等)效率低下。Spring Boot Starter作为特殊依赖,可聚合相关依赖并提供自动化配置,让项目引入后自动获得所需功能。本文基于Spring Boot自动化装配原理,介绍自制Starter的方法。Starter本质是依赖聚合器和自动化配置提供者,其模块结构推荐分为入口模块“xxx-spring-boot-starter”和配置模块“xxx-spring-boot-autoconfigure”

2025-07-03 15:47:35 1036

原创 【Spring篇08】:理解自动装配,从spring.factories到.imports剖析

Spring Boot自动化装配简化了Spring应用配置,其核心机制围绕@EnableAutoConfiguration注解展开。早期版本通过META-INF/spring.factories文件注册配置类,2.7+版本引入.imports文件作为更规范的注册方式。AutoConfigurationImportSelector负责加载这些配置类,并结合条件注解(如@ConditionalOnClass)决定配置是否生效。该机制依赖运行时类路径发现配置,实现了智能化的自动装配,让开发者能够专注于业务逻辑开发

2025-07-03 15:38:08 1018

原创 【Spring篇07】:Spring生态核心注解速查指南

本文总结了Spring框架的核心注解分类:1) Spring基础注解包括组件声明(@Component)、依赖注入(@Autowired)、配置类(@Configuration)等;2) Spring MVC注解如@RequestMapping、@RequestBody等处理Web请求;3) Spring Boot特色注解如@SpringBootApplication自动配置、@RestController简化开发等。使用建议强调分层设计、构造器注入优先和配置优先级管理。这些注解构成了Spring生态的核心

2025-07-02 15:00:00 260

原创 【Mybatis篇01】:Mybatis执行流程 从配置文件到结果输出

MyBatis执行流程主要包括四个核心步骤:首先加载配置文件构建全局唯一的SqlSessionFactory;然后通过工厂创建轻量级的SqlSession会话;接着Executor执行器通过MappedStatement对象执行具体SQL操作;最后将数据库结果映射为Java对象返回。流程中还涉及两级缓存机制:一级缓存(SqlSession级别)默认开启,二级缓存(全局)需手动配置。最佳实践包括单例管理SqlSessionFactory、及时关闭SqlSession、合理使用缓存等。

2025-07-02 11:37:38 543

原创 【Spring篇06】:必会SpringBoot自动装配原理解析

Spring Boot自动装配原理核心是@EnableAutoConfiguration触发扫描META-INF/spring.factories文件,加载其中定义的配置类,并通过@ConditionalOnClass等条件注解基于运行时类路径决定是否启用。装配过程分为三层……

2025-07-02 10:41:31 702

原创 【Spring篇05】:Bean的循环依赖简析及其解决

Spring框架通过三级缓存机制解决循环依赖问题。当两个Bean相互依赖时,Spring会将未完成初始化的Bean引用存入三级缓存(singletonFactories),在需要时提供早期引用。具体流程包括:实例化Bean并存入三级缓存→发现依赖后暂停当前Bean初始化→通过三级缓存获取依赖Bean的早期引用→完成初始化后移入一级缓存。但该机制无法解决构造方法中的循环依赖,因为此时Bean尚未实例化,无法提供早期引用。对于构造方法循环依赖,建议调整设计,如改用Setter注入或@Autowired方式。

2025-07-02 10:40:35 833

原创 【Spring篇04】:Bean的生命周期简析

Spring Bean生命周期以控制反转(IoC)和依赖注入(DI)为核心,通过Aware接口、BeanPostProcessor等扩展点实现灵活控制。其流程可概括为:加载BeanDefinition后,经构造函数实例化、依赖注入,再依次触发Aware接口回调、BeanPostProcessor前置处理,执行初始化方法(如@PostConstruct标记的方法),接着进行BeanPostProcessor后置处理(常用于生成AOP代理),最终在容器关闭时执行销毁方法(如@PreDestroy标记的方法)。

2025-07-02 08:45:23 953

原创 【Spring篇03】:@Transcational事务失效几种常见场景及原因简析

Spring事务失效通常因AOP代理机制被破坏导致,常见场景包括:1. 异常被捕获未抛出(默认只回滚RuntimeException);2. 检查异常未配置rollbackFor;3. 非public方法无法被代理;4. 同类内部方法调用(高频问题,this调用绕过代理);5. 传播行为配置不当。解决方案包括:正确处理异常、规范方法可见性、拆分服务类避免内部调用等。理解代理机制是排查事务问题的关键,需确保所有事务方法都通过Spring容器管理的代理对象调用。

2025-07-02 08:44:54 670

原创 【Spring篇02】:AOP与事务实现原理

Spring AOP通过环绕通知实现方法拦截控制,使用ProceedingJoinPoint处理目标方法执行前后逻辑,类比"动作替身"机制。切点表达式定义拦截规则,支持execution语法和注解匹配。事务管理基于AOP代理实现,@Transactional结合TransactionInterceptor完成事务创建、提交和回滚。生产实践中需注意注解位置、传播行为、性能优化和自调用问题。面试要点包括异常处理优先级、注解优先级和隔离级别设置等核心机制。

2025-07-01 16:49:10 846

原创 深度剖析:基于AOP、自定义注解与设计模式构建高度可定制的分布式锁解决方案

本文提出了一种基于Spring AOP和自定义注解的分布式锁解决方案,通过@MyLock注解实现声明式加锁。该方案采用策略模式封装不同锁获取策略(如快速失败、有限重试等),工厂模式支持多种锁类型(可重入锁、公平锁、读写锁),有效解决了传统分布式锁实现中代码侵入性强、重复代码多、不够灵活等问题。核心设计包括:1)@MyLock注解提供锁名称、等待时间、锁类型等配置项;2)MyLockType枚举定义支持的锁类型;3)MyLockStrategy枚举实现策略模式,处理获取锁失败的不同行为。该方案显著提升了代码可

2025-07-01 11:20:47 1408

原创 【Spring篇01】:Bean的线程安全问题总结

Spring框架中的单例Bean默认非线程安全,需开发者根据场景处理并发问题。核心解决方案包括:①优先设计无状态Bean(无成员变量);②使用ThreadLocal或并发工具类(如AtomicLong)管理线程级/共享状态;③避免滥用prototype作用域。典型案例表明,统计类服务推荐Atomic原子类,用户会话数据适用ThreadLocal。关键原则是:单例Bean的线程安全取决于设计,应避免可变状态,必要时采用最小化同步策略。

2025-07-01 09:58:57 1058

原创 AndroidStudio 中虚拟机连接宿主机(本机)服务

当安卓模拟器无法连接本地后端服务时,需将代码中的 localhost:8080 替换为主机实际IP地址。通过ipconfig命令查看主机的无线局域网适配器(WLAN)IPv4地址(如192.168.10.7),并在安卓代码中使用该IP。确保模拟器与主机处于同一Wi-Fi网络,同时检查防火墙是否拦截了8080端口,必要时开放端口权限以允许通信。

2025-06-28 17:34:28 115

原创 【SpringAI篇04】:基于 ChatMemory 查询聊天记录

在上文聊天记录持久化基础上,增加查询聊天记录功能,由于聊天记录基于 ChatMemory 接口存储,通过注入该接口并传入对话 ID,可调用其get(String conversationId)方法查询历史消息。示例中HistoryController通过@GetMapping映射接口,接收chatId参数并调用chatMemory.get(String.valueOf(chatId)),实现按会话 ID 查询对话历史,该功能依赖于此前配置的持久化存储方案(如 MySQL),可从数据库中读取已保存的对话记录。

2025-06-27 16:53:20 157

原创 【SpringAI篇03】:聊天记录持久化(仍保留上下文)

本文主要介绍在SpringAI框架中为聊天记忆功能添加持久化存储的实现过程。默认内存存储方案(InMemoryChatMemoryRepository)存在数据易丢失和消息数量受限的问题,通过引入MySQL持久化方案可解决:添加JDBC存储依赖,创建对话记忆表,配置数据源及Spring AI相关参数,注入JdbcChatMemoryRepository替换默认内存存储。测试表明,该方案实现了对话历史的数据库持久化,支持服务重启后读取历史记录及会话隔离。

2025-06-27 16:35:05 845

原创 【SpringAI篇02】:实现连续对话(上下文记忆功能+会话隔离)

在 Spring AI 中实现对话记忆功能,需先配置 ChatMemory。通过新建 MemConfig 配置类,利用 MessageWindowChatMemory.builder () 构建实例,设置 InMemoryChatMemoryRepository 存储对话,默认最大消息数 20 条,超过自动移除旧消息,实现基于窗口的对话记忆。接着在 ChatConfig 配置类中,为 ChatClient 添加 Advisor 增强功能。通过 defaultAdvisors 加入 SimpleLogger

2025-06-26 18:21:06 790

原创 【SpringAI篇01】:5分钟教会你使用SpringAI (1.0.0稳定版)

后端开发之:从创建 SpringAI 项目开始,到快速入门实现调用大模型 API 实现对话功能。

2025-06-26 16:39:38 1407

原创 【计算机组成原理01】:主存与Cache的地址映射

本文介绍主存与 Cache 的三种地址映射方式及对比,具体如下:1. 直接相联映射:主存块只能映射到 Cache 固定块,有对应公式,包含原理、CPU 访问流程(需结合图示理解)。2. 组相联映射:是全相联与直接相联的结合,主存和 Cache 块先分组(每组块数相同),组间直接映射、组内全相联映射,含原理、CPU 访问流程,注有“n 路组相联指每组有 n 块”(需结合图示)。 3. 全相联映射:主存每一块可映射到 Cache 任意块,灵活且 Cache 利用率高但成本也高,有原

2025-06-24 18:05:53 951

原创 【MySQL篇10】:四种分库分表详解

分库分表是应对海量数据的有效方案,主要分为垂直和水平两种方式。垂直拆分按业务或字段划分,分别形成独立数据库或表,适用于业务模块清晰或字段访问频率差异大的场景。水平拆分依据数据行规则分散数据到多个库表,适合处理海量数据。两种方式各有优缺点:垂直拆分隔离性好但跨库操作复杂,水平拆分扩展性强但分片规则设计难度大。实际应用中常将两种方式结合使用,根据业务特点选择最合适的分片策略,以提升系统吞吐量和可扩展性。

2025-06-20 20:30:00 555

原创 【MySQL篇09】:binlog与主从同步(主从复制)

MySQL主从同步是一种关键技术,通过主库记录二进制日志(Binlog)实现数据变更的实时同步,从库通过I/O线程拉取日志并写入中继日志(Relay Log),再由SQL线程重做事件。这种机制支持高可用性、读写分离、数据备份和报表分析等应用场景,确保主从数据一致性,是构建高可用数据库架构的基础。

2025-06-20 15:53:53 662

原创 【MySQL篇08】:undo log日志和MVCC实现事务隔离

本文介绍了数据库事务隔离的两种实现方式——排他锁和MVCC(多版本并发控制),重点解析了MVCC的工作原理。MVCC通过结合Undo Log(存储数据历史版本)、隐藏字段(记录事务ID和版本指针)和Read View(事务快照)来确保读一致性: Undo Log作为"时光机",保存数据修改前的状态,支持回滚并为MVCC提供历史版本; MVCC通过隐藏字段构建数据版本链,使不同事务能看到不同时间点的数据快照; Read View作为"时空过滤器",根据事务活跃状态判断数

2025-06-20 14:54:39 1339

原创 【MySQL篇07】:redo log日志与buffer pool详解

MySQL通过Buffer Pool和redo log机制优化数据库性能与数据安全。Buffer Pool作为内存缓存区存储高频访问数据页,读写操作优先在内存完成。更新数据时,采用WAL(预写日志)技术,先将操作记录到redo log buffer再更新Buffer Pool,确保事务持久性。redo log在事务提交等时机刷盘,崩溃时可恢复数据。后台线程异步将Buffer Pool脏页刷回磁盘,redo log空间循环复用。这种设计平衡了性能与数据可靠性,避免频繁磁盘I/O。

2025-06-20 14:39:27 1210

原创 【MySQL篇06】:并发控制-加锁与锁类型

数据库锁机制主要分为排他锁(X锁/写锁)和共享锁(S锁/读锁)两种。X锁允许持有事务对数据执行读写操作,并完全阻塞其他事务的任何操作,确保数据独占性;S锁仅允许读取数据,其他事务可以同时加S锁进行并发读取,但会阻止写操作。这两种锁分别用于解决并发修改冲突和实现安全的数据共享访问,是保证数据一致性的关键技术。通过合理使用X锁和S锁,可以有效协调多事务对数据的访问控制。

2025-06-20 14:33:48 441

原创 【MySQL篇01】补充:索引体系大总结(数据库原理篇)

索引技术分类与应用概览 索引技术根据数据结构、存储方式和功能特性可分为多种类型。B+树索引是关系型数据库的主流选择,支持高效的点查询和范围查询;哈希索引适用于精确匹配但无法处理范围查询;位图索引适合低基数列的集合操作;全文索引用于文本搜索;空间索引处理地理数据。存储方式上,聚簇索引将数据与索引绑定,而非聚簇索引需回表查询。不同数据库如MySQL、PostgreSQL各有特色实现。合理选择索引类型可显著提升查询性能。

2025-06-19 19:13:51 553

原创 【MySQL篇05】:事务的 ACID 性(数据库原理篇)

事务的ACID特性是数据库系统的核心概念,包括原子性(事务要么全执行要么全回滚)、一致性(事务前后数据满足约束条件)、隔离性(并发事务互不干扰)和持久性(事务提交后数据永久保存)。原子性通过Undo Log实现回滚机制,持久性依赖Redo Log确保故障恢复。隔离性通过不同级别(如读未提交可能引发脏读)和锁机制/MVCC来实现。典型场景如电商下单体现原子性,银行转账展示一致性,并发购票反映隔离性,订单持久存储证明持久性。Undo Log和Redo Log分别保障事务回滚与数据恢复,共同维护ACID特性。

2025-06-19 09:33:32 1028

原创 【MySQL篇04】:SQL优化核心知识体系

MySQL数据库优化指南摘要:本文从建表、索引、SQL语句和架构四个层面系统总结了优化技巧。建表时应选用最小化字段类型(如TINYINT存状态值),字符类型精确化;索引优化需遵循最左前缀原则,避免失效场景;SQL语句要规避SELECT *,采用小表驱动大表的JOIN策略;架构层面建议通过主从复制或分库分表应对大数据场景。核心原则是:选择合适数据类型、创建高效索引、编写优化SQL、合理设计架构,从而全面提升数据库性能。

2025-06-18 09:00:00 665

原创 【MySQL篇03】:索引创建原则、索引失效情况(完整知识点)

MySQL索引创建原则与失效情况总结:索引创建原则:大表优先(数据量超10万)选择高频查询字段(WHERE/ORDER BY/GROUP BY条件)优先使用复合索引实现覆盖查询区分度低的字段放组合索引末尾长文本使用前缀索引控制索引数量避免影响写性能索引失效情况:违反最左匹配原则(复合索引未使用首字段)前导%模糊查询(LIKE '%xx')索引字段进行运算或函数处理复合索引中范围查询后的条件失效OR连接无索引字段条件使用NOT IN/IS NULL等否定条件核心原则:索引需

2025-06-17 14:42:36 846

原创 【MySQL篇02】超大分页优化:利用覆盖索引子查询

覆盖索引概念、利用覆盖索引子查询优化MySQL超大分页

2025-06-17 11:26:19 251

原创 【MySQL篇01】:聚簇索引、非聚簇索引必会详解

索引是一种数据结构,用于帮助数据库系统高效地查找和检索数据。可以把它想象成书本的目录,通过目录可以快速定位到书本中你需要的内容,而不需要从头到尾翻遍整本书。作用:这是索引最主要的作用。通过索引,数据库可以避免全表扫描,大大减少查找数据的时间。查找数据时,如果使用索引,数据库只需要读取索引数据和少量的数据页,而不需要读取整个数据表,从而减少了磁盘 I/O 次数。如果查询需要对结果进行排序,而排序字段正好有索引,数据库可以直接使用索引的有序性,避免额外的排序操作。

2025-06-17 09:00:00 1726

原创 Redis分片集群、数据读写规则

分片集群(Redis Cluster):是一种分布式解决方案,它通过将数据分散存储在多个 Master 节点上,来解决海量数据存储和高并发写的问题。每个 Master 节点负责一部分数据(通过哈希槽分配),并且可以有自己的 Slave 节点来保证高可用。缺点和局限性:集群间通信开销:集群之间的心跳检测和数据通信会消耗大量的网络带宽对 Lua 脚本和事务支持有限:Redis 的 Lua 脚本和事务通常要求操作的 key 都在同一个节点上;

2025-06-16 19:00:00 1173

原创 Redis的哨兵模式与集群脑裂问题

保证Redis的高并发、高可用的方式。

2025-06-16 11:23:58 1012

原创 图解:Redis主从同步与同步流程

Redis主从同步分为全量同步和增量同步两个阶段。全量同步发生在从节点首次连接主节点时,主节点会生成RDB快照文件并发送给从节点,同时记录期间的操作命令到缓冲区。增量同步则在从节点重启后触发,主节点根据从节点的offset偏移量,只发送后续新增的操作命令。这种机制通过主节点负责写入、从节点负责读取的方式实现读写分离,提高了Redis的并发处理能力。同步过程中使用的replicationid标识数据集,offset记录同步进度。

2025-06-15 09:52:31 902

原创 Redis分布式锁解析:从SETNX到Redisson

当被问到分布式锁实现时,建议先分析SETNX的问题,再引出Redisson解决方案,最后结合自己的抢券项目说明实际应用。这种"问题→方案→实践"的回答结构最能体现技术深度。

2025-06-13 21:00:00 825

原创 Redisson分布式锁类型及获取方式

Redisson提供了多种分布式锁实现方式:1) 默认可重入锁,支持锁重入和自动续期;2) 公平锁保证按顺序获取;3) 联锁同时锁定多个资源;4) 红锁基于多Redis实例;5) 读写锁适合读多写少场景;6) 信号量用于限流控制。

2025-06-13 16:21:06 296

原创 Redis缓存过期策略:惰性删除与定期删除

Redis缓存过期策略:惰性删除与定期删除。

2025-06-13 13:30:46 707

原创 Redis内存淘汰策略(精简速记版)

Redis的内存淘汰策略,精简速记

2025-06-13 13:28:43 981

原创 面试题总结:Redis持久化方案:RDB、AOF

Redis持久化的RDB快照和AOF日志两种方案

2025-06-12 11:55:23 649

原创 如何保证Redis与MySQL的数据同步?(如何保障缓存与DB的双写一致性?)

【代码】如何保证Redis与MySQL的数据同步?(如何保障缓存与DB的双写一致性?

2025-06-12 08:45:00 798

原创 吃透理解Redis缓存三兄弟:缓存穿透、缓存击穿、缓存雪崩

缓存“三兄弟”:穿透、击穿和雪崩,及其解决方案。

2025-06-10 22:49:49 628

空空如也

空空如也

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

TA关注的人

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