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

原创 学习笔记框架目录
学习笔记目录Java基础1)变量和字符串:变量和字符串2)类、对象、接口和继承:类、对象、接口和继承容器1)集合框架基础:集合框架2)ArrayList源码:ArrayList源码3)LinkedList源码:LinkedList源码4)HashMap源码:HashMap源码并发JVM设计模式:1)单例模式:单例模式2)观察者模式:观察者模式3)代理...
2020-03-17 20:49:27
889
1
原创 【Docker】安装kafka案例
Kafka 连接 ZooKeeper 正常:ZooKeeper 中存在/brokers节点 + Kafka 日志无连接错误 +kafka-brokers.sh能列出 broker。Kafka 依赖 ZooKeeper 存储元数据(如主题、分区信息),两者连接正常的核心标志是:Kafka 成功在 ZooKeeper 中注册元数据。(1)保存和管理 Kafka 集群的元数据信息。在生产者终端输入消息(如hello kafka),消费者终端应实时收到消息,说明 Kafka 服务正常。
2025-08-14 23:19:36
599
原创 【线程池】压测确定线程池合适的参数
通过 “控制变量法” 压测,重点关注核心线程数、最大线程数、队列大小三个参数,结合 IO 密集型任务特性(线程数可略高于 CPU 核心数),最终找到 “吞吐量高、响应时间短、资源占用合理” 的配置。对于 100 万条数据导出场景,典型最优配置可能为:corePoolSize=CPU核心数×2、maximumPoolSize=CPU核心数×3、queueCapacity=1000~2000,具体需根据实际压测结果调整。
2025-08-10 00:09:39
792
原创 【Doris】实时分析型数据库
Apache Doris 是一款基于 MPP 架构的高性能、实时分析型数据库。它以高效、简单和统一的特性著称,能够在亚秒级的时间内返回海量数据的查询结果。Doris 既能支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于这些优势,Apache Doris 非常适合用于报表分析、即席查询、统一数仓构建、数据湖联邦查询加速等场景。用户可以基于 Doris 构建大屏看板、用户行为分析、AB 实验平台、日志检索分析、用户画像分析、订单分析等应用。
2025-08-09 18:34:00
983
原创 【JVM】流程汇总
① 开启堆 dump(-XX:+HeapDumpOnOutOfMemoryError)→ ② 用 MAT/JProfiler 分析 dump,定位泄漏对象 → ③ 检查代码中不合理的引用(如静态集合未清理、长生命周期对象持有短生命周期对象)→ ④ 修复并验证。
2025-08-08 13:42:34
867
原创 【SpringSecurity&&JWT】搭建认证服务
搭建一个单独的认证的服务,注册到Nacos,使用ddd分层springboot2.7.7SpringCloud2021.0.5选择自己需要的依赖导入,重点是版本要兼容【2】yml配置bootstrap.ymlbootstrap-dev.ymlnacos里配置了mysql和redis等信息,这里并不规范,按需要配置自己的信息用来确认bootstrap.yml配置读取成功,因为bootstrap依赖要手动导入,否则bootstrap.yml里的配置信息不会生效【4】常用常量【5】SpringSe
2025-08-08 00:59:19
450
原创 【Java】Predicate使用案例
需求:根据动态条件查询用户(如可选条件:年龄范围、姓名包含特定字符)。// 根据条件查询用户new User("张三", 20),new User("张四", 22),new User("李四", 17)// 查询:名字包含"张"且年龄>18Predicate<User> query = u -> u.getName().contains("张")// 输出:[张三(20), 张四(22)](1)Predicate 用于条件判断,核心方法 test(T t) 返回布尔值。
2025-08-07 23:52:59
266
原创 【Java】使用模板方法模式设计EasyExcel批量导入导出
如果下一个功能要实现导入导出的功能,就可以继承抽象父类,然后重写和调用方法即可,开发人员只需要关注校验逻辑、导出逻辑、导入逻辑即可,而整个方法的流程模板已经实现封装,开发人员不用关注如何配置流程,且实现了大量代码的灵活复用用到的知识点细节(1)模板方法设计模式(2)反射获取errorMsg字段值(3)泛型参数传参(4)Java对象多态(5)抽象类和抽象方法的使用(6)EasyExcel通过注解校验表头和实体类是否一致。
2025-08-04 15:55:40
823
原创 【Java】泛型的使用案例
泛型可作用于类、接口、方法,分别称为泛型类、泛型接口、泛型方法。在类名后添加<类型参数>(如),类型参数可在类的字段、方法参数、返回值中使用。与泛型类类似,在接口名后添加<类型参数>,实现类需指定具体类型或继续保留泛型。在方法返回值前添加<类型参数>(如),该类型参数仅作用于当前方法,与类的泛型无关(即使类不是泛型类,也可定义泛型方法)。泛型参数属于实例级别的信息(每个实例的类型参数可能不同),而静态字段属于类级别,无法关联具体的泛型参数。// 错误:静态字段不能使用泛型参数// 编译错误。
2025-08-03 16:28:48
1071
原创 【Spring事务】@Transactional的使用案例
(1)NESTED 与 REQUIRES_NEW 的区别:NESTED 是主事务的子事务,依赖主事务存在(主事务回滚则子事务也回滚)。REQUIRES_NEW 是完全独立的事务,与主事务无依赖(主事务回滚不影响子事务)。(2)数据库支持:NESTED 依赖数据库的保存点(Savepoint)机制(如 MySQL、PostgreSQL 支持),部分数据库可能不支持。(3)性能影响:过多 REQUIRES_NEW 会创建大量独立事务,增加数据库开销。
2025-08-03 15:58:28
682
原创 【MybatisPlus】join关联查询MPJLambdaWrapper
/ 用户表实体@Data// 关联地址表的id// 地址表实体@Data// 包含用户和地址的关联结果@Data// 用户表字段// 对应user.id(注意别名,避免与address.id冲突)// 对应user.name// 对应user.age// 地址表字段// 对应address.id// 用户Mapper,继承MPJBaseMapper以支持关联查询// 订单表实体@Data// 关联用户表的id// 包含用户和订单列表的DTO。
2025-08-03 15:10:13
1080
原创 【HashMap】HashMap、HashSet重写equals为什么必须重写hashcode
(1)判断两个HashMap内容是否相等,不能使用Object的equals,因为equals会判断引用是否相同,如果内容相同而引用不同,equals就会返回false(2)如果对HashMap进行equals方法重写,想判断两个对象内容是否相同,只有当对象的hashCode相等才会判断为相同,因为HashMap存储元素的时候,是根据hashCode计算桶索引来判断元素是否重复。
2025-08-03 14:59:54
624
原创 【Mysql】联合索引生效分析案例
联合索引的生效依赖于查询条件中是否包含索引的 “最左前缀列”(即索引定义中的第一个列、前两个列、前三个列等,按顺序匹配)。当查询条件满足最左前缀时,索引会被部分或全部使用;否则,索引不会生效。(1)最左前缀原则是核心:联合索引(col1, col2, col3)仅在查询条件包含col1、col1+col2、col1+col2+col3时生效(按顺序)。(2)范围条件会阻断后续列:col2>等范围条件后,col3及之后的列无法使用索引。
2025-08-01 23:47:43
746
原创 【Redis】key的设计格式
Redis 的 key 设计需遵循可读性高、易维护、避免冲突、便于扩展的原则,通常采用 “分层命名” 的方式,用分隔符(如:、_)划分不同维度,清晰体现 key 的业务含义。
2025-08-01 21:45:03
917
原创 【Mysql】字段隐式转换的精度丢失对where条件和join关联条件的影响
部分数据库(如 MySQL)对bigint的最大支持是 64 位有符号整数(范围约 ±9e18),但当varchar字段存储的字符串转换为数值时,若数值接近最大范围,可能因精度不足导致近似匹配(如728666272023183375和728666272023183374在转换后被误判为相等)。(2)使用用户表和中间表leftjoin的使用,用户表的id是bigint,中间表的userId是varchar,728666272023183375的用户会把728666272023183374的关联信息也查出来。
2025-08-01 21:08:09
958
原创 【Lambda】flatMap使用案例
flatMap 将每个学生的 courses 列表转换为流,再合并成一个包含所有课程的流,最终通过 distinct() 去重。一个用户对象有一个角色的List,如何使用Stream根据一个用户对象集合,返回每个角色对应的所有用户List的Map。假有一个 Student 类,每个学生选修多门课程(List),需获取所有学生的全部课程(去重)。有一个订单列表,每个订单包含多个商品,需筛选出价格大于 100 的商品并收集。将嵌套的二维列表(List<List>)转换为一维列表(List)。
2025-07-30 22:41:30
291
原创 详细说明零拷贝
零拷贝(Zero-Copy)是一种减少数据在内存中不必要复制的技术,核心目标是在数据传输(如文件读写、网络发送)过程中,避免 CPU 参与冗余的数据拷贝操作,从而提升性能(减少 CPU 占用、降低内存带宽消耗、减少用户态与内核态切换开销)。
2025-07-29 13:08:47
708
原创 【JSqlParser】sql解析器使用案例
项目中支持文件导入指标的业务限定(也就是where条件),并且可以指定是普通模式还是代码模式,如果是普通模式就要把where解析成一个个条件语句,并转换成嵌套的组件对象。(3)in和not in,like和not like,between,is null和is not null,这几种语句要单独处理。(2)需要判断and和or的逻辑,如果有括号把and或or包围起来了,需要判断是否创建子级children。(1)组件对象是分层的,每层有独立的且或逻辑,每层要用括号包围起来。
2025-07-28 18:05:56
604
原创 【mysql】创建视图查询当月累计销售额的案例
2025年7月,一共31天,7月1至7月4都是工作日,每天都有n条各个店铺的各个产品销售额(个别店铺装修或者产品下架会存在没有记录的情况),但是7月5是周末,没有销售记录。产品表维护的是全量的产品表。• 如果需要包含“当月有维度但全月无销售”的记录(如新增分公司/产品),需额外关联全量维度表并左连接active_shop_product(按需调整)。创建视图,从销售记录表中查询的是每天每个分公司每个产品的截止当天的各个维度的月度销售额,没有销售记录的维度默认补上一条销售额为0的记录。
2025-07-28 17:00:45
359
原创 【mysql】详细介绍关联表join的更新update
(1)学生成绩汇总表(student_summary):包含 student_id(学号)、name(姓名)、class(班级)、math_score(数学成绩)、chinese_score(语文成绩)一个学生成绩汇总表,已经有学生姓名、班级等基本信息,还有数学成绩表、语文成绩表,如何使用sql的join把不同科目的成绩都更新到学生成绩汇总表里。(3)语文成绩表(chinese_scores):包含 student_id、score。
2025-07-28 16:31:06
293
原创 【mysql】详细介绍cross join
CROSS JOIN(交叉连接)是 SQL 中一种基础的表连接方式,用于将两个或多个表的所有行进行组合,生成笛卡尔积(Cartesian product)。即如果表 A 有m行,表 B 有n行,CROSS JOIN的结果会有m×n行。例如将学生表和课程表进行cross join,相当于给每个学生匹配了所有课程。
2025-07-28 16:27:23
463
原创 字符串和对象的深拷贝和浅拷贝
仅拷贝数据的 “表层”。对于基本数据类型(如int、float),直接拷贝值;对于引用类型(如对象、数组),仅拷贝引用地址(原对象和拷贝对象共享同一个引用对象)。在 Java 工具类中,ObjectUtil通常是一个自定义或第三方工具类(如 Hutool、Apache Commons 等),用于简化对象操作,其中clone方法用于实现对象的拷贝。不同工具类的clone方法实现可能略有差异,但核心功能都是封装对象克隆的复杂逻辑,提供更简洁的 API。
2025-07-24 23:20:29
683
原创 【mysql】GROUPBY的聚合结果是NULL还是空结果集,和IFNULL、COALESCE方法的使用总结
(1)SQL 标准的规定对空集进行聚合(如 SUM、AVG、COUNT)时,结果为 NULL(除了 COUNT(*) 返回 0)GROUP BY 的语义是对数据进行分组,如果没有数据,则不存在任何分组(2)实际应用场景无 GROUP BY:通常用于获取单个聚合值(如总计),即使没有数据也需要返回一个结果有 GROUP BY:通常用于按类别统计,可以获取单个聚合值,也可以获取多个值,如果没有数据,返回空结果更符合业务逻辑(3)总结SELECTFROMempWHERESELECT。
2025-06-23 15:15:28
863
原创 【Kafka】消息队列Kafka知识总结
我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。参与消息传递的双方称为 生产者 和 消费者 ,生产者负责发送消息,消费者负责处理消息。(1)AMQP 为消息定义了线路层(wire-level protocol)的协议,而 JMS 所定义的是 API 规范。
2025-06-10 19:23:51
1152
原创 【分布式】分布式ID介绍和实现方案总结
日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID 对应且仅对应一个地址。简单来说,ID 就是数据的唯一标识。分布式 ID 是分布式系统下的 ID。分布式 ID 不存在与现实生活中,属于计算机系统中的一个概念。我简单举一个分库分表的例子。例如一个项目,使用的是单机 MySQL。
2025-06-08 16:32:10
1210
原创 【Mysql】隐式转换造成索引失效
(1)当操作符左右两边的数据类型不一致时,会发生隐式转换。(2)当 where 查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。(3)当 where 查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。(4)字符串转换为数值类型时,非数字开头的字符串会转化为0,以数字开头的字符串会截取从第一个字符到第一个非数字内容为止的值为转化结果。
2025-06-03 23:37:43
877
原创 【Mysql】三大日志(binlog、redo log和undo log)详解
MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。
2025-06-01 18:35:19
640
原创 【大数据】宽表和窄表
(1)定义:宽表是将多个相关实体的字段(列)合并到一张表中,通过冗余字段减少表连接(JOIN)操作。(2)特点:列数多(通常包含数十到数百列),行数相对较少,数据冗余度高。本质:通过空间换时间,牺牲存储成本提升查询性能。
2025-05-23 14:34:38
1294
原创 【线程池】线程池的使用汇总
通过注解简化异步任务开发,支持自定义线程池参数。(1)优点(2)缺点【2】方式二:使用 Java 原生 ExecutorService(简单直接)使用 JDK 原生线程池工具类,适合快速实现异步任务。(1)优点简单便捷(2)缺点1-FixedThreadPool 和 SingleThreadExecutor:使用的是阻塞队列 LinkedBlockingQueue,任务队列最大长度为 Integer.MAX_VALUE,可以看作是无界的,可能堆积大量的请求,从而导致 OOM。2-Cached
2025-05-23 10:40:04
1089
原创 【Maven】手动安装依赖到本地仓库
(2)共享本地安装: 如果你团队中有多个开发者,建议将此依赖上传到公司内部的私有仓库(例如 Nexus 或 Artifactory)。(1)许可证限制: Oracle 提供的驱动程序通常受到许可证约束,因此它们不会托管在 Maven 中央仓库中。使用 mvn install:install-file 命令,将 JAR 文件安装到本地 Maven 仓库。例如,ojdbc6 是 Oracle 提供的用于 Java 的数据库驱动。(1)在本地 Maven 仓库中验证文件是否已正确安装,确认自己的本地仓库路径。
2025-04-17 12:29:27
1362
原创 【Mysql】死锁问题详解
实例的日志记录表,实例在重跑的时候,会先根据instanceId去delete该实例关联的全部旧的记录信息,然后再陆续插入新的记录信息,instanceId有索引,出现锁超时的情况。,session1 已获取到IX锁,gap锁, 等待rec insert intention(插入意向锁), session1, session2 都在等待插入意向锁, 插入意向锁与gap锁冲突,双方都没有释放gap锁,又都在等待插入意向锁,死锁发生。在MySQL中,行级锁并不是直接锁记录,而是锁索引。
2025-04-13 22:47:59
2710
原创 【RocketMQ&&RocketMQ Dashbord】Springboot整合RocketMQ
一个队列所对应的新的消费者要获取之前消费的offset(偏移量,也就是消息消费的点位),此时之前的消费者可能已经消费了一条消息,但是并没有把offset提交给broker,那么新的消费者可能会重新消费一次。如果多个queue参与,则为分区有序,即相对每个queue,消息都是有序的。(4)消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。
2025-03-26 12:04:45
820
原创 【Redis】redis实现消息的发布和订阅
虽然 Redis 性能高,但它主要基于内存存储,当消息量过大时,可能会导致内存资源紧张,甚至出现内存溢出的问题。Redis 的消息队列功能相对简单,缺乏像 RabbitMQ 那样的复杂消息处理机制,如消息确认、重试机制、死信队列等,在处理复杂业务逻辑时不够灵活。Redis 基于内存操作,读写速度极快,在处理高并发的消息场景时,能快速完成消息的发布和订阅操作,响应时间短,可满足低延迟的业务需求。由于 Redis 的高性能和低延迟特性,非常适合实时性要求较高的场景,如实时消息通知、实时数据更新等。
2025-03-24 10:19:39
1915
原创 【Synchronized】不同的使用场景和案例
锁类型 锁对象 作用范围 适用场景实例方法(对象锁) 当前实例(this) 同一实例的同步方法 保护实例变量(如账户余额)静态方法(类锁) 类的Class对象 所有实例的静态方法 保护静态变量(如全局计数器)显式对象锁 指定对象(如lock) 锁定指定对象的同步代码块 细粒度控制(如缓存更新)显式类锁 ClassName.class 跨实例同步(与静态方法锁等效) 需要全局同步的非静态方法逻辑。
2025-03-12 09:50:58
950
原创 【Java8】Function函数式接口详解及使用
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的。函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的。函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;@Override。
2025-03-10 14:36:46
1715
原创 【线程池】springboot线程池的底层设计原理
在 Spring Boot 中,线程池是一个重要的组件,用于管理和调度线程,提高应用程序的性能和资源利用率。下面将详细汇总 Spring Boot 线程池的底层原理。
2025-02-25 17:00:04
1022
原创 【SpringSecurity】springboot整合SpringSecurity实现登录校验与权限认证
关于安全方面的两个主要区域是“认证”和“授权”(或者说是访问控制),一般来说,Web应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是SpringSecurity重要核心功能。(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。通俗点说就是系统认为用户是否能登录。(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,
2025-02-25 14:06:16
4103
1
原创 【实体类】分层设计
对父类和子类分别new一个对象,然后使用equals判断,得到的结果是true,原因是它没有调用父类的中属性,而是直接使用的子类中的属性来生成hashcode,所以当子类中的属性参数一样时,使用equals比较结果的为true。解耦数据层和业务层:使业务层与数据层之间的耦合度降低,业务层只需要调用 DAO 提供的接口方法,而不需要关心数据是如何存储和获取的,提高了代码的可维护性和可扩展性。在并发环境下,乐观锁可以防止数据的“脏写”,通过版本号(version)字段来保证数据的一致性。
2025-02-24 15:25:27
1027
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人