自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (2)
  • 收藏
  • 关注

原创 Spring面试宝典:Spring IOC的执行流程解析

Spring IOC的工作流程解析:从配置到依赖注入,Spring容器通过控制反转机制自动管理对象的创建和依赖关系。核心流程包括解析配置生成BeanDefinition、注册到容器、反射实例化单例Bean、完成依赖注入等步骤,最终通过@Autowired或getBean()获取实例。这种设计降低了代码耦合度,提高了可维护性和扩展性,让开发者更专注于业务逻辑的实现。面试时可简明阐述这三个阶段,强调IOC带来的解耦优势。

2025-08-21 22:05:50 944

原创 MySQL面试题:联合索引是什么?最左前缀原则你真的懂吗?

MySQL联合索引是面试高频考点,其本质是在多个列上创建的B+树索引,按字段顺序排序存储。核心是最左前缀原则:查询必须包含索引最左连续列才能生效。例如索引(name,age,position),仅查询name或name+age能走索引,而单独查age或position则无效。联合索引优势在于提升多条件查询性能、支持覆盖索引,但存在写入开销大、列序敏感等缺点。实际业务中,可通过ETL预计算配合联合索引实现高效查询,如按日期-公司-员工ID创建主键索引来优化报表查询性能,体现"空间换时间"的

2025-08-19 00:29:29 640

原创 MySQL面试题:MyISAM vs InnoDB?聚簇索引是什么?主键为何要趋势递增?

MySQL面试重点:存储引擎与索引设计 摘要:MyISAM与InnoDB的核心区别在于事务支持、锁粒度和索引结构。InnoDB采用聚簇索引,数据与主键索引一体存储,查询效率更高;而MyISAM使用非聚簇索引,需回表查询。主键设计推荐趋势递增的ID(如雪花算法),避免UUID导致的性能问题。在分库分表场景下,雪花ID能保证全局唯一且易于路由。哈希索引虽查询快但不支持范围操作,适合特殊场景。InnoDB凭借事务支持、行级锁和聚簇索引优势,成为现代应用的首选存储引擎。

2025-08-18 21:26:30 721

原创 MySQL面试高频题:遇到慢SQL,你第一反应是什么?

文章摘要:慢SQL处理是开发和面试中的常见问题。核心解决思路包括:1)使用EXPLAIN分析执行计划,检查索引使用情况;2)排查索引缺失或失效;3)评估引入Redis缓存热点数据;4)优化SQL写法,避免SELECT*、深分页等问题;5)必要时考虑分库分表架构升级。系统性的排查应涵盖执行计划分析、索引优化、缓存引入、SQL改写和架构调整等多个维度,而非简单"加索引"。(149字)

2025-08-18 20:27:18 288

原创 B+树索引分析:单表最大存储记录数

本文探讨数据库分库分表的时机与B+树索引结构特性。当单表数据量预计三年内超500万条或2GB时,建议实施分库分表策略,以解决查询性能下降、备份困难等问题。文章详细分析了B+树三层结构下的存储容量计算,指出理论上单表可存储约4亿条记录,但实际需考虑页分裂、索引开销等因素。最终强调应结合业务需求,在数据量接近500万条时提前规划分库分表,确保系统高效运行和维护便利。

2025-08-16 20:27:18 209

原创 数据库索引视角:对比二叉树到红黑树再到B树

本文对比分析了数据库索引中常用的数据结构。二叉树在小规模数据中表现良好,但存在退化风险;红黑树通过自平衡特性解决了退化问题,但树高仍较大。B树通过多路搜索降低了树高,但数据存储效率不高。B+树在此基础上进一步优化,将数据集中存储在叶子节点,非叶子节点仅存索引,显著提高了范围查询效率和磁盘利用率。这些特性使B+树成为数据库索引的首选结构,能够有效降低树高、减少I/O操作,特别适合处理大规模数据。

2025-08-16 19:30:34 467

原创 MyBatis 更新操作的“坑”与最佳实践:为什么建议先查再更?

摘要:MyBatis-Plus的updateById方法使用需谨慎,特别是字段为null时的更新策略。默认FieldStrategy.NOT_NULL只更新非空字段,但若配置为ignored则会用null覆盖已有值。建议采用"先查后更"模式:先查询实体,再复制属性后更新,避免null值意外覆盖数据库原有数据。这种做法虽增加一次查询,但能有效保护数据完整性,是更安全的更新方式。

