自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 idea 撤销吴提交代码

HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1。如果想对前两次的commit都撤回,可以使用HEAD~2。操作:右键->git->Reset Head。点击reset 即可。

2026-04-01 11:23:18 77

原创 缓存推荐JetCache的使用方法与步骤

如果要使用参数名(比如这里的key="#userId"),项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key="args[0]"这样按下标访问的形式。SpEL(Spring Expression Language) 是 Spring 提供的一套强大的表达式语言,类似于 OGNL、MVEL 或 EL,但功能更强大,能够在 运行时解析和执行表达式。在 Spring 体系中,SpEL 常用于 配置、注解、条件判断、动态值计算 等场景。

2026-03-18 14:26:41 417

原创 Java 什么时候用 for,什么时候用 Stream?

Java 自动帮你用多线程处理!这 8 种情况,优先选。发现空文件就立即停止。

2025-12-19 17:21:03 424

原创 Redis最佳实践--键值设计

优点: 可读性强 避免key冲突 方便管理 更节省内存:key是string类型,底层编码包含int、embstr和raw三种。embstr在小于44字节使用,采用连续内存空间,内存占用更小(2)【建议】:简洁性(3)【强制】:不要包含特殊字符(4)、拒绝BigKey(1)【强制】:拒绝bigkey(防止网卡流量、慢查询)在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素,但实际中如果下面两种情况

2025-12-17 11:34:27 808

原创 java 编程 如何让自己写的代码更优雅、更健硕?

使用 if return 代替 嵌套 if。

2025-12-16 11:33:02 238

原创 HashMap原理解析

