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

原创 Java之内部类
类的五大成员:属性,方法,构造器,代码块和内部类内部类字如其名就是在类的内部定义一个类这个类就叫做内部类内部类最大的特点是可以直接访问私有属性,并可以体现类与类之间的包含关系。从种类上说,内部类可以分为四类:首先是定义在外部类的成员位置上的普通内部类(没用static修饰)和静态内部类(使用static修饰)然后是定义在外部类的局部位置上(比如说方法体内)的匿名内部类(无类名)、局部内部类(有类名)我们来一个个看:在这种定义方式下,成员内部类对象依赖外部类对象而存在,即在创建一个普通内部类对象时首先需
2022-06-14 22:34:41
1114
原创 幂等性简单介绍
摘要: 幂等性指操作多次执行与单次执行的最终效果一致,是分布式系统的重要特性。常见幂等性问题源于重复提交、网络重试等,可能导致重复扣款、数据错乱等后果。天然幂等的操作包括查询、纯删除等;需设计幂等的场景如创建、条件更新等。实现方案包括:1)Token机制防前端重复提交;2)唯一索引约束数据库重复记录;3)乐观锁通过版本号控制更新;4)状态机限制非法状态流转;5)分布式锁(性能较低)。不同场景可组合使用这些方案确保业务安全。
2025-07-23 17:18:04
307
原创 SQL开窗函数
SQL开窗函数是MySQL 8.0引入的强大功能,用于在保留原数据行的同时进行复杂计算。它通过OVER()子句实现,与聚合函数不同,不会压缩数据。典型应用场景包括:1)排名计算(ROW_NUMBER、RANK、DENSE_RANK);2)累计值计算(如按月累计销售额);3)移动平均/总计(限定窗口范围);4)相邻行比较(LAG/LEAD函数);5)占比计算(如工资占部门比例)。开窗函数能简化SQL编写,实现明细级累加等传统SQL难以完成的操作,是数据分析的重要工具。
2025-07-11 23:05:32
1073
1
原创 异步复习(线程)
Java线程初始化与线程池使用总结 线程初始化四种方法: 继承Thread类 实现Runnable接口 实现Callable接口+FutureTask(可获取结果) 线程池(推荐方式) 方法对比: Thread/Runnable无法获取结果且资源消耗大 Callable+FutureTask可获取结果但资源控制差 线程池最常用,支持结果获取(resubmit)和资源控制 线程池创建: Executors工具类提供简单创建方式(不推荐生产使用) 推荐直接new ThreadPoolExecutor(7个参数)
2025-07-11 20:59:06
334
原创 SpringCache整合SpringBoot使用
本文介绍了Spring Boot整合Spring Cache的完整指南。主要内容包括:1)整合步骤:添加依赖、启用缓存、配置Redis等缓存实现;2)核心注解详解:@Cacheable(查询缓存)、@CachePut(更新缓存)、@CacheEvict(删除缓存)等;3)关键配置技巧:自定义Key生成器、SpEL表达式高级用法、TTL随机化防止雪崩;4)常见问题解决方案。文章提供了详细的代码示例和配置说明,帮助开发者快速掌握Spring Cache的使用方法,实现高效的缓存管理。
2025-07-09 17:02:17
449
原创 ElasticSearch快速入门-1
Elasticsearch(ES)是一个面向文档的搜索引擎数据库,采用JSON格式存储数据。其核心概念包括索引(类似MySQL数据库)、文档(表行数据)和字段(表列)。ES与关系型数据库的主要区别在于:1)ES采用动态映射结构,无需预定义字段;2)数据存储为半结构化JSON文档而非结构化记录;3)查询使用JSON格式的DSL语言而非SQL。ES8版本后已废弃类型(Type)概念,每个索引仅存储单一数据类型。文档通过"_id"字段作为唯一标识,相当于MySQL的主键。
2025-07-04 14:52:29
1089
原创 HTTP协议-后端接收请求
本文介绍了5种常见的POST请求数据格式及后端接收方式:1)表单默认格式(application/x-www-form-urlencoded)使用@RequestParam接收键值对;2)文件上传格式(multipart/form-data)通过@RequestPart接收文件;3)JSON格式(application/json)使用@RequestBody绑定对象;4)XML格式(application/xml)需要JAXB注解处理;5)二进制数据(binary)可用InputStream或byte[]接
2025-06-26 17:01:35
469
原创 MySQL进阶篇-InnoDB引擎(超细)
本文详细介绍了InnoDB存储引擎的逻辑存储结构、架构、事务原理和MVCC机制。逻辑存储结构包括表空间、段、区、页和行,其中表空间用于存储记录和索引,段管理多个区,区是表空间的单元结构,页是磁盘管理的最小单元,行是数据存储的基本单位。InnoDB的架构分为内存结构和磁盘结构,内存结构包括缓冲池、更改缓冲区、自适应哈希索引和日志缓冲区,磁盘结构包括系统表空间、独立表空间、通用表空间、撤销表空间、临时表空间和双写缓冲区。这些组件共同协作,提升InnoDB的性能和可靠性。
2025-05-19 17:22:14
978
原创 OpenCV-图像分割
实验1展示了如何使用OpenCV和Matplotlib库对图像进行灰度转换和多种阈值化处理,包括BINARY、BINARY_INV、TRUNC、TOZERO和TOZERO_INV等操作,并通过子图展示处理结果。实验2则演示了自适应阈值处理,通过均值和高斯方法对图像进行局部阈值化,并分析了不同参数对结果的影响。实验3进一步结合了中值滤波和固定阈值与自适应阈值分割,展示了不同分割方法的效果。这些实验共同展示了图像处理中常用的阈值化技术及其应用场景。
2025-05-18 09:08:34
1308
原创 OpenCV-python数学形态学
本文介绍了三个图像处理实验,分别通过形态学操作提取图像边缘、进行Hit or Miss变换以及提取图像中的水平线或垂直线。实验一通过膨胀和腐蚀操作获取图像边缘,并对结果进行二值化和反色处理,最终得到清晰的边缘图像。实验二通过Hit or Miss变换,匹配输入图像中的特定模式,提取出边缘信息,展示了核在图像上的匹配过程。实验三通过形态学开操作,提取图像中的水平线或垂直线,并对结果进行反色处理,展示了线条提取的效果。三个实验均通过代码实现,并展示了处理前后的图像对比,验证了形态学操作在图像处理中的有效性。
2025-05-18 09:04:30
1034
原创 OpenCV-去噪效果和评估指标方法
本实验主要探讨了图像处理中常见的噪音类型及其去噪方法,并通过实验验证了不同去噪方法的效果。常见的噪音类型包括高斯噪音、椒盐噪音、毛刺噪音、泊松噪音和光斑噪音。针对这些噪音,实验采用了均值滤波、中值滤波、高斯滤波、双边滤波、非局部均值滤波、K近邻平均滤波和快速傅里叶变换等多种去噪方法。实验设计选取了彩色图像,对其进行灰度化处理并添加高斯噪音和椒盐噪音,分别使用不同的去噪方法进行处理,并通过峰值信噪比(PSNR)和结构相似性指标(SSIM)进行评估。实验结果表明,不同的噪音类型和去噪方法对图像质量有显著影响,选
2025-05-18 08:57:29
1160
原创 OpenCV-python边缘检测和金字塔
本文介绍了三个基于OpenCV的图像处理实验。实验1展示了均值滤波效果,通过调整轨迹条改变滤波核大小,实现图像平滑处理。实验2实现了高斯滤波,将彩色图像转换为灰度图像后,使用自定义高斯卷积核进行滤波处理,有效减少图像噪声。实验3进一步扩展了高斯滤波的应用,通过滑动条实时调整高斯滤波的核大小和标准差,动态展示不同参数下的滤波效果。这三个实验均通过OpenCV库实现,展示了图像处理中常用的滤波技术,并提供了交互式界面,便于用户观察不同参数对图像处理效果的影响。实验结果表明,均值滤波和高斯滤波都能有效平滑图像,但
2025-05-18 08:50:33
1031
原创 OpenCV-python灰度变化和直方图修正类型
实验1至实验5展示了多种图像处理方法。实验1使用加权平均值法将彩色图像转换为灰度图像,通过0.3、0.59和0.11的权重对RGB通道进行加权平均。实验2采用最大值法,将RGB通道的最大值作为灰度值。实验3使用平均值法,对RGB通道取平均值作为灰度值。实验4通过加权平均值法,并优化浮点运算,加速灰度转换。实验5对图像进行截断操作,将超过255的像素值截断为255。这些实验展示了不同的灰度化方法及其效果,适用于不同的图像处理需求。
2025-05-18 08:44:50
1103
原创 MySQL进阶篇2-SQL优化、锁
本文介绍了SQL语句的性能优化方法,主要包括插入数据优化、主键优化、order by优化、group by优化和limit优化。在插入数据时,建议采用批量插入、手动提交事务和主键顺序插入,以提高效率。主键优化部分解释了页分裂和页合并的概念,并提出了主键设计原则。order by优化建议尽量使用索引排序,避免使用filesort。group by优化强调遵循最左前缀原则,避免使用临时表。limit优化则建议通过连表查询等方式减少数据扫描量。通过这些优化措施,可以有效提升SQL查询的性能。
2025-05-10 23:12:59
877
原创 Redis最佳实践
得到的是每一种数据类型占用内存最多的那一个,排名第一的不一定是bigkey,即使第一个是bigkey那排名第二的也可能是bigkey,只显示排名第一可能就把排名第二的bigkey错过了。原来一个key就能保存现在需要多个key,虽然从数据上看没有增多,但是每一次存储k-v结构在redis内部都是有很多原信息要保存的,key越多现在想要存储的。利用redis-cli提供的–bigkeys参数,可以遍历分析所有key,并返回Key的整体统计信息与每个数据的Top1的big key。
2025-04-28 10:51:58
1327
原创 Redis 分布式锁+秒杀异步优化
所以这里使用UUID作为表示,由于这里UUID是static属性,所有对象公用一个,只能表示JVM的唯一性,而不能标识JVM中的线程,所以释放锁的时候比对ThreadId。一个JVM一个锁监视器,只能保证请求该JVM的线程互斥,保证不了其他JVM的,所以分布式情况下也可能两个线程(userid相同)进入同步代码块,导致线程安全问题。不可重入:方法A调用方法B,方法A和方法B都需要获取到该锁资源,若是不可冲入锁,会导致死锁,A执行不完不能释放锁,B拿不到锁导致A执行不完。
2025-04-15 16:05:04
758
原创 Redis-高级篇(分布式缓存/持久化)
所以全量同步的过程就是如下图:slave来和master同步时,会携带replid和offset,replid不一致就说明是第一次来,然后master就会返回自己的replid和offest,slave记录这两个值,以后来时都携带上和master做增量同步。此时我们有一个新的Redis,该Redis性能比较好,需要把原来的master替换掉,这种场景就可以使用本小结的命令来执行,让其成为master的slave,然后把master替换掉。fork子进程,压缩,写入RDB文件都比较耗时。
2025-04-15 09:24:28
755
原创 RabbitMQ从入门到实战-3(高可靠性)
前言保证消息的到达是使用MQ的一个关键也是一个前提MQ消息达不到数据库有三种可能1.发送消息的支付服务因为网络波动等原因消息为发出去2.mq挂了,消息没转发出去3.交易服务挂了,没有收到信息下面解决方案也是主要针对这三种情况进行解决但就算解决也不能保证100%不丢失,所以会有一些二兜底方案-延迟消息。
2025-04-09 17:53:07
1038
原创 线程安全问题解决方案-单机环境
线程安全问题-商品超卖主要是先查后删,你查到的时候可能别的线程还没删完,后而你又删,造成了多删,致使我们的外卖超卖。
2025-04-01 11:49:40
341
转载 Lambda表达式 And Stream流
Function<T,R>也是一个函数式接口 R对应返回结果,T 为参数类型,将参数t进行apply里面的操作然后返回 R。比如该方法 集合中每一个元素对应s,s执行s.startWith(‘张’),如果结果为true就留下,false过滤掉。这个lambda表达式就相当于一个匿名对象,两种效果相同,实现那个接口。因为只有一个抽象方法,所以方法名是固定的,这里就省略了实现方法名。(Function接口中的方法 R apply(T t))返回一个stream对象,这个就是我们的流对象。
2025-03-19 17:13:50
61
原创 涨知识-关于局部内部类访问局部变量
当method()方法出栈之后,new Inner()对象仍然想使用int num,就无法使用了。因为当调用这个方法时,局部变量如果没有final修饰,它的生命周期和方法的生命周期是一样的,那么如果局部内部类对象还没有马上消失,想用这个局部变量时,就没有了。final修饰的变量是常量,进入常量池,不在栈中。局部内部类在访问它所在方法中的局部变量必须用final修饰,为什么?int num的生命周期和method()方法的生命周期是一样。常量池的作用:延迟变量的生命周期。会在类加载的时候进入常量池,
2025-03-19 15:38:59
874
6
原创 RabbitMQ从入门到实战-1
需要绑定交换机队列之间的关系,交换机只能做路由,没办法存储消息发送信息后exchange的控制台显示一条进,两条出(这个交换机连了两个队列,所以1:2)queue也接收到了(这里是2因为我试了两次)
2025-03-03 10:08:34
362
原创 Docker
Docker就是帮我们快速帮我们部署项目和各种组件的的工具正常在linux上装mysql很麻烦,步骤也很多但是你用docker就可以一行代码就搞定类似应用商店?可以直接帮我们下载各种东西,不用来回找运维这块干的较多。
2025-03-01 18:23:44
881
4
原创 配置虚拟机Linux和ssh
(所以配置SSH要写的IP地址要与虚拟机的IPV4地址相对)虚拟机开启,SSH才可以连接到对centos进行操作。Vmware是虚拟机用来运行我们的centos7(Linux的一个发行版本)而我们的SSH(MobaXterm)是连接到我们centos7进行操作的。这里参考下面的环境搭建。下面是我搭建好的这个。
2025-03-01 14:33:31
275
原创 Git快速入门
Git就是版本控制的工具下面这个叫手动控制版本svn是集中版本控制只有一个服务器有全部代码git是分布式版本控制安装后有三个不同选项的可以进行版本管理建议用 git bash。
2025-02-28 23:20:01
1197
原创 JAVA面试八股文
实话这个感觉现在不常用应该不会考问的话你就说@AutoWired装配默认安装类型注入这里会存在冲突就是一个接口注入但多个实现类可以配合我们的@Qualifier指定bean名字或者@Primary(有个属性1-10,表注入优先级,默认为5)指定对应的实现类,优先级高的会先注入或者用@Resource指定bean名字注入。
2025-02-27 15:08:00
819
原创 Spring(历史)
这里主要针对于spring的针对性学习spring底层架构上层依赖下层核心容器-IOCAOP依赖于IOC,AOP是一种思想,而真正实现我们是用了Aspects做的api吧(spring官方直接把人的借鉴了)web开发和数据库开发(含事务)也继承在系统架构中。
2025-02-27 09:27:48
435
原创 Seata
分布式事务产生原因比如这个购买行为触发看三个服务的三个行为,但是当库存有错误时候没法提交就会回滚,但是其他两个没有错误就不会回滚这样会导致数据的不一致性不同服务模块连接不同数据库每个服务器对应的数据库不同确保每个服务都能正常的扣减/增添(逻辑功能正常)本地事务测试使用注解式事务标记测试springboot还要写个开启事务的注解?(我记得以前没用过这一步)然后这个可以保证我们在注解标注方法抛异常时候进行回滚但是这个只有在单体架构时候有用然后我们打通一下远程链路。
2025-02-26 17:38:17
720
原创 Sentinel
使用Sentinel要明白1.先定义你需要保护的资源这里的资源我们的那些web接口(controller的那些方法)是默认就配置的我们也可以使用注解标志方法为我们想保护的资源2.然后定义各种保护规则3.违反规则后我们要不要处理这个异常,怎么处理这个异常。
2025-02-25 23:10:53
1629
原创 Nacos
工程目录最大父工程对springboot,spingcloud,springcloudaliaba进行依赖管理,打包方式为pomservices进行依赖传递,打包也为pom好像打包为pom也可以进行依赖传递,也可以进行版本管理,打包为pom只是说他是一个聚合工程/父工程导入一下nacos的服务发现依赖和服务调用(不用写版本,应该是cloud-demo的springcloud什么的有关于这个的依赖管理)nacos核心功能就是服务注册和服务发现去官网下载zip,解压,然后放到无中文目录,目录中
2025-02-24 11:44:11
810
原创 微服务框架及其中出现的各种问题和对应的解决方案/组件
然后通过一个网关(nignx)进行负载均衡,平均将请求分给每个服务器(他有自己的算法,可能也不是平均),网关就起到一个路由的作用。就是把我们的功能单独出来做成微服务,同时我们数据库也可以拆分成不同的库(比如商品就用商品表和一些其他的表)然后有重复业务,比如订单表要查商品的数据库,就去请求商品的微服务(远程调用),而不是直接去访问商品数据库。(如果这个服务多个服务器都有,也可以做负载均衡,第一次请求0.4,第二次请求0.5)比如用户调订单,订单卡了,就快速返回错误信息,就用户不等订单。
2025-02-22 22:03:43
409
原创 MybatisPlus-扩展功能
这样返回的是对象名啊,如果想设置别的作为返回的json数据的话,用@JsonValue标注。因为他是enum类型如果你查出个3他也没法创建啊,枚举类不给set,且构造方法是私有的。但是枚举类型和数据库中表的字段不匹配,怎么实现这个数据类型的转换呢?枚举类那个对应表的字段一定要包含数据库对应字段所以可能出现的情况。我们查User表里面有个Userinfo的json属性。我们就用对象接收UserJson,需要json处理器。分页查询实体(所有业务分页查询都可以用它)和封装VO的过程是每个分页查询都会做的。
2025-02-16 17:55:36
768
原创 Spring依赖循环问题
其实也不是很难就是B中注入A的二级缓存对象就可以用为什么?因为虽然B中注入的不是完整初始化的A,它算是个引用吧当B操作执行完A再执行完,A就完全初始化放入一级缓存,而我们对象如果是单例的话,对应B中A的依赖注入不也完成初始化了吗填充时用的是对象引用,都是单例的。等a完全创建完后,b中的a不就也可以了吗。
2025-02-16 11:39:32
624
原创 Mybatisplus-IService
IService类似于我们的BaseMapper吧现在就是Service层的那些简单的CRUD也不用写了下面是方法图。
2025-02-15 19:57:42
706
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人