2025-08-14 12:09:57 271

原创 商品分类拖拽排序设计

本文探讨了拖拽排序功能的两种后端实现方案。方案一采用数组结构,通过sort字段排序,实现简单但可能引发大量数据更新;方案二采用链表结构,通过prev_id和sibling_id字段构建关系,适合频繁操作但查询效率较低。文章建议根据数据量和操作频率选择方案:小数据量选择数组结构,大规模数据选择链表结构。两种方案各有优劣,需结合实际业务需求进行选择。

2025-08-13 22:02:11 261

原创 逻辑删除 vs 物理删除:MyBatis-Plus 实现指南与实践

本文探讨了数据库删除操作的两种方式:逻辑删除和物理删除。逻辑删除通过标记数据为"已删除"状态保留数据,适用于需保留历史、关联性强或审计要求的场景;物理删除则彻底移除数据,适用于临时数据清理。重点介绍了MyBatis-Plus中实现逻辑删除的正确方法:使用@TableLogic注解配置删除标记字段,并推荐进行全局配置。文章强调删除前必须校验参数合法性、数据存在性,并根据业务场景选择合适的删除方式,核心原则是"能不删就不删,能逻辑删就不物理删"。

2025-08-12 22:19:31 750

原创 学习分库分表的前置知识:高可用系统架构理论与实践

一致性 (Consistency):所有节点必须同时返回相同的数据。可用性 (Availability):非故障节点在合理时间内返回合理的响应。分区容错性 (Partition Tolerance):即使网络分区发生,系统仍然能够正常工作。构建高可用系统架构是一项复杂的任务,涉及读写分离、CAP 定理的应用以及数据分片等多种技术手段。通过合理的架构设计和工具选型,可以在保障系统稳定性的同时,提升性能和可扩展性。

2025-08-10 21:46:29 784

原创 ✨ 基于 JsonSerialize 实现接口返回数据的智能枚举转换(优雅告别前端硬编码!)

摘要:本文介绍了一种优雅的Java后端解决方案,通过MyBatis-Plus的IEnum接口和自定义JsonSerializer,实现枚举值与前端展示的自动映射。当数据库中存储枚举编码(如"aliyun")时,系统能自动在接口返回时附加中文描述字段(如"providerDesc":"阿里云")。该方案基于MyBatis-Plus的枚举支持,结合自定义序列化器OxJsonSerialize,在序列化阶段动态添加描述字段,实现前后端解耦,避免在Serv

2025-08-09 23:04:30 934

原创 使用 Hutool 工具包优雅处理异常:从引入到全局捕获

为了统一响应格式并友好提示用户,我们通过实现全局异常拦截:@Slf4j/*** 拦截未知的运行时异常 🚨*/log.error("请求地址'{}', 发生未知异常.", requestURI, e);/*** 拦截通用异常(包括 IllegalArgumentException)🔧*/log.error("请求地址'{}', 发生系统异常.", requestURI, e);String msg;msg = "非法参数: " + e.getMessage();

2025-08-09 01:04:45 368

原创 记录一次Spring Cloud Gateway配置的跨域处理:解决 ‘Access-Control-Allow-Origin‘ 头包含多个值的问题

摘要:本文针对微服务架构中常见的CORS跨域问题,提出了重复设置Access-Control-Allow-Origin报错的解决方案。通过分析发现,该问题源于多个服务层同时配置CORS导致的响应头冲突。作者建议删除各微服务中的CorsConfig配置,仅在SpringCloudGateway中统一设置CORS策略,并提供了具体实现代码示例。同时强调生产环境应避免使用通配符"*",而需明确指定允许的源地址以确保安全性。

2025-08-02 19:55:50 293

原创 Nacos 服务部署指南:基于 Docker 的单机模式安装与配置

本文详细介绍了使用Docker部署Nacos服务并配置MySQL持久化的完整流程。主要内容包括:拉取指定版本Nacos镜像、创建持久化目录、初始化配置文件、创建MySQL数据库及表结构,以及通过docker run命令启动Nacos容器并连接MySQL。文中提供了关键参数说明、安全建议和常见问题排查方法,特别强调了单机模式下部署的注意事项。该方案支持配置、日志和数据的持久化存储,适合开发测试环境使用,同时为生产环境部署提供了优化建议,如使用Docker Compose管理、启用HTTPS等。