假设我再次 put(“"元直”,666),在 HashMap 中插入"元直"这个元素,通过 hash 算法算出 index 位置也是 3。3.3 如果p为链表,循环链表是否有对应key,true先保存下来,false,key对应节点添加到尾部,并判断链表长度是否 > TREEIFY_THRESHOLD - 1 = 7,true,尝试进行树形化。3.1 变量p为key对应位置节点,如果直接和key相等,也就是这个node只是一个节点,不是链表或者红黑树,直接通过变量e保存p。这时的结构如下所示,还是个数组。

2025-12-03 18:35:05 611

原创 MySQL 索引失效

在工作中,为了提高查询速度,我们通常会考虑为字段建立索引。然而,索引并不是万无一失的。即使建立了索引,并不意味着所有查询语句都能利用索引进行扫描。索引失效的原因如下。

2025-12-02 16:38:39 995

原创 MySQL 事务隔离性及锁

事务隔离性(Isolation)是指多个并发事务之间相互隔离,一个事务的执行不应该影响其他事务的执行。MySQL 支持四种事务隔离级别,默认隔离级别:可重复读(Repeatable Read)。锁的行为与事务的隔离级别紧密相关:通常不加锁,通过直接读最新数据实现,存在脏读、幻读等问题。每次读取的都是已提交的最新数据(快照)。对于 UPDATE、DELETE,只对实际修改的行加锁(记录锁),不使用间隙锁,所无法避免幻读。在事务开始时创建一致性视图,整个事务期间都读取这个视图。

2025-11-30 20:20:03 859

原创 mysql 之 索引结构

索引是帮助MySQL高效获取数据的数据结构MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。

2025-11-29 21:39:52 775

原创 一台 Java 服务器可以跑多少个线程?

线程是非常宝贵的资源,我们要严格控制线程的数量,象上面我们的截图情况,显然线程数量过多。/proc/sys/kernel/pid_max 增大,线程数量增大,pid_max有最高值,超过之后不再改变,而且32,64位也不一样。共计1661个线程,和监控数据得出的吻合。但这个数量应该是大了,我们都知道线程多了,就会有线程切换,带来性能开销。因此操作系统对一个进程下的线程数量是有限制的,不能无限的增多。,比如我们的容器本身大小是8G,堆大小是4096M,走-Xss默认值,可以得出 最大线程数量:4096个。

2025-07-22 17:27:38 561

原创 java的synchronized 原理及功能

Java中的synchronized关键字是一种同步机制,用于控制多个线程对共享资源的访问。

2025-05-21 16:29:25 468

原创 Feign踩坑记录:JSON parse error : Illegal character ((CTRL-CHAR, code 31)): only regular white space

(ASCII码31,即CTRL-CHAR),接收方若未正确解压,直接将压缩二进制流作为JSON解析,会因非法控制字符触发解析异常。Feign默认在请求体超过2048字节时会自动启用GZIP压缩15。压缩后的数据头部包含。

2025-05-07 16:02:17 1022

原创 MySQL数据库中查出两张表中不同

方法二:使用LEFT JOIN方法三:使用NOT IN

2025-03-21 14:31:23 627

原创 MySQL索引机制

更糟糕的是,如果数据页已经满了,则需要新申请一个新的数据页,然后挪动数据,这就是页分裂。如果MySQL数据表中你创建了一个整数类型的索引,这个N差不多是1200,树高是4时,整棵树可以存储1200的3次方,也就是17亿数据,查找一个数据只需要访问3次磁盘,很nice~对于一个业务写完之后立即就要访问,将更新操作记录在change buffer之后,由于马上访问这个数据页,会立即出触发merge操作,增加随机访问IO次数,此时,change buffer反而起到了反作用,增加了维护代价,可以使用唯一索引。

2025-03-14 11:45:05 621

原创 CommandLineRunner 在执行过程中报错,导致 Spring 容器关闭,应用停止服务。

发现是SpringApplication类中的callRunners() 调用了该方法,callRunners()中并没有try-catch callRuner()方法中可能抛出的异常,所以异常继续向上抛。3.4 发现在SpringApplication类中的run(String... args)方法调用了callRunners()方法,并try-catch了异常,对异常做了处理。3.2 callRunner() 方法中try-catch 了异常,并把异常抛出。模拟服务启动时要初始化一些资源。

2025-03-12 12:15:00 497

原创 java 创建对象有几种方式?

通过序列化(Serialization)和反序列化(Deserialization),你可以将对象的状态保存到文件中,并在需要时重新创建对象。它允许你使用多个简单的对象通过组合的方式来构造所需的复杂对象。如果一个类实现了 Cloneable 接口并重写了 Object 类的 clone() 方法,你可以通过调用该对象的 clone() 方法来创建对象的一个副本。这通常用于需要动态加载类或者在不直接访问源代码的情况下创建对象的情况。通过使用 new 关键字,你可以直接调用类的构造函数来创建对象。

2025-03-07 09:42:00 373

原创 java.util.concurrent包之ScheduledExecutorService

是的一个子接口。它主要用于在给定的延迟之后或周期性地执行任务。这个接口提供了一种方便的方式来处理异步任务的调度,相比于传统的Timer和TimerTask,它具有更好的灵活性和可靠性,特别是在处理多线程环境下的任务调度时。我们可以通过,更有效地管理和调度多个异步任务,这些任务可以是一次性执行的,也可以是周期性重复执行的。

2025-02-28 17:18:18 571

原创 java.util.concurrent包概览

包提供了丰富的并发工具和数据结构,使得编写高性能、高可靠性的多线程应用程序变得更加容易。通过合理使用这些工具,可以显著提高程序的并发性能和可维护性。

2025-02-28 17:11:28 1065

原创 RabbitMQ 入门

MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游 “逻辑解耦+物理解耦” 的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。

2025-02-18 17:38:42 1160

原创 Java 并发编程知识点

进程:程序的一次执行过程。一个 Java 程序的运行一般是 main 线程和多个其他线程同时运行。线程:比进程更小的执行单位。同类的多个线程共享进程的堆和方法区,但每个线程有自己的程序计数器、虚拟机栈、本地方法栈。程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。程序计数器:记录java代码下一条指令的地址,字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制;

2025-02-14 14:37:04 894

原创 MySQL 联合索引的最左匹配原则

环境:MySQL 版本:8.0.27。

2025-02-13 17:39:03 524

原创 磁盘与mysql的故事

mysql 查找 MmoMartin 字符串,首先通过 B+ 树找到索引的盒子,然后通过盒子直接去找分流的盒子,然后遍历分流盒子的数据,由于 mysql 是行式存储(因为每列都带有数据类型,建表的列时需要指定大小,如下图),按照每列指定的的大小进行偏移就可以将带有 MmoMartin 的该行数据读取,输出,这样就提升了查找的能力,这也是设计数据库时为啥要尽量的设计列字段的大小合适的原因,大的在偏移过程中是需要时间的。由于索引列的数据也是放在盒子的,为了在查找索引的盒子的速度再提升,就有了。

2025-02-13 15:27:35 543

原创 jvm知识点

即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(Current Frame),与当前栈帧相对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)。堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的,一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域,Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。

2025-02-06 15:38:06 1272

原创 springBoot tomcat

【代码】springBoot tomcat。

2025-01-21 16:42:42 610

原创 线程池 ThreadPoolExecutor

RUNNING:在这个状态的线程池能判断接受新提交的任务,并且也能处理阻塞队列中的任务;SHUTDOWN:处于关闭的状态,该线程池不能接受新提交的任务,但是可以处理阻塞队列中已经保存的任务,在线程处于RUNNING状态,调用shutdown()方法能切换为该状态;STOP:线程池处于该状态时既不能接受新的任务也不能处理阻塞队列中的任务,并且能中断现在线程中的任务。当线程处于RUNNING和SHUTDOWN状态,调用shutdownNow()方法就可以使线程变为该状态;

2025-01-17 10:51:09 1048

原创 Java String源码笔记

..1、实现Serializable,可以实现序列化。序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。2、使用final表示不能被继承,里面的方法不能被重写,使用char数组来存储字符串元素。3、hash储存字符串的hash码,首次调用 hashCode() 方法时,会计算并存储哈希码值,之后再次调用 hashCode() 时直接返回缓存的值,避免重复计算,提高性能。

