自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 MybatisPlus 页数page过大数据溢出问题

最近在修改公司代码时前端报了个奇怪的bug,即某个分页接口明明数据量只有42条,但是使用page = 500。这一行的作用就是在你的查询页数超出实际数据量时,会默认重置页数为 1 ,许多小伙伴可能之前并没有留意过这个配置。可见代码逻辑处没有问题,一时是有点蒙的,排查中突然想起 MP 存在分页配置插件,于是乎找到。可见 total 属性只有 42条数据,页数都到500了但是很夸张的还是查出来10条数据。查询后端代码后发现使用的是 MP 的分页插件。的配置时仍然可以查出数据。将这行注释掉后再请求测试。

2024-04-28 18:58:31 285 3

原创 浅谈 CDN 加速

对一个接口进行优化的方式有很多,这里浅介绍一下 CDN 加速,为读者提供一种新的优化思路。

2024-04-26 10:19:35 376 2

原创 Hibernate持久化对象与事务的坑

凡是经过 Hibernate 框架查出的对象,统一是持久化状态,持久化状态的对象会被关联存储在Hibernate SqlSession 的缓存中,在之后对这个对象任何的修改都会被记录到缓存里去,当然正常情况下你不调用 save 方法,这些缓存并不会同步到数据库中去,但是重点来了,如果你在方法上添加了@transactional 注解,那么Hibernate会自动在事务提交的时候将缓存中的数据同步到数据库中。2. 对不需要同步数据库的对象,查出后直接new一个新对象,复制属性替代原对象进行操作即可。

2024-04-15 16:05:41 299

原创 Java 获取 视频 时长

根据以下工具类,直接调用传入文件路径即可。首先在 pom 中引入包。

2024-03-14 10:10:07 473

原创 Java 使用 EasyExcel 实现导入导出(新手篇教程)

官网镇楼↓,觉得我写的不好的同学可以去官网看哦。

2024-03-11 15:17:28 1180

原创 优雅的记录日志,拒绝打印模糊信息导致bug定位难

问题可能源于前端传参的不准确,也可能是后端逻辑存在缺陷,由于缺乏具体的日志信息,我们难以在第一时间确定问题的真正原因,这无疑增加了排查和修复的难度。第10条比较重要,相信很多刚入行的同学都是对象转 json 去记录的,而且很多人用的还都是暗坑无数的 FastJson,这些问题处理不善就是一个个坑,建议大家还是采用 toString 方式去记录。然而,这些日志中极少有完整且有用的信息能够真正帮助我们在定位bug时发挥作用,这无疑增加了我们排查和解决问题的难度。不健全的日志肯定是迟早会出问题的。

2024-03-11 14:32:01 313

原创 使用飞书机器人发送消息与文件

本文默认你已拥有一个机器人,如果没有请点击以下链接创建机器人。

2024-03-08 13:42:58 1747

原创 Spring事务管理报错:Transaction rolled back because it has been marked as rollback-only

昨天一个应用了很久的功能突然报错500,追踪日志后发现是Spring的事务管理报了错。

2024-03-08 10:26:52 810

原创 Error parsing property name ‘lambda$getModuleLists$3be4e546$1‘. Didn‘t start with ‘is‘, ‘get‘ or ‘s

经核查出现此问题是因为 Mybatis-Plus 框架的条件构造器不支持 lambda 表达式传参,需要更改为方法引用传参即可。

2024-03-06 17:18:29 176

原创 Shell 脚本实现自定义解析 Json 数据

修改为 json 文件后将其上传到 Linux 的一个文件夹下作为处理数据。对于上面类型的 json 数据,首先需要把它存入一个 json 文件中。(可以先存放 txt 文件,通过修改后缀方式更改为 json 文件)在 json 文件同级目录下创建并编辑一个 shell 文件。输入 rz 指令上传编辑好的 json 数据文件。调用 sh test.sh 命令来执行。至此数据准备工作完成。编辑好后 wq 退出。

2023-12-28 18:00:04 1343

