- 博客(300)
- 收藏
- 关注

原创 学习笔记框架目录
学习笔记目录Java基础1)变量和字符串:变量和字符串2)类、对象、接口和继承:类、对象、接口和继承容器1)集合框架基础:集合框架2)ArrayList源码:ArrayList源码3)LinkedList源码:LinkedList源码4)HashMap源码:HashMap源码并发JVM设计模式:1)单例模式:单例模式2)观察者模式:观察者模式3)代理...
2020-03-17 20:49:27
839
1
原创 【RocketMQ&&RocketMQ Dashbord】Springboot整合RocketMQ
一个队列所对应的新的消费者要获取之前消费的offset(偏移量,也就是消息消费的点位),此时之前的消费者可能已经消费了一条消息,但是并没有把offset提交给broker,那么新的消费者可能会重新消费一次。如果多个queue参与,则为分区有序,即相对每个queue,消息都是有序的。(4)消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。
2025-03-26 12:04:45
683
原创 【Redis】redis实现消息的发布和订阅
虽然 Redis 性能高,但它主要基于内存存储,当消息量过大时,可能会导致内存资源紧张,甚至出现内存溢出的问题。Redis 的消息队列功能相对简单,缺乏像 RabbitMQ 那样的复杂消息处理机制,如消息确认、重试机制、死信队列等,在处理复杂业务逻辑时不够灵活。Redis 基于内存操作,读写速度极快,在处理高并发的消息场景时,能快速完成消息的发布和订阅操作,响应时间短,可满足低延迟的业务需求。由于 Redis 的高性能和低延迟特性,非常适合实时性要求较高的场景,如实时消息通知、实时数据更新等。
2025-03-24 10:19:39
1067
原创 【Synchronized】不同的使用场景和案例
锁类型 锁对象 作用范围 适用场景实例方法(对象锁) 当前实例(this) 同一实例的同步方法 保护实例变量(如账户余额)静态方法(类锁) 类的Class对象 所有实例的静态方法 保护静态变量(如全局计数器)显式对象锁 指定对象(如lock) 锁定指定对象的同步代码块 细粒度控制(如缓存更新)显式类锁 ClassName.class 跨实例同步(与静态方法锁等效) 需要全局同步的非静态方法逻辑。
2025-03-12 09:50:58
670
原创 【Java8】Function函数式接口详解及使用
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的。函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的。函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;@Override。
2025-03-10 14:36:46
1249
原创 【线程池】springboot线程池的底层设计原理
在 Spring Boot 中,线程池是一个重要的组件,用于管理和调度线程,提高应用程序的性能和资源利用率。下面将详细汇总 Spring Boot 线程池的底层原理。
2025-02-25 17:00:04
819
原创 【SpringSecurity】springboot整合SpringSecurity实现登录校验与权限认证
关于安全方面的两个主要区域是“认证”和“授权”(或者说是访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是SpringSecurity重要核心功能。(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,
2025-02-25 14:06:16
1359
1
原创 【实体类】分层设计
对父类和子类分别new一个对象,然后使用equals判断,得到的结果是true,原因是它没有调用父类的中属性,而是直接使用的子类中的属性来生成hashcode,所以当子类中的属性参数一样时,使用equals比较结果的为true。解耦数据层和业务层:使业务层与数据层之间的耦合度降低,业务层只需要调用 DAO 提供的接口方法,而不需要关心数据是如何存储和获取的,提高了代码的可维护性和可扩展性。在并发环境下,乐观锁可以防止数据的“脏写”,通过版本号(version)字段来保证数据的一致性。
2025-02-24 15:25:27
881
原创 【工作流】Spring Boot 项目与 Camunda 的整合
官网:https://camunda.com/中文网站:http://camunda-cn.shaochenfeng.com/(1)流程(PROCESS): 通过工具建模最终生成的BPMN文件,里面有整个流程的定义(2)流程实例(Instance):流程启动后的实例(3)流程变量(Variables):流程任务之间传递的参数(4)任务(TASK):流程中定义的每一个节点(5)流程部署:将之前流程定义的.bpmn文件部署到工作流平台提前安装Java1.8以上的JRE或JDKCamundaModele
2025-02-23 22:22:01
1433
原创 【Flyway】数据库版本管理
Flyway 是一款开源的数据库版本管理工具,它可以帮助开发者以一种可靠且可重复的方式管理数据库变更。Flyway 遵循迁移脚本的版本化原则,允许开发者将数据库的变更以脚本的形式记录下来,然后按照版本顺序依次执行这些脚本,确保数据库结构在不同环境(开发、测试、生产)中保持一致。Flyway 的主要特点包括:(1)简单易用:通过简单的命令和配置即可管理数据库迁移。(2)支持多种数据库:如 MySQL、PostgreSQL、Oracle、SQL Server 等。
2025-02-20 11:12:50
1043
原创 【Maven】多module项目优雅的实现pom依赖管理
(1)分层管理依赖父POM:管理全局依赖版本、插件和公共配置。子模块:仅声明自身需要的依赖,不重复定义版本。(2)活用BOM通过导入Spring Boot、Spring Cloud或其他第三方BOM,简化版本协调。(3)模块化设计每个模块职责单一,通过依赖传递共享通用组件。(4)版本变量提取对频繁变更的版本号,可在父POM中定义集中管理。(5)持续梳理依赖定期使用mvn dependency:tree分析依赖树,避免冗余和冲突。
2025-02-14 15:41:08
1259
原创 【Java】实现后端请求接口
HttpURLConnection 是 Java 标准库中较早提供的 HTTP 请求工具【2】POST请求【3】PUT请求【4】DELETE 请求【5】汇总工具类,通过传参实现4种请求【二】HttpClient 实现四种请求方式的示例HttpClient 是 Java 11 及以上版本引入的新的 HTTP 客户端,使用起来更加简洁和方便。【2】POST 请求【3】PUT 请求【4】DELETE 请求【5】汇总的工具类HttpClientUtils 类中的 sendRequ
2025-02-14 14:40:20
436
原创 加密算法分类
加密时,使用公钥对明文进行加密;MD5 将任意长度的输入消息通过填充、分组等操作,经过四轮循环的压缩函数处理,最终生成 128 位的哈希值。优点:安全性高,生成的哈希值长度为 256 位,比 MD5 更安全,被广泛应用于密码存储、数字签名等场景。优点:密钥长度可选(128 位、192 位、256 位),安全性高,加密效率高,被广泛应用。对数据安全性要求较高,且对加密性能有一定要求的场景,如网络通信中的数据加密、文件加密等。对安全性要求不是特别高,且对加密速度有较高要求的场景,如早期的一些简单数据传输加密。
2025-02-11 14:40:48
877
原创 【Druid】学习笔记
Java 程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。Druid的功能(1)替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。(2)可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。(3)数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支
2025-02-11 11:31:27
889
原创 【ruoyi-vue】前后端分离项目分析
RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。(1)说明使用原生的@Validated进行参数校验时,都是特定的注解去校验(例如字段长度、大小、不为空等),我们也可以用自定义的注解去进行校验,例如项目中的@Xss注解。
2025-02-07 15:09:11
997
原创 【springboot】拦截器和过滤器的区别
在 Spring Boot 中,拦截器(Interceptor)和过滤器(Filter)都是用于对请求进行预处理和后处理的机制,但它们存在一些区别,适用于不同的场景。下面将详细介绍它们的区别、适用场景,并给出使用案例。
2025-02-05 17:13:24
997
1
原创 【spring容器管理】bean的生命周期有哪些拓展点?
除了 Spring 提供的扩展点,还可以通过实现 Lifecycle 接口或使用 @EventListener 注解来监听生命周期事件。Java Bean 的生命周期扩展点包括:(1)实例化(构造函数、工厂方法)。(2)属性注入(Setter、构造器、字段注入)。(3)初始化(InitializingBean、@PostConstruct、init-method)。(4)使用(AOP)。(5)销毁(DisposableBean、@PreDestroy、destroy-method)。
2025-02-05 14:41:38
863
原创 Java 变量参数传入方法,修改后是否影响外面的值
(1)基本数据类型:方法内修改不影响外部。(2)引用数据类型:修改对象内容会影响外部。修改引用本身(指向新对象)不会影响外部。(3)字符串:不可变,修改引用本身不会影响外部。
2025-02-05 12:01:38
497
原创 【Linux】curl命令详解
curl 是一个功能强大的网络传输工具,可以在命令行中使用。它支持发送和接收数据,并提供了多种协议和功能,如 HTTP、HTTPS、FTP、文件上传、代理等。curl 是一个灵活且广泛应用的工具,常用于测试 API、下载文件、发送请求等场景。curl 命令的基本语法如下:其中,URL 是要发送请求或下载的地址。下面是一些常用的 curl 命令选项的说明:-o 文件名:将下载的文件保存为指定的文件名。-O:将下载的文件保存为原始文件名。-d 数据:发送 POST 请求时附带的数据。-H “头部信息”:
2025-02-05 11:31:17
1540
原创 【Mybatis Plus】JSqlParser解析sql语句
JSqlParser 是一个用于解析 SQL 语句的 Java 库。它可以将 SQL 语句解析为一个 Java 对象树,允许你以编程的方式对 SQL 语句进行分析、修改和操作。它支持多种 SQL 语句类型,包括但不限于 SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER 等。例如,对于 SQL 语句 “SELECT column1, column2 FROM table1 WHERE column1 = ‘value’”,JSqlParser 可以将其解析为一个 Java 对象
2025-02-05 11:08:27
1548
原创 【Mybatis Plus】所有内置拦截器和实现原理
在多项目的业务场景下,所有查询语句的where必须限制租户,比如where tenant_id = ‘xxx’,但是如果每个sql都手动拼接会很麻烦,因为MybatisPlus提供了租户拦截器TenantLineInnerInterceptor用于实现上述需求。上述多租户配置会使得所有sql都会拼接上tenant_id = ‘xxx’,但还是会有特殊情况不需要拼接tenant_id,或者说部分表就没有tenant_id字段,一旦拼接上就会报错,因此需要手动忽视点某些表。
2025-01-26 20:04:11
200
原创 【Hive】新增字段(column)后,旧分区无法更新数据问题
新增字段语句最后的[CASCADE|RESTRICT]关键字是可以选的,不指定时默认值是RESTRICT,表示新增字段只作用在表上;但如果数据表tb已经有旧的分区(例如:dt=20190101),则该旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。CASCADE的作用是级联的意思,修改表字段的同时级联修改历史分区的字段信息。从查询结果可以看出,新增字段后,新的分区插入数据,以及重新刷新数据的历史分区,数据都可以正常查询。增加col1时加上cascade关键字。
2025-01-14 14:31:01
1180
原创 【Impala】数据类型转换cast使用
有一些函数、或者运算时,对数据类型有严格要求,所以在做运算前,都需要将数据先进行数据类型的转换,此处就需要用到cast,转为string、timestamp、decimal等等cast函数的一些用法-- 时间转字符串-- 日期转时间。
2025-01-14 12:05:50
639
原创 【EasyExcel】实现百万级数据的导入导出
(1)少量数据可以用单线程逐条读取,单线程写入或者批量写入的方式导入, 大量数据建议使用多线程读取,分多个sheet页存储的方式进行导入(2)少量数据的导出可以直接使查询所有数据,并写入一个sheet页中,数据量大的情况下还是要用多线程分页读取,写入到多个sheet页中。
2024-12-28 22:27:00
1823
原创 【mysql】聚簇索引
综上所述,聚簇索引在范围查询、存储效率上有明显优势。非聚簇索引在访问速度、索引灵活性以及读多写少的应用场景下更有优势。在实际应用中,需根据具体需求选择合适的存储引擎和索引策略(1)一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。(2)聚簇索引和非聚簇索引的区别:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。原始数据:MyISAM引擎的数据存储方式如图:MYISAM是按列值与行号来组织索引的。
2024-12-26 22:04:51
1839
原创 【mysql】MVCC及实现原理
MVCC,全称 Multi-Version Concurrency Control ,即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读(1)当前读像 select lock in share mode (共享锁), select for update;update;
2024-12-26 14:11:15
1351
原创 【线程池】线程池使用的注意事项
在第三方接口异常的情况下,线程池任务调用第三方接口一直超时,导致核心线程数、最大线程数堆积被占满、阻塞队列也被占满的情况下,也就会执行拒绝策略,但是由于使用的是 CallerRunsPolicy 策略,导致线程任务直接由我们的业务线程来执行。1-ThreadLocal 的变量是绑定在线程上的,而线程池的线程是可以复用的,如果一个线程执行完一个任务后,没有清理 ThreadLocal 的变量,那么这个变量就会被下一个执行的任务继承,导致数据错乱的问题。对于线程池的 submit 方法是无法处理的。
2024-12-24 15:28:19
784
原创 【Mysql】truncate 和 delete的区别
(1)truncate会删除表中的所有数据、释放空间,但是保留表结构(2)只能操作表,不能与where一起使用(3)truncate删除操作立即生效,原数据不放到rollback segment中,不能rollback,操作不触发trigger(4)truncate删除数据后会释放表空间、重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录、而非接着原来的id数(5)truncate删除数据后不写服务器log,整体删除速度快。
2024-12-24 14:56:48
940
原创 【数据结构】元组Tuple
(1)PairPair 用于存储两个元素的键值对,通常包含一个键和一个值。这种结构在需要将两个相关联的数据项作为一个单元进行操作时非常有用。键值结构:提供键(left)和值(right)两种数据的存储。不可变性:一旦创建,Pair 中的值不能被修改,保证了数据的不可变性和线程安全。使用场景:存储用户ID和名称、记录商品价格和库存数量等。(2)TripleTriple 类似于 Pair并继承于Pair,但它可以存储三个元素。它同样提供了不可变性,确保数据的稳定性。
2024-12-19 17:34:38
1156
原创 【Linux】常用命令大全
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。-size [±]size[cwbkMG]:按文件大小查找,支持使用 + 或 - 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。(1)-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上 -R 的参数,那么该目录下的所有文件的属组都会更改。
2024-12-18 00:47:57
949
原创 【shell】常用100个shell命令使用讲解
使用Shell脚本,你可以编写一个任务,然后让计算机去做,而你可以去忙其他的事情;你可以编写一个任务,让计算机重复执行,而不需要你每次在命令行手动输入;你可以更灵活地处理任务,比如管理用户,管理程序等。就这样,Shell脚本赋予你控制计算机的能力,在你的指尖下,一切尽在掌握。
2024-12-17 00:21:33
2487
原创 【多线程】IO密集型和CPU密集型
处理器访问任何寄存器和 Cache 等封装以外的数据资源都可以当成 I/O 操作,包括内存,磁盘,显卡等外部设备。计算机的核心部件是计算单元,即CPU,相对于CPU来说,存储(访问内存)、接口(访问外设)都是I/O。IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低。
2024-11-30 16:48:02
1555
原创 【Springboot】@Autowired和@Resource的区别
Resource 和@Autowired 这两个注解的作用都是在Spring 生态里面去实现Bean 的依赖注入。
2024-11-30 16:12:14
3238
原创 【Springboot】自定义starter
想要自定义starter,首先要了解springboot是如何加载starter的,也就是springboot的自动装配机制。SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。
2024-10-18 21:30:27
1258
原创 自定义树形结构转换,Hutool的TreeUtil工具
在实际开发中,树形结构的数据处理是一个常见的需求。例如,组织架构、分类管理、评论回复、树形菜单等,都需要将数据以树形结构展示。本文将深入解析如何使用Java实现一个通用的树形结构转换工具类,包括 TreeUtil 和 TreeNode 接口的设计与实现。我们假设要构建一个菜单,可以实现系统管理和店铺管理//配置// 自定义属性名 都要默认值的// 最大递归深度//转换器// 扩展属性 ...});
2024-10-16 22:30:48
1576
原创 【redis】redis的多线程和IO多路复用
Redis的单线程主要处理键值对读写,但其他功能如持久化、异步删除由额外线程执行。Redis选择单线程避免上下文切换和线程竞争,利用多路复用技术提高处理多个客户端请求的能力。Redis4.0引入异步删除以减少主线程阻塞。Redis6/7开始使用多IO线程处理网络请求,主线程仍单线程处理命令操作以保证原子性。IO多路复用(如epoll)配合主线程和IO线程协同,提升了Redis的性能。
2024-10-16 11:58:38
1484
原创 【redis】数据过期清除策略、缓存淘汰策略
Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。可以想象里面有一个专门删除过期数据的线程,数据已过期就立马删除。这个时候可以思考一下,会不会因为同一时间太多的 key 过期,以至于线程忙不过来。同时因为 Redis 是单线程的,删除的时间也会占用线程的处理时间,如果删除的太过于繁忙,会不会导致线上读写指令出现卡顿。立即删除对cpu不友好,但是对内存友好,实际性质就是用处理器性能换区内存空间。
2024-10-16 10:51:53
1827
原创 【redis】热点key问题
热key问题就是某个瞬间有大量的请求去访问Redis上某个固定的key,导致缓存击穿,请求都打到了DB上,压垮了缓存服务和DB服务,从而影响到应用服务可用的可用性;被大量刊发、浏览的热点新闻、热点评论、明星直播等,这些典型的读多写少的场景就会产生热点key问题;相对DB,Redis的查询性能会高不少,但是再好的查询性能也是有阈值的。Rdis单节点的查询性能一般在2W的QPS,因此,对于单个固定key的查询不能超过这个值;
2024-10-16 09:47:08
2271
原创 【mysql】WITH AS 语法详解
WITH AS 语法是MySQL中的一种临时结果集,它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句,可以将一个查询的结果存储在一个临时表中,然后在后续的查询中引用这个临时表。这样可以简化复杂的查询,提高代码的可读性和可维护性。
2024-10-14 13:37:43
2529
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人