- 博客(41)
- 收藏
- 关注
原创 SpringBoot项目里面发起http请求的几种方法
在Spring Boot项目中,发起HTTP请求有多种方法。常用的包括:1. RestTemplate,适用于Spring 5之前的项目,支持GET和POST请求;2. WebClient,Spring 5+推荐的响应式方式,适合新项目;3. HttpClient,Java 11+内置,简单易用;4. Feign Client,声明式REST客户端,适合Spring Cloud项目;5. 第三方库如OkHttp和Apache HttpClient,提供更多控制。选择时,新项目推荐使用WebClient或Ht
2025-05-18 11:51:11
444
原创 Spring Boot 整合 Redis 实战
本文详细介绍了如何将Spring Boot与Redis进行整合,以实现高性能缓存、分布式锁和会话共享等功能。首先,文章说明了所需的技术栈,包括Spring Boot 3.1.2、Redis 7.0+以及相关的Maven依赖。接着,文章详细描述了如何启动Redis服务,无论是本地启动还是通过Docker容器。在基础整合部分,文章介绍了如何配置application.yml文件以及如何自定义RedisTemplate的序列化方式。实战案例部分展示了如何使用RedisTemplate进行简单的CRUD操作,以及如
2025-05-13 21:56:16
1048
原创 深入理解 OAuth 2.0:技术核心与实战场景
选 SSO:当需要在多个自有系统间实现 “一次登录”,且核心需求是身份认证的跨系统共享(如企业内部系统整合)。选 OAuth2(或 OpenID Connect):当涉及第三方应用访问用户资源,或需要在不同信任域之间进行授权(如 “第三方登录”“API 权限管理”)。结合使用。
2025-05-13 21:14:39
1068
原创 Vite简单介绍
Vite 是一个现代化的前端构建工具,由 Vue.js 的创始人 Evan You 开发,旨在提供更快的开发体验和更高效的构建流程。Vite 采用无打包(unbundle)机制,利用浏览器原生支持 ES Modules(ESM)的特性,按需编译和加载文件,而不是像 Webpack 那样预先打包整个应用。Vite 凭借其极速的开发体验和现代化的构建方式,已成为前端开发的重要工具,尤其适合追求高效开发的团队。开发模式下,Vite 不会预先打包所有代码,而是根据浏览器的请求动态编译文件,减少不必要的计算68。
2025-05-05 21:42:44
562
原创 SpringBoot实战:整合Knife4j
Knife4j 是一个为 Java MVC 框架集成 Swagger 生成 API 文档的增强解决方案,前身是 Swagger-Bootstrap-UI。相比于Swagger,Knife4j提供了更美观、现代化的 UI 界面,增强了交互性。WebMvcConfig配置SpringMVC信息/*** web层配置类,实现静态资源映射,将knife4j相关资源放行,保证生成的接口文档能够正常进行展示*//*** 设置静态资源映射*/@Override// 添加静态资源映射规则。
2025-05-05 12:09:23
1594
原创 Java 线程池
在 Java 多线程编程中,线程的创建和销毁是有一定开销的,频繁地创建和销毁线程会消耗大量系统资源,降低程序性能。Java 线程池的出现,很好地解决了这个问题,它通过对线程的复用,提高了系统资源的利用率,同时还能对线程进行有效的管理。
2025-05-05 10:09:30
871
原创 Java 中使用 Callable 创建线程的方法
Callable接口为 Java 多线程编程带来了更丰富的功能和更高的灵活性,通过与FutureTask或ExecutorService线程池结合使用,我们可以方便地获取线程执行结果并进行异常处理。在实际开发中,当我们需要在多线程任务执行完毕后获取结果,或者需要更精细地处理任务执行过程中的异常时,Callable接口是一个非常好的选择。同时,合理利用线程池来管理Callable任务,能够提高程序的性能和资源利用率,让多线程程序更加高效、稳定地运行。
2025-05-04 23:25:10
1033
原创 ReentrantLock实现公平锁和非公平锁
在 Java 里,公平锁和非公平锁是多线程编程中用于同步的两种锁机制,它们的主要差异在于获取锁的顺序规则。
2025-05-04 23:18:34
416
原创 Java 集合线程安全
在多线程环境下使用 Java 集合类时,一定要充分考虑线程安全问题。对于ArrayList和HashMap这类非线程安全的集合,开发者可以根据具体的业务场景选择合适的解决方案,如使用同步包装类或者 Java 并发包中提供的线程安全集合类。只有正确处理集合的线程安全问题,才能确保程序在多线程环境下稳定、高效地运行。以上从多个方面介绍了 Java 集合的线程安全知识。若你对博客的内容深度、示例类型还有其他想法,欢迎随时和我说。
2025-05-04 23:01:39
1325
原创 Java中的Synchronized、ReentrantLock和ReentrantReadWriteLock比较
特性锁类型隐式内置锁显式锁显式读写分离锁获取方式自动获取释放手动lock/unlock手动获取读/写锁公平性非公平可选择公平/非公平可选择公平/非公平可重入是是是读写分离否否是条件变量有限的wait/notify支持多个Condition支持多个Condition锁降级不支持不支持支持性能JVM优化后性能较好高竞争时性能较好读多写少场景性能优死锁检测不支持部分支持部分支持。
2025-05-04 11:07:16
291
原创 Java中的死锁及解决方法
死锁(Deadlock)是指两个或多个线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,导致这些线程都无法继续执行下去。互斥条件:资源一次只能由一个线程占用请求与保持条件:线程在持有至少一个资源的同时又请求其他被占用的资源不剥夺条件:已分配给线程的资源不能被其他线程强行夺取循环等待条件:存在一个线程等待的循环链。
2025-04-23 10:29:10
182
原创 盘点各种类型的数据库(除了关系型和非关系型数据库)
数据库可以根据不同的标准(如数据模型、用途、架构等)分为多种类型。:基于表格结构,使用 SQL(结构化查询语言),支持 ACID 事务。:兼顾分布式与 ACID,如 TiDB、CockroachDB。高速读写,如 Redis、Memcached、SAP HANA。:用于 AI 向量检索,如 Milvus、Pinecone。:支持多种数据模型,如 ArangoDB(文档+图)。:如 BigchainDB(存储区块链数据)。单机部署,如传统 MySQL、Oracle。:优化时间序列数据(如传感器、日志)。
2025-04-02 17:15:05
488
原创 Redis场景问题3:缓存雪崩
Redis 缓存雪崩是指在 Redis 缓存中,大量的缓存数据在同一时间内失效,导致大量请求直接涌向数据库,从而可能使数据库不堪重负,甚至引发系统崩溃的情况。
2025-03-29 10:33:08
262
原创 Redis场景问题2:缓存击穿
Redis 缓存击穿是指在缓存系统中,大量请求同时访问一个不存在于缓存中(一般是因为缓存过期或者数据未被加载到缓存)但在数据库中存在的热点数据,从而导致这些请求直接穿透缓存层,涌向数据库,可能造成数据库压力过大甚至崩溃的情况。
2025-03-29 10:31:25
703
原创 Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为你详细介绍其产生原因、解决方案以及示例代码。
2025-03-29 10:27:16
414
原创 剖析 Redis 缓存更新策略:保障数据一致性与系统性能的平衡
Redis 作为一款高性能的键值对存储数据库,广泛应用于缓存场景,极大地提升了系统响应速度和吞吐量。然而,缓存与后端数据源(如数据库)之间的数据一致性问题一直是个挑战,合理的缓存更新策略至关重要。这篇博客将带你深入探讨 Redis 缓存更新的多种策略及其优缺点,助你在不同业务场景下做出明智抉择。
2025-03-29 10:07:05
781
原创 简单聊聊Oracle和MySQL数据库的区别和使用场景
对于IT的技术人员,MySQL是非常熟悉的开源数据库,在各个行业被广泛应用。但是对于Oracle数据库,很多专业的IT从业人员不太了解,今天就来聊一聊Oracle和MySQL的一些区别。
2025-03-26 21:53:50
1008
原创 MyBatis一级缓存和二级缓存
在开发基于 MyBatis 的应用时,缓存是提升性能的关键因素之一。MyBatis 提供了一级缓存和二级缓存,合理使用它们可以显著减少数据库的访问次数,提高系统的响应速度和吞吐量。本文将深入探讨 MyBatis 一级缓存和二级缓存的工作原理、使用方式以及注意事项。MyBatis 的一级缓存和二级缓存是提升应用性能的重要手段。一级缓存适用于在同一个SqlSession中多次执行相同查询的场景,而二级缓存适用于多个SqlSession共享数据的场景。
2025-03-23 15:31:18
451
原创 Mybatis延迟加载机制
MyBatis 的延迟加载(也称为懒加载)是一种优化策略,它允许在真正需要数据时才去数据库中查询,而不是在一开始就把所有关联数据都加载出来。这种机制能显著提升应用的性能,尤其是在处理大量关联数据时。下面详细介绍 MyBatis 延迟加载的机制。
2025-03-23 10:55:40
257
原创 MyBatis执行流程
通过这些步骤,MyBatis 实现了 Java 代码与数据库之间的高效交互。、获取 Mapper 接口代理对象、执行 SQL 语句、事务管理以及关闭。MyBatis 支持使用 Mapper 接口来执行 SQL 语句。是 MyBatis 与数据库交互的会话对象,类似于 JDBC 中的。综上所述,MyBatis 的执行流程主要包括加载配置文件、创建。在执行 SQL 语句的过程中,MyBatis 支持事务管理。通过 Mapper 接口代理对象调用方法,或者直接使用。方法可以获取 Mapper 接口的代理对象。
2025-03-23 10:38:54
623
原创 Spring框架核心注解(Spring,SpringMVC,SpringBoot)
1. Spring核心注解2. SpringMVC核心注解3. SpringBoot核心注解组合了注解,实现配置文件的功能打开自动配置的功能,也可以关闭某个自动配置的选Spring组件扫描。
2025-03-23 10:11:15
833
原创 Spring事务失效场景
在使用 Spring 事务时,虽然它为我们提供了便捷的事务管理功能,但在某些情况下,事务可能会失效,导致数据一致性问题。以下是一些常见的 Spring 事务失效场景及原因分析:Spring 的声明式事务是基于 AOP 实现的,而 AOP 默认只能对 public 方法进行代理增强。如果将注解放在非 public 方法上,事务会失效。2. 自调用问题当一个类内部的方法调用另一个被注解的方法时,事务会失效。这是因为 Spring 的事务管理是基于代理对象实现的,自调用时并没有通过代理对象,而是直接在目
2025-03-23 00:01:33
470
原创 深入了解Spring事务及其使用场景
在企业级应用开发中,数据的一致性和完整性至关重要。Spring 事务管理作为 Spring 框架的核心功能之一,为开发者提供了一种便捷且强大的方式来确保数据库操作在逻辑上的原子性。无论是简单的单数据库事务,还是涉及多个数据源的分布式事务,Spring 都提供了相应的解决方案。本文将深入探讨 Spring 事务的原理、应用场景,并通过实际例子展示其具体用法。这里暂时只讨论单数据库的情况,多个数据库需要使用Spring Cloud分布式事务组件像Seata,这里就不过多赘述。
2025-03-22 23:31:08
976
原创 深入理解 Spring AOP:原理、场景与实践
在现代 Java 开发中,面向切面编程(AOP)已经成为一种不可或缺的技术,而 Spring AOP 则是 Spring 框架中实现 AOP 的核心模块。它允许我们将横切关注点(如日志记录、事务管理、权限控制等)从业务逻辑中分离出来,以一种非侵入式的方式增强系统功能,提高代码的可维护性和可扩展性。本文将深入探讨 Spring AOP 的原理、应用场景,并通过实际例子展示其用法。切面是横切关注点的模块化,它包含一组通知(Advice)和切点(Pointcut)。例如,日志记录作为一个横切关注点,可以定义为一个
2025-03-22 23:08:39
1643
原创 Java对象的hashcode
如果存在相同的hashcode值,就调用equals方法与新的元素进行比较,相同就直接覆盖,不相同就散列到其他的地址。对于equals大部分Java程序员都不陌生,它通常是比较两个对象的内容(值)是否相等(==双等于比较对象的内存地址),如果是Object中的equals方法默认就是比较内存地址(在没有被重写的情况下和==一样)。,因为如果我们只重写equals方法,就有可能导致hashcode不相同,这样就会导致这个类无法和所有的集合类一起工作。类的两个重要方法,它们在处理对象比较和哈希集合(如。
2025-03-22 22:46:25
520
原创 Spring单例Bean的线程安全
因为多个线程会共享同一个实例。如果 Bean 有状态(成员变量),需要采取额外的措施来保证线程安全,例如:使用无状态 Bean。使用线程安全的类(如。
2025-03-16 23:27:13
747
原创 Java集合 - ArrayList
ArrayList是基于动态数组实现的集合,支持随机访问和动态扩容。默认初始容量为 10,扩容时容量增加为原来的 1.5 倍。非线程安全,适合单线程环境使用。在多线程环境下,可以使用或来保证线程安全。适用于需要频繁访问元素但较少插入和删除的场景。
2025-03-16 22:37:30
373
原创 Java集合 - HashMap
HashMap是 Java 集合框架中的一个重要类,位于java.util包中。它实现了Map接口,基于哈希表的数据结构来存储键值对(key-value pairs)。HashMapnull,并且是非同步的(非线程安全的),null键在HashMap中只能存在一个。
2025-03-16 19:00:10
1376
原创 分享国内外开源的React项目
作为万千React开发者的一员,在国内大部分前端项目都是Vue的情况下,还是精挑细选地从中找出了不错的React开源项目,并且都通过git拉取源码到本地进行了安装和运行。觉得不错的也可以给作者star。
2024-05-16 09:31:18
3423
1
原创 总结JavaScript的关于时间和日期的用法和方法
在JavaScript中,处理时间和日期主要依赖于Date对象。这个对象提供了许多方法和属性来获取、设置以及操作日期和时间。
2024-05-16 09:06:07
256
原创 IDEA编辑器如何让package显示分层结结构
在IDEA项目中,选择左边project目录右上方的设置图标,然后在打开的菜单栏中选择Tree Appearance(树形外观),如果你的项目package无法显示分层结构,是因为Flatten Packages被选中了。在大型项目中,代码的分层管理至关重要。通过合理配置,我们可以清晰地看到各个package之间的层级关系,提高代码的可读性和维护性。对于很多初学者或者刚刚接触IDEA开发工具的学员,对于IDEA的分层目录可能很迷惑,这里我告诉大家如何设置项目中package的分层结构。
2024-01-06 15:00:22
1667
1
原创 用React和Laravel实现一个在线答题试卷模块,包括单选,多选,判断和填空题(下)
用react和laravel实现一个在线考试试卷模块,包括单选,多选,判断和填空题,包含前端后端,mysql数据库的设计和使用
2024-01-06 14:17:09
2190
1
原创 用React和Laravel实现一个在线答题试卷模块,包括单选,多选,判断和填空题(上)
在线考试模块在现代教育和培训领域的应用越来越广泛。这个模块需要后端在数据库中获取题目并通过前端的请求发送给前端,然后将其渲染到页面上。提交考试结果后记录用户的选择并计算考试分数,然后保存到数据库中。根据此项目要求,用户可以没有限制的进行考试,每一次考试就会更新考试成绩。
2024-01-02 09:41:33
976
原创 ECharts初步认识和简单介绍
ECharts 是一个强大的开源 JavaScript 数据可视化库,由百度开发和维护。它提供了丰富的图表类型和高度的定制能力,使得开发者能够轻松地在网页上创建出各种美观、交互性强的数据可视化效果。折线图(区域图)柱状图(条形图)散点图(气泡图)K 线图饼图(环形图)雷达图(填充雷达图)和弦图力导向布局图地图仪表盘漏斗图事件河流图等。
2023-12-25 18:58:21
417
原创 总结CommonJS和ES6使用模块化导出和导入的方法
语法差异:CommonJS使用module.exports和require语法,而ES6使用export和import语法。默认导出:CommonJS没有默认导出功能,而ES6可以通过export default导出默认模块。命名导出:CommonJS没有命名导出功能,而ES6可以通过export关键字导出多个模块,并在导入时使用具体的名称。动态导入:CommonJS不支持动态导入,而ES6可以使用import()函数进行动态导入。
2023-12-19 19:40:08
1034
1
原创 React项目打包后使用serve -s build错误
经过一番搜索,原因是node版本和serve不兼容(又是node版本的问题!)serve是最新版14,而node版本是13。用nvm(node版本管理工具)升级到18.18.0就可以了。
2023-12-12 17:06:39
621
原创 React生命周期钩子函数学习总结
在React类组件中,生命周期函数是贯穿整个React程序运行周期的函数,继承React.Component中,不需要单独调用。虽然现在多数新的React项目用函数组件较多,但还是很多老项目由大量的类组件构成(比如我现在工作维护的项目)所有对生命周期函数有个全面的了解是很重要的。
2023-10-31 20:39:35
174
1
原创 使用Java实现TCP网路通信
TCP(Transmission Control Protocol)是在网路层的一种的通信协议。TCP协议会在网路通信的两端各建立Socket对象,通信前要保证连接已建立。TCP是通过Socket产生来进行网路通信的。TCP连接的建立是通过进行的。通过的过程,客户端和服务器建立基于TCP协议的通信连接。
2023-07-25 14:22:22
1008
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人