2025-01-10 10:35:47 373

原创 SpringBoot自动配置之@EnableAutoConfiguration

自动配置类通过添加 @AutoConfiguration 注解实现。因为 @AutoConfiguration 注解本身是以 @Configuration 注解的,所以自动配置类可以算是一个标准的基于 @Configuration 注解的类。@Conditional 注解可以用于声明自动配置启用条件,通常,我们可以使用 @ConditionalOnClass、@ConditionalOnMissingBean 注解。

2025-01-07 15:31:51 546

原创 mysql 数据库锁及解锁办法

通过SELECT * FROM information_schema.innodb_trx查询未提交事务,查到一个一直没有提交的只读事务(trx_state=”LOCK WAIT”),找到对应线程,执行:kill 线程ID。如果这行和 TRX_IS_READ_ONLY 都为1的话,InnoDB会优化事务,以减少事务改变表数据的开销。INNODB_TRX表提供了当前在InnoDB内部执行的所有事务信息,包含事务是否在等待锁,事务何时开始以及事务正在执行的SQL语句(如果有的话,sql语句阻塞就可以显示)。

2025-01-03 14:49:51 974

原创 使用aop的方式,自定义实现一个权限注解

【代码】使用aop的方式,自定义实现一个权限注解。

2024-08-22 11:18:56 907 1

原创 liunx 安装 emqx

在开始安装wget之前,您需要先确认系统是否已经安装了wget。在绝大多数Linux系统上,wget已经默认安装。服务器开放18083和1883端口。

2024-07-04 10:52:02 1245

原创 mysql查询异常之Communications link failure

1.查了一下网络是没有问题的,后来发现是这张表的数据量太大,又是连表查询,查询时间超过了配置的最大等待时间而报错,因此对查询语句进行了优化,满足在最大等待时间内。

2024-05-15 11:53:54 489

原创 JSONObject 转String null值转换规则。

调用public static String toJSONString(Object object, SerializerFeature... features)方法,输入null的序列化规则,可以输出值为null的字段。当使用alibaba的fastjson工具类序列化实体类时,默认其会自动过滤掉null空的字段属性,在序列化的时候不会进行展示。

2024-04-25 10:24:42 1319

原创 Java 查看bean注入到 BeanFactory时的组件名称

对象实现ApplicationContextAware接口,重写setApplicationContext()方法,添加断点可以查看这个对象。导致调用的通过@Resource注入到该bean中的bean都为null。注册的时候时@17586,通过方法调用的时候为@26421。通过debug调试发现调用的使用和注册的时候不一样。

2024-04-23 18:53:01 303

原创 Java的反射简单快速上手应用

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。

2024-04-23 16:36:36 376

原创 @AutoWired spring对多线程Bean无法注入的原因

在spring中,如果需要在异步线程中注入bean,会发现bean是空的情况。原因据说是spring bean 出于线程安全考虑,不得注入bean至线程类(Runnable接口的派生类),报空指针异常。Spring API 中有ApplicationContextAware 这个接口,实现了这个接口的类,可以在IOC容器初始化完成后获得容器,从而可以获得容器中所有的bean。前提是对应的类要带上组件(如@Component)2、通过在spring配置文件中定义Bean属性(这里有一些细节问题后面会讲到)

2024-04-22 10:21:57 424

原创 自己用到的一些方法

【代码】自己用到的一些方法。

2024-04-16 15:54:27 153

原创 MySql数据库实现数据存则删除、更新,不存在则插入

如上语句的意思的意思是如果字段1不存在(主键,索引或者唯一条件不存在),则执行插入语句,存在则执行更新语句,该更新是将该条存在的记录删除,然后再插入,所以其他的字段的值都是NULL。如上语句的意思是如果字段1不存在(主键,索引或者唯一条件不存在),则执行插入语句,如果存在,直接忽略不修改任何数据,不会报错。如上语句的意思的意思是如果字段1不存在(主键,索引或者唯一条件不存在),则执行。,存在则执行更新语句,该更新只更新需要的字段,不影响其他字段的值;:多线程并发会导致死锁的可能。

2024-04-16 15:24:11 679

原创 mysql解决插入根据某条件判断是否插入

exists :如果子查询查询到了列那么就为真。not exists : 如果子查询查询不到结果则返回值为真。如果配合 insertinto、select、update、delete的where 条件使用,就能根据某些条件,先判断条件是否满足在做相应的操作。示例:用户做报警插入时,需要要传入一个报警周期时间filterTime,在这个周期内不存在同样的一条记录才做新增,否则不需要新增,避免频繁报警。

2024-04-16 15:05:35 950

原创 MySQL查询结果为null,返回0,或者其他表达式。

函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数。函数返回第二个参数,两个参数可以是文字值或表达式。

2024-04-16 14:29:38 1491

原创 天气预测网站

MSN

2024-04-13 22:55:27 452

空空如也

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

TA关注的人

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