- 博客(219)
- 收藏
- 关注
原创 分布式环境下 Spring Boot 项目基于雪花算法的唯一 ID 生成方案
分布式系统是指将多个独立的计算节点通过网络连接,协同完成同一目标的系统架构。确保了在分布式环境下,即使多个用户服务节点同时处理创建用户请求,生成的 ID 也不会冲突。
2025-06-25 17:22:12
687
原创 实现在线访问OSS中的PDF、图片等文件(OSS不支持在线访问,而是默认下载)
当 OSS 返回的响应头中Content-Disposition设置为attachment时,浏览器会强制下载文件。需要注意的是,对于大的PDF文件,这种简单的流复制方式可能在性能上有一定局限。),并将从OSS获取到的文件内容流转发给浏览器,实现在线预览的效果。,使得浏览器尝试在线预览而不是自动下载,同时设置正确的。通过这个接口代理请求,会修改响应头,将。
2025-06-25 09:31:52
195
原创 MySQL优化:使用 LIMIT 进行分页查询时,偏移量过大造成查询性能降低问题分析
尽量让查询所需的列都包含在索引中,这样在查询过程中可以直接从索引里获取数据,减少回表操作(回表指的是先通过索引找到主键,再根据主键去数据表中查找其他列数据的过程)。先通过一个子查询快速定位到我们真正想要获取的数据所在的 id 范围(也就是 “关键的 id 段”),然后再通过关联操作获取这些 id 对应的数据行的完整信息。(上次登录日期)等,现在需要按照用户的注册日期倒序分页展示用户信息,且要获取从第 5000 条记录开始的 10 条用户记录。的联合索引,让查询直接从索引中获取这些数据,提升效率。
2025-06-24 13:23:52
580
原创 Mysql 数据库中设备实时状态表水平分表
在使用 Mysql 数据库存储设备上报日志时,存在一张设备实时状态表,随着时间推移,数据量变得十分庞大。为了更好地管理和查询数据,提高数据库性能,需要对该表进行水平分表操作。同时,存在分页查询的需求,不过仅在针对单个设备状态查询时才需要分页展示结果,以方便查看设备在不同时间段的状态信息,避免一次性返回大量数据影响性能和使用体验。
2025-06-23 15:35:52
1324
原创 Java 8新API总结
类中的一个静态方法,用于创建一个可能包含空值的容器对象。它的核心作用是将一个可能为。中,从而更优雅地处理空值,避免直接调用可能引发。是 Java 8 引入的。
2025-06-20 16:56:58
155
原创 Mysql优化:读写分离和分库分表
MySQL读写分离是优化高并发数据库系统的核心策略之一,通过将写操作(INSERT/UPDATE/DELETE)定向到主库(Master)、读操作(SELECT)分发到从库(Slave),有效分担主库压力,提升查询性能和系统扩展性。:中间件方案中,ProxySQL适合高并发读写分离,ShardingSphere支持分库分表+分布式事务,MyCAT适合复杂分片场景。
2025-06-19 16:44:47
331
原创 Springboot 使用Redis 实现定时任务
Spring Data Redis ≥ 2.3.0:该版本引入了 setIfAbsent(key, value, duration) 方法,支持原子性设置键值+过期时间(对应 Redis 的 SET key value NX EX seconds 命令):在分布式环境中,通过 Redis 锁确保同一时间只有一个实例执行定时任务。:避免键空间通知的丢失风险,适合任务量大的场景。,通过定时任务查询到期的任务并执行。:利用 Redis 的键过期事件(:将任务执行时间作为。
2025-06-19 12:40:31
914
原创 在 MyBatis 中处理一对一关联时,使用 <association> 标签
地址数据需懒加载、学生表数据量较大时避免一次性 JOIN 的性能压力。:分两次查询数据库,先查学生,再根据学生表的外键查地址。:单次 JOIN 查询,通过结果集映射直接封装关联对象。:需一次性高效加载所有数据,避免多次查询的延迟问题。),否则 MyBatis 无法区分关联表字段。)可在多个查询中复用映射规则,避免重复配置。属性引用已定义的映射(如。),同一关联对象(如。JOIN 查询中必须为。
2025-06-17 16:19:08
917
原创 MyBatis :何时选择连接查询,何时使用<collection>标签?
一对多关联连接查询是主流选择,因其性能可控、实现直观;嵌套查询仅在深度延迟加载场景有价值。多对多关联MyBatis不推荐直接实现,应通过中间表拆解为两个一对多,避免复杂度和性能陷阱。
2025-06-17 15:55:12
1430
原创 Spring Boot 数据校验: Bean Validation 注解、分组校验与全局异常处理
注解作用示例自定义校验器在 Spring Boot 2.3.x 版本中,Bean Validation 参数校验的使用方式与之前版本略有不同,尤其是在错误处理和响应格式的自定义上。从 Spring Boot 2.3 开始,spring-boot-starter-validation 不再默认包含,需要手动添加依赖错误属性的获取方式略有变化,推荐使用 ErrorAttributeOptionsSpring Boot 2.3.x 中推荐使用。
2025-06-17 13:48:53
741
原创 Spring Boot 和 Spring Security 实现 JWT 认证
在 Spring Security 中,UsernamePasswordAuthenticationToken 的 authorities 参数用于注入当前用户的权限集合(Collection<?JWT 是一种开放标准(RFC 7519),用于在网络应用间安全传递 JSON 格式的声明信息。JWT 在微服务、跨域单点登录(SSO)场景中优势显著。JWT 由三部分组成,以点号。
2025-06-16 16:13:20
1681
原创 OAuth 2.0相关知识
发放Access Token和Refresh Token。用client_id和client_secret申请令牌。:客户端需存储用户密码,仅在无法使用其他模式时使用。用code换取令牌(附client_secret)直接返回Access Token(通过URL哈希):令牌可能被前端脚本拦截,仅适用于低安全需求场景。携带Access Token请求资源。发放Access Token。发放Access Token。返回授权码(code)携带Token请求资源。携带Token请求资源。携带Token请求资源。
2025-06-16 15:14:26
414
原创 Spring RestTemplate + MultiValueMap vs OkHttp 多值参数的处理
RestTemplate的MultiValueMap原生支持多值参数(如role=admin&role=editor),自动处理URL编码,适合Spring生态。OkHttp的FormBody需显式多次添加同名参数,且参数强制位于请求体,性能更高,支持HTTP/2,适合非Spring或高并发场景。
2025-06-16 14:56:43
781
原创 MySQL索引优化:回表
当查询语句通过非聚簇索引找到匹配的主键值后,需要根据主键值再次查询聚簇索引(即数据表),以获取其他字段的数据,这个过程称为。
2025-06-13 17:15:53
304
原创 Spring Cloud Gateway + JWT 单点登录实现方案(无独立的认证服务器)
摘要:本文介绍了基于Spring Cloud Gateway和JWT实现的微服务单点登录方案。通过网关统一认证和JWT无状态令牌,简化了传统认证服务器架构。系统采用三层结构:API网关(处理认证/路由)、资源服务(提供业务接口)和客户端应用。关键技术实现包括:网关安全配置、JWT令牌生成/验证、用户认证服务集成以及MyBatis-Plus数据访问。方案提供了完整的YML配置示例、实体类定义、数据访问层实现和安全过滤器配置,实现了分布式系统的高效身份认证与授权管理。
2025-06-13 09:52:56
778
原创 Spring Cloud Gateway + OAuth2 + JWT 单点登录(SSO)实现方案
基于Spring Cloud微服务架构,通过Gateway网关、OAuth2协议和JWT令牌实现分布式系统的单点登录,允许用户一次登录后访问所有互信的微服务。:统一请求入口,负责路由、Token验证和转发OAuth2协议:定义授权流程,实现用户认证和授权码交换:作为无状态令牌载体,包含用户身份和权限信息。
2025-06-12 17:30:37
835
原创 基于 Redis 的幂等性设计:SpringBoot @Async 在高并发 MySQL 日志存储中的应用
幂等性是指对同一操作的多次请求,应该产生与一次请求相同的效果。防止重复处理:避免因网络波动、客户端重试等原因导致的重复业务处理提高系统稳定性:减少系统资源浪费,防止数据不一致增强用户体验:避免因重复请求导致的业务异常。
2025-06-12 14:12:45
1077
原创 在 Spring Boot 中,@RequestBody 注解无法直接处理 application/x-www-form-urlencoded 格式的表单数据
1.接收方式适用场景:传输简单键值对(如表单提交,无文件上传)。接收方式(单个参数)) {(动态参数)(绑定实体类)注意事项参数编码:确保请求与响应编码一致(通常为 UTF-8)。PUT 请求支持:需添加过滤器(Tomcat 默认不解析 PUT 表单数据)。参数重复只保留最后一个值,需用获取全部值。2.接收方式适用场景:传输文件或混合文本与二进制数据(如表单上传)。接收方式(单个文件)) {实体类 +(混合数据)@Data多文件上传Element UI 多文件上传。
2025-06-12 10:43:14
891
原创 基础知识:抽象类成员变量的继承与使用
Java中,子类会继承抽象父类的所有成员变量和方法。继承规则受访问修饰符影响:public和protected可直接访问,默认包级私有则需同包,private仅能通过公共方法间接访问。实际应用中,子类可直接使用父类注入的Redis工具类,如redisTemplate和valueOperations,实现缓存操作。建议使用protected访问权限,封装常用操作为父类方法供子类调用,必要时可重写方法。这种方式遵循"开放-封闭"原则,既实现了代码复用,又保留了扩展灵活性。
2025-06-11 16:23:56
204
原创 java8 通过方法引用 vo::setLevel将对象的 setter 方法作为参数传递
【代码】java8 通过方法引用 vo::setLevel将对象的 setter 方法作为参数传递。
2025-06-10 13:56:45
112
原创 基于 Spring Boot 策略模式的短信服务提供商动态切换实现
自动装配机制:Spring 会自动识别SmsService接口的所有实现类,并将它们注册为Bean。在扫描类路径时,一旦发现被@Service(或其他合适的组件扫描注解,如@Component等)注解标记且实现了指定接口的类,就会将其纳入 Spring 容器管理,使其成为一个可被注入和使用的Bean。Map 注入:通过这样的参数类型声明,Spring 利用其依赖注入功能,自动将所有实现了SmsService接口的Bean注入到这个Map中。
2025-06-09 16:00:05
1096
原创 MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
脏读、幻读和不可重复读是在数据库事务并发操作中可能出现的不同数据一致性问题,不同的数据库引擎(如 InnoDB 和 MyISAM)在不同的隔离级别下,对这些问题有着不同的处理方式。InnoDB 引擎通过诸如 MVCC(多版本并发控制)和间隙锁等机制,在合适的隔离级别下能够有效地避免幻读和不可重复读等问题,而 MyISAM 引擎由于自身的特性,在类似场景下较难避免这些问题。
2025-06-09 13:48:57
838
原创 使用 @MapperScan 后 DAO 接口无需 @Component 或 @Repository 的原因分析
使用 @MapperScan 后 DAO 接口无需 @Component 或 @Repository 的原因分析
2025-06-09 09:30:06
704
原创 MySQL索引优化:全文索引
在MySQL中,是一种专门为文本数据设计的索引类型,用于高效处理自然语言搜索(如文章内容、评论、关键词匹配等)。与传统的B-Tree索引相比,全文索引在处理大量文本数据时性能更优,且支持更复杂的搜索语法。CHARVARCHARTEXTMySQL*"数据库设计"MySQL内置分词器对中文支持不佳(默认按空格分词),需使用第三方插件(如ngram全文索引的维护成本高于普通索引,写入操作可能变慢。MATCHUPPER()WHERE全文索引通常比原数据大,需预留足够磁盘空间。
2025-06-06 15:25:30
906
原创 MySQL 索引优化
MySQL 5.6引入的索引下推(Index Condition Pushdown)技术可以部分优化不符合最左前缀的查询。当创建复合索引时,MySQL会按照索引定义的字段顺序,从左到右使用这些字段来构建索引结构。不在最左前缀中,但索引下推可以在索引扫描时过滤。条件,减少回表次数,提高性能。
2025-06-06 13:18:40
1061
原创 Spring Boot实现接口时间戳鉴权
Spring Boot接口时间戳鉴权方案通过请求头传递签名(X-Signature)和时间戳(X-Timestamp)。签名算法使用MD5,基于密钥、URL路径和时间戳生成。实现流程包括:创建拦截器校验时间戳有效性和签名一致性,配置拦截路径,并支持自定义时间窗口。客户端需在请求头中添加上述参数,服务端通过拦截器自动完成鉴权,保障接口安全性。该方案适用于需要时效性和防篡改的API场景。
2025-06-06 09:38:43
557
原创 Spring Boot + MyBatis-Plus 读写分离与多 Slave 负载均衡示例
本文介绍了一个基于Spring Boot和MyBatis-Plus实现读写分离与多从库负载均衡的示例项目。项目采用动态数据源路由机制,通过自定义注解和数据源上下文实现主从库的自动切换。核心实现包括:1) 定义数据源类型枚举;2) 使用ThreadLocal保存当前数据源;3) 配置多个主从数据源;4) 通过AOP切面实现读写分离路由;5) 提供从库负载均衡策略。该方案支持在主库执行写操作,在多个从库之间轮询执行读操作,优化数据库访问性能。
2025-06-03 15:25:49
847
1
原创 在Java中,循环内声明变量和循环外声明变量的主要区别
Java中循环内外声明变量的区别主要在于作用域和生命周期:循环外变量可在循环后继续使用,适合保留状态;循环内变量仅限循环内部使用,提高代码可读性。对于基本数据类型,性能差异可忽略;对象类型在循环内频繁创建可能增加内存开销,但现代JVM优化后影响不大。建议优先考虑代码可读性,仅在处理高成本对象时考虑声明位置优化。实际开发中应基于性能分析而非臆测进行优化。
2025-06-03 14:42:23
639
原创 MySQL索引支持排序
MySQL索引排序原理与优化实践:B+树索引的有序性天然支持排序操作,当ORDER BY字段与索引列匹配时,数据库可直接利用索引返回有序数据,避免额外排序开销。索引排序需满足字段顺序、排序方向一致且避免函数操作等条件,多字段排序需匹配复合索引结构。通过EXPLAIN验证索引使用情况,合理设计索引(如分页查询优化、联合唯一索引)可显著提升查询性能。MySQL 5.7+支持指定索引列排序方向,而旧版本仅默认升序。
2025-06-03 13:29:42
906
原创 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
339
原创 将冗长的 if-else 条件判断语句改为使用 Map 进行映射查找
摘要 将if-else条件判断优化为Map映射能提升代码简洁性、可维护性和性能。Map查找时间复杂度从O(n)降至O(1),新增条件只需修改映射表。示例显示,Map版本更简洁直观,适用于状态码映射、类型匹配等固定条件场景,特别是分支超过3个时优势明显。
2025-05-27 10:40:12
409
原创 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
691
原创 典型的**N+1查询问题**
典型的:当需要查询主实体及其关联子实体时,传统做法是先查询主实体,再循环查询每个主实体对应的子实体,导致数据库查询次数为,性能较差。
2025-05-15 15:18:07
298
springboot集成阿里oss实现文件上传(复制粘贴可用)
2025-06-22
mongodb可视化工具(兼容较低版本使用)
2025-01-23
能用Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)
2024-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人