原创 JWT 简单使用教程

全称 JSON Web Token(JSON Web令牌)就是一个 String 字符串,由三部分组成1. Header2. Pyload。

2023-12-12 11:36:27 230

原创 多线程无法使用@Autowired注入问题

当我们使用线程池执行任务时,想给线程注入一个service,但是运行时发现service总是为null。根据Bean生命周期,能够被Spring管理的Bean都是在扫描范围内并且有 @Componen、@Service、@Configuration 等注释,在使用时才能用IOC注入对象。如果使用new 关键字手动生成的对象,Sring感知不到,无法管理。

2023-12-07 18:50:45 172

原创 前后端传值雪花算法id精度丢失问题

是因为前端数据类型的精度只有16位,而后端Long类型超过16位,超出的部分会丢失。在id字段上添加注解,自动将 long 转换为 string 返回给前端。

2023-11-20 10:54:43 136

原创 Java实现多线程

由上可见线程执行顺序具有随机性,与编写顺序无关。

2023-06-24 19:02:24 160

原创 线程池说明

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象。降低资源消耗、提高响应速度、方便管理;线程可以复用、可以控制最大并发数、可以管理线程。

2023-05-30 11:42:24 63

原创 类加载简述

● 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。● 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。● 通过一个类的全限定名来获取其定义的二进制字节流。1. 类的加载: 查找并加载类的二进制数据。

2023-05-29 21:33:36 63

原创 LocalDateTime用法

减少的为对应的 minus 函数,如 now.minusSeconds(1)

2023-05-15 11:51:27 133

原创 String为什么是不可变的?

我们来看一下String类的两个主要成员变量,其中value指向的是一个字符串数组,字符串中的字符就是用这个value变量存储起来的,并且用final修饰,也就是说value一旦赋予初始值之后,value指向的地址就不能再改变了。虽然value指向的数组是可以改变的,但是String也没有提供相应的方法让我们去修改value指向的数组的元素。但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。

2023-05-14 12:40:28 96

原创 Java获取当前时间

通过System类中的currentTimeMillis方法来获取当前时间,无需导入类,速度最快。通过Date类来获取当前时间,比较常用。需要使用Java.util.Date类,速度一般。Calendar 类专门用来转换特定时刻和日历字段之间的日期和时间。此方法优势是不受时区的影响,但是得到结果是时间戳的格式。同时它还支持更自由的取时间。

2023-05-13 11:38:10 12032

原创 解决Git 克隆代码 The remote end hung up unexpectedly错误

也有可能是网速太慢导致的,建议大家可以多换换试试。

2023-05-11 17:42:26 1321

原创 git 报错信息:Failed to connect to github.com port 443: Timed out

只需要在cmd中输入如下命令行,刷新DNS解析缓存即可。

2023-05-08 15:06:14 169

原创 缓存和数据库一致性问题

如何保证缓存和数据库一致性,这是很经典的话题了。本文将从最简单的场景讲起,循序渐进分析问题。

2023-05-05 09:42:18 52

原创 如何绑定Github

我们要用git上传文件到GitHub首先得利用SSH登录远程主机,而登录方式有两种:一种是口令登录;口令登录每次都要输入密码十分麻烦,而公钥登录就省去了输入密码的步骤,所以我们选择公钥授权。首先我们得在 GitHub 上添加 SSH key 配置,要想生成SSH key,就要先安装 SSH,不过我们安装了 Git Bash,其应该自带了 SSH。复制公钥 id_rsa.pub 文件里的内容,你可以通过目录找到 id_rsa.pub 文件的位置,用记事本打开文件复制。的内容粘贴到 key 内,再点击。

2023-05-04 17:50:16 178

原创 Redis分布式锁

