自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql为什么使用B+Tree作为索引结构

总体来说,我认为技术方案的选型,更多的要根据具体的业务场景来决定,并不一定是说B+树就是最好的选择,就像MongoDB里面采用B树结构,本质上来说,其实是关系型数据库和非关系型数据库的差异。

2024-02-04 14:45:21 600

原创 父子线程如何共享数据?

使用InheritableThreadLocal类。

2024-01-25 11:44:53 570

原创 count(1)、count(*)与 count(列名)的区别?

count(*)包括了所有列,相当于行数,在统计结果时候,不会忽略列值为NULLcount(1)包括了忽略所有列,用 1代表代码行,在统计结果时候,不会忽略列值为NULLcount(列名)只包括列名那一列,在统计结果时候,会忽略列值为空(这里空不是只空字符串或者 0,而是表示 null)计数,即某个字段值为 NULL时,不统计。

2024-01-09 17:23:36 459

原创 select for update会锁表还是行锁还是其它

select查询语句是不会加锁的,但是 select for update除了有查询的作用外,还会加锁呢,而且它是悲观锁哦。至于加了是行锁还是表锁,这就要看是不是用了索引/主键啦。id为主键,select for update 1270070这条记录时,再开一个事务对该记录更新,发现更新阻塞啦,其实是加锁了。因此,没用索引/主键的话,selectfor update加的就是表锁。我们再开一个事务对另外一条记录 1270071更新,发现更新成功,因此,如。没用索引/主键的话就是表锁,否则就是是行锁。

2024-01-04 15:39:23 701

原创 第三天:对ThreadLocal理解

ThreadLocal,也就是线程本地变量。如果你创建了一个 ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。threadLocal内存结构图。

2023-12-25 16:54:39 838

原创 第二天:线程与进程

为了让用户感觉多个线程是在同时执行的, CPU资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,线程在时间片内占用 CPU执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU让其他线程占用,这就是上下文切换。Java中的线程分为两类,分别为 daemon线程(守护线程)和 user线程(用户线程)。在 JVM启动时会调用 main函数,main函数所在的钱程就是一个用户线程。其实在 JVM内部同时还启动了很多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?

2023-12-19 15:28:15 799

原创 代码生成器配置

根据数据库表结构,自动生成entity,mapper,mapper.xml,service和controller架构。

2023-12-18 17:11:22 383

原创 第一天:并行与并发的区别

并发的实现依赖于 CPU 切换线程,因为切换的时间特别短,并行就是同一时刻,两个线程都在执行。这就要求有两个 CPU 去分。就好像我们去食堂打饭,并行就是我们在多个窗口排队,几个阿姨同时打。并发就是我们挤在一个窗口,阿姨给这个打一勺,又手忙脚乱地给那。并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都。从操作系统的角度来看,线程是 CPU 分配的最小单位。所以基本对于用户是无感知的。

2023-12-18 10:33:09 356

原创 java工具类库-----Hutool

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅。对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类。提供一下组件:hutool-aop JDK动态代理封装,提供非IOC下的切面支持hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤hutool-cache 缓存hutool-core 核心,包括Bean操作、日期、各种Util等hutool-c

2023-12-15 15:33:37 944

原创 Knife4j–解决下载文件乱码和上传文件不显示问题

