- 博客(198)
- 收藏
- 关注
原创 Spring Cloud Gateway + OAuth2 + JWT 单点登录(SSO)实现方案
基于Spring Cloud微服务架构,通过Gateway网关、OAuth2协议和JWT令牌实现分布式系统的单点登录,允许用户一次登录后访问所有互信的微服务。:统一请求入口,负责路由、Token验证和转发OAuth2协议:定义授权流程,实现用户认证和授权码交换:作为无状态令牌载体,包含用户身份和权限信息。
2025-06-12 17:30:37
432
原创 基于 Redis 的幂等性设计:SpringBoot @Async 在高并发 MySQL 日志存储中的应用
幂等性是指对同一操作的多次请求,应该产生与一次请求相同的效果。防止重复处理:避免因网络波动、客户端重试等原因导致的重复业务处理提高系统稳定性:减少系统资源浪费,防止数据不一致增强用户体验:避免因重复请求导致的业务异常。
2025-06-12 14:12:45
630
原创 在 Spring Boot 中,@RequestBody 注解无法直接处理 application/x-www-form-urlencoded 格式的表单数据
1.接收方式适用场景:传输简单键值对(如表单提交,无文件上传)。接收方式(单个参数)) {(动态参数)(绑定实体类)注意事项参数编码:确保请求与响应编码一致(通常为 UTF-8)。PUT 请求支持:需添加过滤器(Tomcat 默认不解析 PUT 表单数据)。参数重复只保留最后一个值,需用获取全部值。2.接收方式适用场景:传输文件或混合文本与二进制数据(如表单上传)。接收方式(单个文件)) {实体类 +(混合数据)@Data多文件上传Element UI 多文件上传。
2025-06-12 10:43:14
429
原创 基础知识:抽象类成员变量的继承与使用
Java中,子类会继承抽象父类的所有成员变量和方法。继承规则受访问修饰符影响:public和protected可直接访问,默认包级私有则需同包,private仅能通过公共方法间接访问。实际应用中,子类可直接使用父类注入的Redis工具类,如redisTemplate和valueOperations,实现缓存操作。建议使用protected访问权限,封装常用操作为父类方法供子类调用,必要时可重写方法。这种方式遵循"开放-封闭"原则,既实现了代码复用,又保留了扩展灵活性。
2025-06-11 16:23:56
144
原创 java8 通过方法引用 vo::setLevel将对象的 setter 方法作为参数传递
【代码】java8 通过方法引用 vo::setLevel将对象的 setter 方法作为参数传递。
2025-06-10 13:56:45
83
原创 基于 Spring Boot 策略模式的短信服务提供商动态切换实现
自动装配机制:Spring 会自动识别SmsService接口的所有实现类,并将它们注册为Bean。在扫描类路径时,一旦发现被@Service(或其他合适的组件扫描注解,如@Component等)注解标记且实现了指定接口的类,就会将其纳入 Spring 容器管理,使其成为一个可被注入和使用的Bean。Map 注入:通过这样的参数类型声明,Spring 利用其依赖注入功能,自动将所有实现了SmsService接口的Bean注入到这个Map中。
2025-06-09 16:00:05
1005
原创 MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
脏读、幻读和不可重复读是在数据库事务并发操作中可能出现的不同数据一致性问题,不同的数据库引擎(如 InnoDB 和 MyISAM)在不同的隔离级别下,对这些问题有着不同的处理方式。InnoDB 引擎通过诸如 MVCC(多版本并发控制)和间隙锁等机制,在合适的隔离级别下能够有效地避免幻读和不可重复读等问题,而 MyISAM 引擎由于自身的特性,在类似场景下较难避免这些问题。
2025-06-09 13:48:57
806
原创 使用 @MapperScan 后 DAO 接口无需 @Component 或 @Repository 的原因分析
使用 @MapperScan 后 DAO 接口无需 @Component 或 @Repository 的原因分析
2025-06-09 09:30:06
698
原创 MySQL全文索引
在MySQL中,是一种专门为文本数据设计的索引类型,用于高效处理自然语言搜索(如文章内容、评论、关键词匹配等)。与传统的B-Tree索引相比,全文索引在处理大量文本数据时性能更优,且支持更复杂的搜索语法。CHARVARCHARTEXTMySQL*"数据库设计"MySQL内置分词器对中文支持不佳(默认按空格分词),需使用第三方插件(如ngram全文索引的维护成本高于普通索引,写入操作可能变慢。MATCHUPPER()WHERE全文索引通常比原数据大,需预留足够磁盘空间。
2025-06-06 15:25:30
875
原创 MySQL 索引优化
MySQL 5.6引入的索引下推(Index Condition Pushdown)技术可以部分优化不符合最左前缀的查询。当创建复合索引时,MySQL会按照索引定义的字段顺序,从左到右使用这些字段来构建索引结构。不在最左前缀中,但索引下推可以在索引扫描时过滤。条件,减少回表次数,提高性能。
2025-06-06 13:18:40
1057
原创 Spring Boot实现接口时间戳鉴权
Spring Boot接口时间戳鉴权方案通过请求头传递签名(X-Signature)和时间戳(X-Timestamp)。签名算法使用MD5,基于密钥、URL路径和时间戳生成。实现流程包括:创建拦截器校验时间戳有效性和签名一致性,配置拦截路径,并支持自定义时间窗口。客户端需在请求头中添加上述参数,服务端通过拦截器自动完成鉴权,保障接口安全性。该方案适用于需要时效性和防篡改的API场景。
2025-06-06 09:38:43
539
原创 Spring Boot + MyBatis-Plus 读写分离与多 Slave 负载均衡示例
本文介绍了一个基于Spring Boot和MyBatis-Plus实现读写分离与多从库负载均衡的示例项目。项目采用动态数据源路由机制,通过自定义注解和数据源上下文实现主从库的自动切换。核心实现包括:1) 定义数据源类型枚举;2) 使用ThreadLocal保存当前数据源;3) 配置多个主从数据源;4) 通过AOP切面实现读写分离路由;5) 提供从库负载均衡策略。该方案支持在主库执行写操作,在多个从库之间轮询执行读操作,优化数据库访问性能。
2025-06-03 15:25:49
834
1
原创 在Java中,循环内声明变量和循环外声明变量的主要区别
Java中循环内外声明变量的区别主要在于作用域和生命周期:循环外变量可在循环后继续使用,适合保留状态;循环内变量仅限循环内部使用,提高代码可读性。对于基本数据类型,性能差异可忽略;对象类型在循环内频繁创建可能增加内存开销,但现代JVM优化后影响不大。建议优先考虑代码可读性,仅在处理高成本对象时考虑声明位置优化。实际开发中应基于性能分析而非臆测进行优化。
2025-06-03 14:42:23
631
原创 MySQL索引支持排序
MySQL索引排序原理与优化实践:B+树索引的有序性天然支持排序操作,当ORDER BY字段与索引列匹配时,数据库可直接利用索引返回有序数据,避免额外排序开销。索引排序需满足字段顺序、排序方向一致且避免函数操作等条件,多字段排序需匹配复合索引结构。通过EXPLAIN验证索引使用情况,合理设计索引(如分页查询优化、联合唯一索引)可显著提升查询性能。MySQL 5.7+支持指定索引列排序方向,而旧版本仅默认升序。
2025-06-03 13:29:42
895
原创 MyBatis分页插件(以PageHelper为例)与MySQL分页语法的关系
MyBatis分页插件(如PageHelper)通过拦截SQL语句自动添加分页参数,对于MySQL会转换为LIMIT语句实现物理分页。例如,将SELECT * FROM users变为SELECT * FROM users LIMIT 10 OFFSET 20。插件适配不同数据库,如Oracle用ROWNUM,SQL Server用OFFSET FETCH,让开发者无需手动编写分页语法。PageHelper只需简单调用startPage()方法即可自动完成分页处理。
2025-06-03 13:25:04
336
原创 将冗长的 if-else 条件判断语句改为使用 Map 进行映射查找
摘要 将if-else条件判断优化为Map映射能提升代码简洁性、可维护性和性能。Map查找时间复杂度从O(n)降至O(1),新增条件只需修改映射表。示例显示,Map版本更简洁直观,适用于状态码映射、类型匹配等固定条件场景,特别是分支超过3个时优势明显。
2025-05-27 10:40:12
408
原创 MySQL 中 DISTINCT 和 GROUP BY 的区别与联系
MySQL中DISTINCT与GROUP BY都能实现数据去重,但存在关键区别:DISTINCT直接去除重复行返回完整数据,适合简单去重场景;GROUP BY按列分组并支持聚合统计,更适用于数据分析。在NULL处理上,DISTINCT将所有NULL视为相同,而GROUP BY会将NULL作为独立分组。性能方面,MySQL 8.0后二者效率接近,但GROUP BY在有索引时表现更优。通过employees表示例可见,DISTINCT适合获取唯一值组合,而GROUP BY更适合分组统计计算。
2025-05-26 11:01:58
683
原创 典型的**N+1查询问题**
典型的:当需要查询主实体及其关联子实体时,传统做法是先查询主实体,再循环查询每个主实体对应的子实体,导致数据库查询次数为,性能较差。
2025-05-15 15:18:07
297
原创 springboot使用阿里云OSS实现文件上传
通过以上步骤,即可在Spring Boot中实现阿里云OSS的基本文件操作。• CDN加速:如果启用了CDN,可直接返回CDN域名而非OSS域名。• STS临时凭证:通过STS服务获取临时Token,提升安全性。
2025-05-07 10:02:26
682
原创 Spring Security鉴权:文件上传需要携带token
在Spring Security的配置流程里,请求携带token时,会先执行所添加的过滤器,之后再进行。
2025-05-06 17:21:19
467
原创 Java 中 ,使用JSON 处理库将含二进制数组的对象转换为 JSON 字符串
无论是 Jackson 还是 Fastjson,都能方便地将包含二进制数组的对象转换为 JSON 字符串,并且会自动将二进制数组转换为 Base64 编码的字符串。开发者可以根据项目的具体需求和偏好选择合适的 JSON 处理库。需要注意的是,Fastjson 曾存在安全漏洞,使用时要确保使用安全的版本。
2025-04-09 13:13:10
518
原创 Springboot 中使用 List<Integer> 与 JSONArray 处理 JSON 数组的性能与实践
需求场景推荐方案关键优势严格类型检查List编译期安全保障高频次请求List自动化反序列化提升吞吐量动态数据结构JSONArray灵活处理混合类型内存敏感型应用JSONArray原始类型存储降低内存消耗避免框架依赖JSONArray仅需轻量级 JSON 库最终建议优先使用保证类型安全和性能仅在必要时采用JSONArray应对动态场景结合 JMH 基准测试验证具体场景下的性能表现通过合理选择数据接收方式,可在系统性能、代码可维护性和功能灵活性之间找到最佳平衡点。
2025-03-31 13:28:39
516
原创 基于 AOP 实现的限流方案:Sentinel 与 Guava RateLimiter 对比分析
Sentinel 是阿里巴巴开源的一款流量控制组件,它提供了实时监控、限流、熔断等功能。结合 AOP 可以在不修改原有业务代码的前提下,对接口进行限流。Guava 是 Google 开源的 Java 工具库,其中的类可以实现简单的限流功能。结合 AOP 同样可以实现非侵入式的限流。Sentinel 功能丰富,除了限流外,还支持熔断、降级等多种流量控制策略,适用于复杂的业务场景。Guava RateLimiter 功能相对单一,主要用于简单的限流,适合对功能要求不高的场景。
2025-03-31 13:23:55
1080
原创 异步操作中的潜在问题及影响分析
异步后通过线程池调用 HTTP 请求通知 API 服务以及 Java 异步存储日志到 MongoDB 这两个典型场景下,这些问题值得我们深入剖析。
2025-03-28 09:52:44
406
原创 Kafka 中相同代码实例消费主题时的数据拉取情况解析
Kafka设计了消费者组这样一种巧妙的机制来管理消息的消费。简单来说,消费者是通过加入消费者组来对主题中的消息进行消费操作的。在同一个消费者组内的各个消费者,会共同协作来消费主题所包含的所有分区。值得注意的是,Kafka有着出色的协调能力,它能够确保同一个分区的数据在同一时刻只会被该消费者组内的某一个消费者进行处理。这样的设计有着重要意义,它实现了数据的负载均衡以及并行处理,使得整个消息消费过程更加高效、有序,避免了重复处理和资源浪费等问题。
2025-03-28 09:46:44
533
原创 EXPLAIN 计划中 filtered 含义及作用解析
在数据库查询优化的领域中,EXPLAIN计划是深入了解查询执行过程的有力工具。其中,filtered这一指标扮演着关键角色,它为开发者和数据库管理员提供了关于查询执行效率的重要洞察。filtered。
2025-03-27 16:52:44
604
原创 分布式锁实战:Redis与Redisson的深度解析
Redis原生方案适用于轻量级场景,需关注原子性与锁过期问题Redisson框架通过自动续期、多种锁模式等特性,提供了企业级的分布式锁解决方案在实际应用中,应根据系统规模、一致性要求和业务特性选择合适的实现方式,同时结合监控和报警机制保障系统的稳定性。
2025-03-26 10:27:45
472
原创 Spring Boot 集成 Kafka 消息发送方案
/ 序列化逻辑 } public class KafkaMessageSender {= null) {} else {} } });} }// 序列化逻辑 } public class KafkaMessageSender {= null) {} else {} } });} }// 序列化逻辑 } public class KafkaMessageSender {
2025-03-20 11:06:42
1175
原创 Spring Boot 动态配置管理:ZooKeeper 集成与 Redis 配置覆盖实践
集中化管理:所有配置统一存储在 ZooKeeper动态刷新:支持配置实时更新高可用性:基于 ZooKeeper 的分布式特性。
2025-03-17 10:38:54
832
原创 Spring Boot 读取 ZooKeeper (ZK) 属性的总结指南
通过以上步骤,你可以在 Spring Boot 中优雅地读取和管理 ZooKeeper 的配置属性。在任意 Spring Bean 中注入。如果需要切换不同的 ZK 源(如。
2025-03-12 15:58:50
570
原创 Spring Boot 项目部署启动异常问题分析与解决:主类缺失与依赖冲突的分析
插件选择:在 Spring Boot 项目中,优先选用,以避免手动配置Main-Class,减少潜在的配置错误。在功能上更贴合 Spring Boot 项目特性,从打包到启动都能提供全面支持,而难以满足 Spring Boot 项目复杂的需求。依赖管理:应尽量避免显式排除核心依赖(例如 Tomcat)。若确实需要自定义容器,务必依据官方文档的指导进行配置,以确保项目的稳定性和兼容性。版本兼容性:高版本的插件虽然可能引入新特性,但同时也可能带来 Breaking Changes。
2025-03-12 10:34:33
1157
原创 @Async 使用手册
Async 是 Spring 框架提供的一个注解,用于实现方法的异步执行。当一个方法被 @Async 注解标注后,Spring 会在调用该方法时,将其放入线程池中异步执行,而不会阻塞当前线程。
2025-03-06 11:26:07
884
原创 MySQL优化示例 1:关联查询
在 SQL 中,WITH 关键字用于创建公共表表达式(Common Table Expressions,CTE)。CTE 是一种临时命名的结果集,它存在于单个 SQL 语句的执行范围内,可在该语句中被多次引用。下面为你详细解析 WITH 关键字及其使用场景和优势。从 MySQL 8.0 版本开始,MySQL 正式支持公共表表达式(CTE),这意味着你可以使用 WITH 关键字来创建 CTE。而在 MySQL 8.0 之前的版本,比如 MySQL 5.x 系列,是不支持 WITH 语法的。
2025-02-28 17:25:24
194
原创 Java 中 HTTP 协议版本使用情况剖析
HTTP/2 是新一代 HTTP 协议,采用多路复用的二进制分帧层,解决了队头阻塞问题,提升了连接利用率和传输效率。HttpURLConnection 是 Java 早期用于处理 HTTP 请求的类,默认使用 HTTP/1.1 协议,且不直接支持 HTTP/2 协议。若服务器支持则使用 HTTP/2,不支持则回退到 HTTP/1.1。本文将深入探讨 Java 不同网络请求工具默认使用的 HTTP 协议版本,包括 HTTP/1.1 和 HTTP/2 的特点,以及在 Java 中的应用情况。
2025-02-21 10:12:45
677
mongodb可视化工具(兼容较低版本使用)
2025-01-23
能用Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)
2024-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人