在学习一个新技术时,建议大家最好从以下两个方面出发,渐进式学习,可以更好地帮助我们滤清思路。在一些业务中,分布式应用进行逻辑处理时经常会遇到并发问题。比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是的。这个时候就要使用到分布式锁来限制程序的并发执行。理解了这个场景,也就理解了上面两个问题了。(那么是什么意思呢?在 Wiki 中是这样解释的:所谓原子操作是指不会被打断的操作;

2023-05-04 12:12:34 53

原创 MySQL 日志

MySQL 5.1.5 之前 binlog 的格式只有 STATEMENT,5.1.5 开始支持 ROW 格式的 binlog,从 5.1.8 版本开始,MySQL 开始支持 MIXED 格式的 binlog。对于InnoDB存储引擎而言,事务在执行过程中,会先把日志写入到binlog cache中,只有在事务提交的时候,才会把binlog cache中的日志持久化到磁盘上的binlog文件中。相比较于 Row 模式来说,Statement 模式下的日志文件更小,磁盘 IO 压力也较小,性能更好有些。

2023-05-01 14:31:22 41

原创 MyISAM 和 InnoDB 有什么区别?

在 MySQL 5.5版本时,InnoDB 存储引擎取代了原先的引擎 MyISAM 成为新的默认存储引擎那么我们要思考为什么 MySQL 开发者选择使用 InnoDB 呢?MyISAM 缺点不支持事务,不支持外键不支持行级锁,最小粒度为表级锁,易发生锁冲突崩溃后无法安全恢复随着科技的发展,现在大大小小的公司业务都会遇到一些并发安全的问题,倘若发生线程冲突造成数据读取/写入错误,会造成一定的后果,对用户体验也不好。

2023-04-30 17:52:28 55

原创 RocketMQ事务消息

也就是发送 Message,但这里的 Message 叫 Half Message,即。

2023-04-29 23:06:09 95

原创 RocketMQ中Rebalance介绍

比如刚刚的 7 个 MessageQueue 分给 2 个 Consuemr,我们可以抽象地理解成:每个 Consumer 先分 3 个,然后剩下的 1 个按照 cidAll 中的顺序开始分,自然是分给排在第一位的 Consumer1 了。可不是简单的除法哦)这时候。:能均分就均分,不能均分就先保证每个 Consumer 都拿到相同数量的 MessgeQueue,然后再将剩下的从头开始分给每个 Consumer。所以我们可以将这个均分逻辑简单。

2023-04-29 19:12:05 160

原创 实现配置的可插拔

当然我个人还是偏好 RocketMQ 的,但是也不能不尊重其他人的意见,于是最后的结果是想一个更灵活的办法,不管你是 Kafka 、RocketMQ 还是什么xxxxx,我就一句话:我全都要。,这个注解可以使得满足一定条件时加载对应的配置,这不巧了吗,和我们需要的一拍即合,于是我们根据这个注解设计了对应的可插拔配置。我们的目的是做到使用者可以通过修改配置来方便的切换不同的MQ,但是想了半天也没想出什么好方法,上网查阅资料、CSDN、掘金上也找不到满意的答案,于是我们又到 Spring 的官网去找文档。

2023-04-26 18:21:42 193

原创 RocketMQ 延迟消费原理

MessageStore启动初始化的时候会开启定时任务,定时去SCHEDULE_TOPIC_XXXX相关队列中找任务消费,根据消息的延时等级计算一个目标时间,和now当前的时间进行对比,如果now当前的时间超过了目标值设定时间,就把这个消息投入到正常的topic相关队列中,进行消费。延迟消息保存到队列后会开启一个线程不断地对队列进行扫描,当检测出到达到时限的消息时就会将它取出进行消费。有延迟等级的消息会被截胡保存到延迟消息队列。一共有18个队列,对应不同的延迟消费等级。延迟消息的时间不支持很高的自定义度。

2023-04-26 17:31:04 511

原创 DFS 习题练手

最近在刷 DFS 类型的算法题,遇到了几道很不错的练手题型,推荐给有需要的小伙伴来试试。

2023-04-26 13:57:44 47

原创 GO语言安装流程(Windows)