2025-07-31 02:08:55 954 1

原创 设计一个高并发、高可用的秒杀系统【AI】

秒杀系统架构设计全解析:150字技术摘要 秒杀系统需应对瞬时流量洪峰、超卖风险和恶意刷单三大挑战。本文提出七层优化方案:1)前端通过按钮置灰和Token机制防重复提交;2)Nginx实现负载均衡和IP限流;3)网关层集成Sentinel进行API级流控;4)Redis+Lua脚本保证原子性减库存;5)MQ异步削峰处理下单流程;6)Sentinel提供熔断降级保护;7)Seata确保分布式事务一致性。核心采用"Redis预减库存+MQ异步下单"架构,配合CDN静态化、微服务拆分、本地缓存等

2025-07-30 07:31:06 802

原创 Nginx 和 Host 文件的关系:开发与部署中的应用

本文介绍如何通过Nginx和hosts文件配置实现本地开发环境与远程服务的灵活切换。详细说明了为test-merchant.com项目设置本地代理的Nginx配置方法,以及通过修改hosts文件指向不同IP地址来访问测试服务器或公司内部GitLab实例的操作步骤。同时提及HTTPS环境下可能需要额外配置SSL证书的情况。这些方法为开发测试提供了便捷的环境切换方案。

2025-07-27 02:34:06 211

原创 docker 从主机复制文件到容器外进行编辑

当Docker容器出现"bash:vi:command not found"错误时,可通过文件复制方式解决。首先使用docker cp命令将容器内文件(如my.cnf)复制到主机进行编辑,完成后用相同命令将修改后的文件复制回容器。此方法无需安装vi编辑器,只需替换实际的容器ID和文件路径即可完成配置修改。

2025-07-26 22:38:26 283

原创 Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用

本文深入解析了Java中Thread、ThreadLocal和ThreadLocalMap的关系及实现原理。ThreadLocal通过ThreadLocalMap为每个线程存储本地变量,采用弱引用避免内存泄漏。主要应用场景包括用户上下文传递、数据库事务管理、日志追踪ID等。使用时需注意在finally块或AOP中调用remove()清理资源,特别是在线程池环境下,防止内存泄漏和数据污染。推荐结合try-finally或Spring AOP实现自动清理机制,确保线程安全。

2025-07-18 22:17:54 1057

原创 synchronized锁升级过程【AI笔记,仅供自己参考】

锁升级是指 JVM 在运行时根据对象的使用情况,对对象的锁状态进行动态优化的过程。它不是“升级为更重的锁”,而是从轻量级锁逐步升级到重量级锁的过程,以在不同竞争程度下取得性能平衡。步骤锁类型触发条件1无锁状态初始状态2偏向锁第一次加锁(单线程)3轻量级锁多线程交替访问(CAS)4重量级锁线程竞争激烈(锁膨胀)

2025-07-18 21:31:49 620

原创 Mybatis-Plus 在 getOne() 的时候要加上 .last(“limit 1“)

摘要:MyBatis-Plus中通过.last("limit 1")优化SQL查询性能,确保只返回一条记录。该方法在查询末尾追加LIMIT 1,避免全表扫描(性能优化)并防止多条结果导致的异常(代码健壮性)。示例代码展示了在CardShelfRecord查询中使用该技巧,通过组合cardId、historyCardId和endDate条件,最终生成带LIMIT 1的高效SQL语句。这种写法既解决了多结果集问题,又提升了数据库查询效率。参考:MyBatis-Plus的ServiceImpl

2025-06-23 17:37:57 560 2

原创 Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解

在开发电商系统时,我们经常需要处理订单信息的展示需求。例如:订单详情页需要显示退款信息列表,而数据库中存储的RefundInfo实体类包含敏感字段,直接返回给前端存在安全风险。此时就需要将RefundInfo对象转换为视图

2025-05-07 10:46:49 582

原创 对ElementPlus的el-select二次封装,添加分页和搜索功能,实现一个自定义的下拉选择框

在的项目中,我们经常需要使用下拉选择框 () 来展示大量数据。然而,默认情况下 el-select 不支持分页和搜索功能。本文将介绍如何通过二次封装组件来实现这一需求,并使用自定义的来简化开发流程。