方案一:在@ApiOperation注解中加上produces = “application/octet-stream”`在入参上添加注解@RequestPart。下面两种方案都能下载文件。点击下载文件就可以下载。可以看到,无法上传文件。

2023-12-14 16:33:51 1167

原创 CompletableFuture 详解

一、实例化创建// 返回一个新的CompletableFuture,由线程池ForkJoinPool.commonPool()中运行的任务异步完成,不会返回结果。// 返回一个新的CompletableFuture,运行任务时可以指定自定义线程池来实现异步,不会返回结果。// 返回由线程池ForkJoinPool.commonPool()中运行的任务异步完成的新CompletableFuture,可以返回异步线程执行之后的结果。二、两种方式实现异步。

2023-12-13 16:45:39 1317

原创 线程池讲解

handler:拒绝策略(当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理)创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。创建一个可缓存线程池,如果线程池长多超过处理需求,可灵活回收空闲线程,若无可回收,可创建新线程。该策略下,直接丢弃任务,什么都不做。

2023-12-07 19:39:12 383

原创 Lombok----详解

Lombok(Project Lombok)是一个用于 Java 编程语言的开源库,旨在减少 Java 代码中的冗余和样板代码,提高开发人员的生产力。它通过使用注解来自动生成 Java 类的常见方法和代码,从而使开发人员能够编写更简洁、更具可读性和更易维护的代码。Lombok 的主要目标是简化 Java 开发,减少样板代码,使代码更加精炼,从而提高开发效率。

2023-12-05 18:44:59 897

原创 使用 @Transactional 时常犯的N种错误

Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在注解修饰方法的前后织入事务管理的实现语句,所以开发者只需要通过一个注解就能代替一系列繁琐的事务开始、事务关闭等重复性的编码任务。编码方式确实简单了,但也因为隐藏了直观的实现逻辑,一些错误的编码方法可能会让@Transactional注解失效,达不到事务的作用。最直接的表现就是:方法执行过程中抛出了异常,但事务没有回滚,最终导致了脏数据的产生。

2023-12-05 14:31:45 1191

原创 Knife4j使用教程

是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。

2023-12-04 15:02:46 1665

原创 接口优化业务代码优化

接口优化对于后端人员来说尤其重要,下面就一起来总结以下

2023-12-01 15:01:27 366

原创 mysql,int(1)和int(10)的区别

首先int可以设置两个属性,UNSIGNED(无符号)和 ZEROFILL(填充零)int(1) 填充零:插入id为1的,显示1,因为他设置的长度为1,不需要0来填充。int(2) 填充零:插入id为1的,显示01,因为他设置的长度为2,0来填充。显然int(10) 填充零就是0000000001。int:4字节,设置无符号的话,存储值范围是:0。主要区别在于ZEROFILL这个属性,填充零。int(10) 无符号:值范围还是0。int(1) 无符号:值范围还是0。

2023-11-30 16:20:50 564

原创 函数式接口

函数式接口:只有一个抽象方法的接口有且仅有一个抽象方法的接口,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。Lambda就是Java中函数式编程的体现。

2023-11-30 16:02:59 349

原创 redis命令

1.查看版本:info [info cpu;2.查看帮助:help @string3.exists:查看key是否存在 (多个key返回or的结果)4.expire:设置过期时间5.ttl:查看剩余过期秒数6.type key:key类型7.dump key:序列化key8.rename key newkey:修改key名称9.persist key:移除key的过期时间10.redis-cli -a password_value --raw #raw:避免显示中文乱码。

2023-11-20 10:07:22 27

原创 springboot配置文件详解

SpringBoot 是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就需要添加配置文件。配置文件有两种不同的格式,一个是 application.properties 另一个是 application.yml 或 application.yaml1.定义list集合# 拦截器路径拦截或者不拦截配置path:#该路径下任何类型请求均拦截include:# 拦截器路径拦截或者不拦截配置path:#该路径下任何类型请求均拦截获取list集合@Data。

2023-11-06 17:31:40 42

原创 springboot run方法执行流程

在Spring Boot中,SPI机制允许开发者通过定义接口和实现类的方式,实现对应的功能扩展。spi的工作原理: 就是ClassPath路径下的META-INF/services文件夹中, 以接口的全限定名来命名文件名,文件里面写该接口的实现。然后再资源加载的方式,读取文件的内容(接口实现的全限定名), 然后再去加载类。由上面的代码可以看出,run方法在SpringApplication是一个静态方法,该方法会将启动类作为参数,构建SpringApplication实例。springboot中的spi。

2023-10-31 14:17:04 105

原创 springboot自动装配原理

所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

2023-10-26 18:16:03 24

原创 springboot使用aop实现接口调用统计

使用aop统计接口调用次数,次数存储在redis中,超限会拦截,接口不被调用。在需要拦截的接口上添加注释。

2023-10-25 17:43:28 265

原创 aggrid表格控件

要求可以加载百万数据浏览器不卡顿,打开多个百万表格浏览器内存不溢出。经过多次调研,选择aggrid表格控件。对于详单分析是最适合不过了,几乎满足你对表格所有的需求,各种组件来适配你的自定义开发,网上也有很多文档,帮助你开发。此文档基于vue开发。

2023-10-25 15:48:22 636

空空如也

空空如也

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

TA关注的人

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