一栏输入你 GO 文件所在的目录(我的是D:\Go\Go)。默认安装在 C 盘下 ,可以自定义路径但是注意不要包含中文。一个命名为 workspace 用于存放你的代码。,这个就是 Go 环境所在目录的配置。配置时我建议配置两个目录,用英文分号隔开。,以后开发的代码就写在这个文件夹中。输入以下内容代表安装成功。,打开环境变量设置窗口。,这个是 Go 项目的。点击图中红框处的新建,在。新建两个环境变量配置,最后点击确定配置完毕。

2023-04-26 13:34:14 1305

原创 RocketMQ:MessageQueue选择原理

可以看到这里的逻辑也被 lastBrokerName 分成了两部分,这个 lastBrokerName 代表上次选择的 MessageQueue 所在的 Broker,并且它只会在第一次投递失败之后的后续重试流程中有值。在首次进入 incrementAndGet() 逻辑时,index 肯定是 null,所以这里会随机生成一个数,而后续的调用都会在最初生成的随机值上。的,所以在第一次正常投递 Message 时,它肯定为 null。只有在第 2、3 次循环时 mq 才有值,而进行到了 2、3 次就说明。

2023-04-25 16:37:42 153

原创 Broker如何检索Message

有一个请求,那 Broker 必然会有一个processor初始化后的 Handler 来专门处理它,拉取消息对应的 RequestCode 是,顾名思义就是拉取 MessageMessageStore,即 Broker 对消息存储的封装。传参:简单翻译一下:从指定 Topic MessageQueue 中查询 Message,查询条数由 maxMsgNums 控制,查询的起始偏移量由 offset 控制,最后结果将通过 MessageFilter 进一步筛选,

2023-04-25 16:34:55 44

原创 二叉树的前序遍历、中序遍历、后序遍历

前序遍历按照“根结点-左子节点-右子节点”的顺序进行访问。中序遍历按照“左子节点-根结点-右子节点”的顺序进行访问。后序遍历按照“左子节点-右子节点-根结点”的顺序进行访问。

2023-04-17 10:11:15 26

原创 Broker心跳机制

NameServer 的数据是旧的,Broker 就会重新执行心跳,换句话说:needRegister() 的判定就会为 true。Broker 会去请求所有的 NameServer,查询自己传给 NameServer 的数据,然后跟自己本地的数据版本做一个对比。在多nameserver情况下,broker会开线程并发的去执行心跳,等待所有心跳结束统一返回,结束阻塞继续处理命令。启动一个定时任务,默认每30秒发送一次注册心跳到Nameserver,最短10秒最长60秒。上次更新时间戳与版本号。

2023-04-15 17:35:04 50

原创 Broker启动流程

通过cl来加载对Broker的配置信息,存储到option中,读取对应的配置信息后解析生成配置类。从配置中获取多个Nameserver的地址信息,并进行参数校验,比如host地址port什么的。判断变量信息是否存在,不存在就杀死系统进程。先调用方法创建Broker的实例。三板斧: 实例化、初始化、使用。

2023-04-15 17:32:44 95

原创 RocketMQ中MessageQueue的选择原理

第一种:正常发送消息这是正常发送消息的内部逻辑,1. 通过调用sendWhichQueue.incrementAndGet() 方法获得一个 index 值2. 将 index 与队列数取余 得到处理后的 pos 下标值3. 根据 pos 下标取得应该发送的队列

2023-04-08 20:25:16 208 1

原创 责任链模式Java

首先要明确:用责任链模式的好处就是分工明确,解耦,容易维护。将多个处理流程分散到各个的处理类上,耦合性相对较低。增加一个具体的新处理类,不会影响到其他处理类的代码责任链模式的缺点:项目里边会有多个处理类(因为每种处理都抽象为一个类,所以会有多个类)不好调试,初看代码时不好阅读。再讲一下常见的责任链模式应用,就是Interceptor拦截器

2023-04-01 15:39:51 86

原创 log.isTraceEnabled()

log.isXXXEnabled()此方法用于判断某个级别的日志是否被允许输出,多用于系统性能优化操作

2023-03-20 22:35:11 474

空空如也

空空如也

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

TA关注的人

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