2024-10-12 13:37:44 2766 2

原创 vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?

Nginx 的try_files配置是为了处理 Vue.js 应用程序的历史模式路由,而不是真正根据 URL 返回不同的 HTML 文件。它的作用是将所有请求重定向到同一个入口点(即),然后由 Vue Router 在客户端处理 URL 变更。这样可以让应用程序看起来像多页面应用,但实际上仍然是一个单页面应用。Nginx 配置: 当您在 Nginx 中添加try_files指令时,它告诉 Nginx 如果请求的 URI 存在,则尝试查找该目录下的index.html文件。如果没有找到,它将回退到根目录下的。

2024-10-04 01:04:24 1090 4

原创 RequestContextHolder的作用 以及 使用RequestContextHolder对表格的Page进行处理,简化开发

之前学习RequestContextHolder只是粗略的过了一遍,实际开发中 并没有找到使用场景, 最近学习 Ruoyi源码倒是有所感悟。可以看到合理的使用RequestContextHolder可以在前后端约定好分页参数的前提下,对表单数据进行分页处理,能够简化代码,统一风格,通过TableSupport工具类中的buildPageRequest()方法自动从请求中提取分页参数,并封装成PageDomain对象。这样,业务逻辑代码无需直接处理分页参数,而是直接使用PageDomain对象。

2024-07-12 11:21:29 903 1

原创 神舟Phison SATA SSD掉盘成SATAFIRM S11那件事【该方案只能初始化数据】

最近真的很烦,正好买神舟的电脑3年,固态就掉盘了,很多重要的数据都丢了, 所以说,重要的资料,笔记,代码 要么存机械硬盘上,要么存云上,一定要有备份!!!!!本人也算是硬件方面的小白 参考了这个【主要是帮大家找资料-->我已经上传了】:因为本人不是玩硬件的所以不想浪费时间,博客10分钟左右做好的前提是:开机BIOS识别硬盘为SATAFIRM S11,同时无法开机,提示“硬盘错误,按任意键重启”。

2024-07-07 02:27:54 2553 1

原创 Docker打包至云服务器

命令,将数据卷内容打包成一个归档文件并保存到主机上的备份目录中。会得到 docker_backup_20240615_220510 文件【里面就是.tar和数据卷文件了】修改:backup_dir=“docker_backup_YYYYMMDD_HHMMSS” 为自己的文件名。这个就不多加赘述了网上的教程很多,建议也使用shell 脚本安装【算了,还是加上吧】一样的创建.sh为后缀的文件,sh xxx.sh执行 就好了。运行:export_all.sh 脚本。创建文件:restore_all.sh。

2024-06-16 00:21:10 529 1

原创 MySQL树形表的查询方案

在数据库中,树形结构的数据表是一种常见的需求,本文将介绍两种常见的MySQL树形表查询方案,并对它们的适用场景和优缺点进行比较。

2024-06-08 21:19:26 1448 3

原创 Vue 3 中的 ref() 如何使用空引用获取 DOM 元素

4.ref() 执行的时候dom元素还未渲染 如何绑定的当使用 ref 创建一个引用对象时,确实在执行 ref() 的时候并没有拿到 DOM 元素。ref() 返回的是一个响应式对象,其中包含一个 .value 属性,初始时这个 .value 属性是 undefined。然而,在 Vue 组件渲染后,Vue 会自动将对应的 DOM 元素赋值给 ref 创建的引用对象的 .value 属性。这个过程是由 Vue 在组件的生命周期中完成的,在组件渲染后,Vue 会查找模板中使用 ref 指令标记的元素

2024-06-06 13:42:58 690 1

原创 Dockerfile 和 Docker Compose 组合的实践

在实际开发中,Docker 已经成为了不可或缺的工具之一。而 Dockerfile 和 Docker Compose 的结合使用,则更是提高了容器化部署的效率和便利性。本文将介绍如何结合使用 Dockerfile 和 Docker Compose,并分享一些实践和注意事项。

2024-05-14 13:11:15 1397

原创 当进行数据库操作时如果基于非主键字段进行删除,并且该字段没有索引,可能会导致InnoDB使用表级锁而不是行级锁

这种情况下,可能会影响其他事务的并发性能,从而降低系统的稳定性和效率。举例来说,假设我们有一个名为现在,假设我们开启了两个事务事务1执行了删除操作,而事务2执行了更新操作。事务1的删除操作没有基于索引字段,而事务2的更新操作由于表级锁的缘故无法执行。

2024-03-27 19:34:28 417

原创 Java SpringBoot 教程:使用阿里云OSS实现通用文件上传接口

文件上传接口应该作为通用的API接口,附上时序图。文件上传接口是Web开发中常见的功能之一,通过该接口可以实现将文件上传至服务器并进一步存储到云存储服务中。本文将介绍如何实现一个通用的文件上传接口,并提供后端代码示例。

2024-03-26 19:44:06 2330 5

原创 在Spring Boot项目中统一格式化处理LocalDate日期,需要添加MappingJackson2HttpMessageConverter消息转换器,并进行相关配置

在Spring Boot项目中统一格式化处理LocalDate日期,需要添加MappingJackson2HttpMessageConverter消息转换器,并进行相关配置,由于Spring Boot场景启动器已经包含了Jackson的依赖,因此无需额外导入新的依赖。

2024-03-21 14:21:30 886 8

原创 系统无法正确处理customSqlSegment表达式

今天学习mybatisPlus的自定义SQL的时候customSqlSegment无法执行,在网上找不到答案,浪费了40分钟,为了让小伙伴们少走弯路所以呈上本人的解决方案【暂时的】添加JVM参数--add-opens java.base/java.lang.invoke=ALL-UNNAMED。:通过向JVM添加参数来放宽对。

2024-03-08 23:09:04 612 1

原创 SpringMVC的执行流程

客户端发送请求到DispatcherServlet,DispatcherServlet作为前端控制器,将请求交给HandlerMapping进行处理。此步骤完成请求到处理器的映射。DispatcherServlet根据HandlerExecutionChain获取拦截器,执行拦截器的preHandle方法。拦截器的postHandle方法在Handler处理器处理完请求后执行,可对ModelAndView做进一步处理。ModelAndView是一个包含模型数据和逻辑视图名的对象,此步骤表示请求处理完成。

2023-12-22 17:51:57 474

原创 解决Tomcat10无法运行SpringMVC项目的问题

【代码】解决Tomcat10无法运行SpringMVC项目的问题。最近,使用Tomcat10运行SpringMVC项目时遇到了问题。报错内容为"org.springframework.web.servlet.DispatcherServlet' is not assignable to 'javax.servlet.Servlet,jakarta.servlet.Servlet"或者org.springframework.web.servlet.DispatcherServlet"。

2023-12-09 22:49:41 1071

原创 记录mybatis的SqlSession对象的getMapper()动态生成代理类

Javassist是一种用于Java字节码操作的库,它提供了一种方便的方式来在Java运行时动态地修改类或者生成新的类。通过Javassist,开发人员可以在不需要编写Java源代码的情况下,动态地生成Java程序,并且可以对已有的Java程序进行修改,这种操作对于一些需要动态生成类或者需要在运行时动态修改类的应用场景非常有意义,比如AOP框架、ORM框架和Java服务器容器等。

2023-10-03 22:05:32 366

原创 dom4j遍历mybatis.config.xml文件的简单demo

简单的记录学习正在学习mybatis,很好奇mybatis是怎么加载mybatis.config.xml的,所以做了一个小demo加深学习mybatis-config.xml 放在类路径下。

2023-08-28 18:52:49 195 1

原创 MYSQL中的四种隔离级别

- 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据。-- 不可重复读(Non-repeatable Read):一个事务多次读取同一数据,但在事务过程中,其他事务对该数据进行了修改,导致读取到的数据不一致。-- 幻读(Phantom Read):一个事务多次读取同一数据范围,但在事务过程中,其他事务对该范围内插入或删除了数据,导致读取到的数据集合发生了变化。

2023-08-07 11:47:22 139 1

原创 基于wait和notify的生产消费者模式Demo

【代码】基于wait和notify的生产消费者模式Demo。

2023-07-25 14:54:24 103

原创 简单的Java文集拷贝Demo

【代码】简单的Java文集拷贝Demo。

2023-07-21 12:16:35 76 1

空空如也

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

TA关注的人

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