自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Lambda表达式

函数式接口可以使用Lambda表达式来创建接口实例。函数式接口是指只包含一个抽象方法的接口。如Runnable。}:Lambda表达式的主体部分,类似方法体。->:箭头符号,用于分隔参数列表和Lambda表达式的主体。parameters:参数列表,类似于方法参数。提交一个Runnable实例到线程池。Lambda表达式的形式。

2024-04-13 16:46:44 295

原创 双写一致性问题

2.这时切换到线程2中进行了数据查询操作,线程2未从缓存中查到数据,就从数据库中查到旧数据,并把旧数据存入缓存中,这时线程1把新数据更新入数据库,出现了双写不一致问题。当我们要进行更新操作时,先删除缓存,再更新数据库,延迟几百ms再删除一次redis的缓存数据。3.这时让线程1延迟几百ms后再删一次redis中的缓存。下次查询依旧会从数据库中得到新数据。双写一致性问题:同一份数据,需要写数据库、写缓存。数据库中的数据和缓存中的数据要一致。1.当我们在线程1中进行更新数据操作时,先删除了redis中的缓存,

2024-04-12 13:53:33 251

原创 bean的生命周期

​ BeanPostProcessor后置处理,主要是对bean进行增强,有可能在这里产生代理对象。​ 这个初始化方法可以是处理InitializingBean接口,调用他的接口方法。​ 也可以是XML 配置文件init-method这个属性指定的方法。​ 或@PostContruct注解标注的方法。​ 处理Aware接口,设置相关依赖。:Spring的bean的生命周期。2.bean的依赖注入和属性赋值。​ 调用bean的初始化方法。​ 3.1初始化之前的工作。​ 3.2初始化bean。

2024-04-10 15:06:55 215

原创 数据库面试题

readView,解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。undo log,主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表。

2024-04-08 18:00:28 766

原创 Redis的三种部署方案

在Redis中提供的集群方案总共有三种:主从同步、哨兵模式、Redis分片集群。

2024-04-02 20:03:03 383

原创 Redission--分布式锁

4.Redission锁的红锁解决分布式锁的主从一致性问题,红锁:在多个redis实例上(n/2 + 1)创建锁,获取锁时要求在多个实例上都能获取锁成功。但这样性能太低了,如果业务中非要保证数据的强一致性,建议采用zookeeper实现分布式锁。,当业务逻辑执行时间超出了锁的过期时间,锁会自动续期,避免了因为业务逻辑执行时间过长而导致锁提前释放。Redission锁提供的看门狗,一个线程成功索取锁后,看门狗会给持有锁的线程续期。3.Redission锁支持等待锁,一个while循环不断等待,能提升性能。

2024-04-02 18:39:04 555

原创 redis的数据淘汰策略

当redis的内存不足时,此时在向redis中添加新的key,redis就会按照某种规则将内存中的数据淘汰。会统计每个key的访问频率,值越小淘汰优先级越高 一定时间内的使用次数。我们在项目设置的allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常访问的key留在redis中。是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个是LRU,另外一个是LFU。LRU的意思就是最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

2024-04-02 17:31:44 324

原创 Redission--布隆过滤器解决缓存穿透问题

添加 Redission 依赖:首先需要将 Redission 添加到你的 Java 项目中,你可以通过 Maven 来添加 Redission 的依赖。创建 Redission 客户端:在代码中创建 Redission 客户端,连接到 Redis 服务器。使用Redission的布隆过滤器步骤。布隆过滤器在缓存穿透问题中的使用。布隆过滤器的核心是一个位数组。

2024-04-02 15:41:18 375

原创 stlink烧录器怎么接

2024-03-30 22:04:04 86

原创 用USB转TTL下载器将固件烧写到STM32F103C8T6最小系统板中

2.下载ch340驱动。3.下载flymcu。

2024-03-30 18:51:04 127

原创 LED和蜂鸣器和面包板

长脚正极,短脚负极,正向通电亮,反向通电不亮。

2024-03-30 16:05:44 195

原创 新建stm32工程

project–>new uversion project–>选择存放所有stm32工程的目录(没有自建)–>新建本次工程的目录,选择本次工程的目录–>给工程文件起名,保存–>选择器件支持包。基于寄存器开发的工程,基于标准库函数方式开发,基于hek。编码格式调为UTF8,还有下面tab size改为4较好。

2024-03-30 15:25:41 181

原创 keil安装器件支持包

2.点击检查更新,下方有进度条,他会安装keil支持的所有器件支持包所以比较慢。

2024-03-30 11:19:23 214

原创 git基本使用

前提是你已经配置了 SSH,并且你的公钥已经添加到了你的 GitHub 或者 GitLab 账户中。通常情况下,如果你没有配置 SSH 或者你想直接从网页上复制仓库的 URL 进行克隆,可以选择这种方法。你可能需要输入用户名和密码来验证你的权限。git存在两种类型的仓库,本地仓库和远程仓库,常用的远程仓库有github,gitee,gitlab,公司中一般用gitlab需要自己搭建。无论你选择哪种方法,一旦克隆完成,你都会得到一个包含了远程仓库所有文件的本地副本,你可以在本地进行修改、提交和推送。

2024-03-29 17:06:09 697

原创 使用三级缓存解决bean创建过程中的循环依赖问题

实际上二级缓存就能解决问题,但是很多时候我们用到的不是真正的对象,而是代理类的对象,因为依赖注入先发送,创建代理对象后发生,此时用二级缓存Bean中注入的不是代理类对象,而是真正的对象,这样肯定不行,我们还指望用代理对象进行功能增强呢。因为bean的创建存在先后,创建beanA时依赖注入BeanB,但BeanB还没创建,我们就回去创建BeanB,但是BeanB又需要依赖注入BeanA,就会造成死循环。1.判断一级缓存中是否存在beanA,存在直接返回,不用再创建了。以类A为例,我们创建类A的bean。

2024-03-27 20:21:25 175

原创 静态代理,jdk动态代理,cglib动态代理

代理模式就是用代理对象代替真实对象去完成相应的操作,并且能够在操作执行的前后对操作进行增强处理。

2024-03-26 20:32:03 278

原创 一个切面类的定义

【代码】一个切面类的定义。

2024-03-26 18:05:34 94

原创 spring中的Singleton Bean(单例bean)是否为单例模式

单例模式的目的:确保一个类只有一个实例,并且提供一个全局的访问点(Ensure a class only has one instance, and provide a global point of access to it)singleton bean 只能保证每个容器内,相同 id 的 bean 单实例,所以他不是单例模式,spring中同一个类可以有多个id不同的bean实例。注入这个类的Bean,每次注入spring容器都会创建一个新的实例。定义一个类,Scope设置为prototype。

2024-03-26 16:32:49 616

原创 spirng的两个容器ApplicationContext和BeanFactory的区别

而ApplicationContext继承了BeanFactory,所以ApplicationContext拥有BeanFactory所有的特点,也是一个Bean工厂,但是ApplicationContext除开继承了BeanFactory之外,还继承了诸如EnvironmentCapable、 MessageSource、 ApplicationEventPublisher等接口,从而ApplicationContext还有获取系统环境变量、国际化、事件发布等功能,这是BeanFactory所不具备的。

2024-03-25 17:49:41 192

原创 JVM的类加载器和双亲委派机制

所以,双亲委派指得是,JVM在加载类时,会委派给Ext和Bootstrap进⾏加载,如果没加载到才由⾃⼰ 进⾏加载。

2024-03-25 16:09:26 283

原创 一个类的加载过程

​ 2.2准备–为静态变量分配空间,并赋予默认值。为static final 基本数据类型,设置固定值。​ 1.1用到这个类时,把这个类的字节码文件加载方法区,并创建类.class对象(堆内存中)2.3解析 – 将常量池的符号引用解析为直接引用。​ 1.2如果这个类有父类会先加载他的父类。​ 2.1验证–验证字节码文件的正确性。

2024-03-25 15:59:03 169

原创 典型内存溢出场景

使用了Executors.newCachedThreadPool();创建的线程池对象,最大线程数没有上限,任务数过多,导致创建了很多救急线程,导致内存溢出。创建的线程池对象使用的工作队列是一个无上限的队列,队列数没有上限,任务数过多,导致队列塞满,内存溢出。2.查询数据量太大导致的内存溢出。3.动态生成类导致的内存溢出。1.线程池导致内存溢出。使用Executors.

2024-03-25 15:20:37 166

原创 JVM垃圾回收机制

java垃圾回收的区域是虚拟机堆。

2024-03-23 20:45:24 1510

原创 JVM方法区(元空间)分区

class space 存储类的基本信息,最大值受 -XX:CompressedClassSpaceSize 控制non-class space 存储除类的基本信息以外的其它信息(如方法字节码、注解等)class space 和 non-class space 总大小受 -XX:MaxMetaspaceSize 控制

2024-03-23 19:19:23 177

原创 JVM堆(虚拟机堆)的分区

幸存区分为:from区和to区 from和to通常大小相等。新生代分为:伊甸园(eden)和幸存区(survivor)JVM堆分为:新生代(young)和老年代(old)

2024-03-23 19:13:01 315

原创 ThreadLocal

1.ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。使用场景:实现登陆功能,使用登陆凭证token获取用户的信息,获取到的基本信息存入ThreadLocal中以供线程后续功能使用。

2024-03-23 18:04:26 104

原创 synchronized和lock的区别

假设,线程5去获取一把锁时,线程1刚好释放锁,这时线程5就能直接插队,线程5获取不到锁,才会进入等待队列。synchronized 是java的一个关键字,源码在 jvm 中,用 c++ 语言实现,synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁。Lock 是接口,源码由 jdk 提供,用 java 语言实现,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。公平锁:多个线程去请求锁时,会按照请求锁的顺序去一一获取锁(线程会按顺序进入队列,队头线程获取锁)

2024-03-23 17:29:29 351

原创 线程池相关知识

(即使线程池中有空闲着的线程)1.当线程池中的线程数量核心线程数量,并且某一条空闲线程的空闲时间超过一定时间,就会把这条线程当做临时线程回收。3.当线程池中线程数量>=核心线程数量,并且缓存队列也被存满时,再添加的任务,会创建空闲线程(临时工)来处理新任务。2.当线程池中的线程数量=核心线程数量时(线程池无空闲),每添加一个任务就把这个任务放入缓存队列。

2024-03-23 15:17:08 389

原创 JAVA并发编程

该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权(还没获取),此时处于就绪状态(ready)。Waiting(等待):获取锁成功后,线程可能需要等待其他线程完成某个任务后才能继续执行。当其他线程完成某个任务时,可以锁.notify()随机唤醒一个等待队列中的线程,但不会释放锁,防止其他线程对本线程造成干扰。(该线程会进入阻塞状态)等待获取锁成功的线程释放锁时会唤醒阻塞状态的线程,让他们重新争抢锁,争抢成功进入可运行状态。当线程对象的调用start()方法时,该线程就进入了可运行状态。

2024-03-21 19:44:29 237

原创 fail-fast和fail-safe

fail-safe: CopyOnWriteArrayList 是 典型代表,遍历的同时可以修改,原理是读写分离,但会牺牲一致性(读的是旧数据,但其实数据已经更新了)出现了并发修改异常,原理是底层的一个modCount属性,记录当前这个ArrayList被修改过的次数,通过迭代器遍历的过程中,次数不一致就会报错。CopyOnWriteArrayList:原理是写入的数组和读的数组不是一个数组,读的是旧数组,写的是新数组。fail-fast:ArrayList 是典型代表,遍历的同时不能修改,尽快失败。

2024-03-21 16:30:37 107

原创 inner join,left join,right join,outer join的区别

OUTER JOIN:外连接返回满足连接条件的所有记录,无论是左表中的记录还是右表中的记录。如果没有匹配的记录,对应的结果列会显示为 NULL。让左表中没有匹配的行被查询,右边以null补全。RIGHT JOIN:左连接返回左表记录和右表记录匹配后组成的记录。以及右表中未与左表匹配的记录,左边用null显示。LEFT JOIN:左连接返回左表记录和右表记录匹配后组成的记录。以及左表中未与右表匹配的记录,右边用null显示。INNER JOIN:内连接是最常见的连接操作,它返回两个表中满足连接条件的交集。

2024-03-20 19:34:07 128

原创 nacos服务注册中心,配置中心

content-service:第一部分,它是在application.yaml中配置的应用名,即spring.application.name的值。Yaml: 第三部分,它是配置文件 的后缀,目前nacos支持properties、yaml等格式类型,本项目选择yaml格式类型。dev:第二部分,它是环境名,通过spring.profiles.active指定,搭建Nacos为配置中心,其目的就是通过Nacos去管理项目的所有配置。1、通过namespace、group找到具体的环境和具体的项目。

2024-03-20 16:57:58 305

原创 http常见状态码

404,表示服务器上无法找到请求的资源,即该接口不存在。

2024-03-18 16:57:04 106

转载 插件lombook

在 Java 中,我们使用 Logger 来记录日志。Logger 是一个非常有用的工具,因为它可以帮助我们在应用程序中记录信息并跟踪错误。但是,在 Java 中使用 Logger 是三行组成的样板代码。原文链接:https://blog.csdn.net/ly1347889755/article/details/130200882。帮你生成 setter、getter、toString、equals、hashCode 等代码;

2024-03-16 14:58:03 16

原创 maven工程,未被idea识别为maven工程怎么办?

示例:以下工程的pom文件图标不是一个蓝色的m,所以未被识别为maven工程。解决办法:打开pom.xml文件—>右键—>add as maven project问题解决:

2024-03-16 14:18:47 397

原创 maven父工程

属性中写的是各个依赖的版本,方便下面引用。

2024-03-14 18:01:34 550

原创 java泛型的本质

最后,字节码在java虚拟机中运行时,java 虚拟机只会知道这是一个Object类型,无法知道原始的泛型类型。在编译期编译器会对泛型进行类型检查,确保类型的安全性,在编译后,字节码文件中泛型会被擦除为Obiect类型,在 Java 中,泛型本质是Object类型。

2024-03-12 20:35:18 115

原创 mybatisplus使用基本步骤

3.实现Service接口,并继承mybatisplus提供的 ServiceImpl<mapper接口,实体类>类。2.创建Service接口继承mybatisplus提供的 IService<实体类>接口。4.mapper接口继承mybatisplus提供的 BaseMapper<实体类>1.设计实体类,给实体类加一些需要的注解。5.开始进行正常的代码开发。

2024-03-12 16:32:23 228

原创 mybatisplus的ServiceImpl提供的两个lambda方法,lambdaQuery()和lambdaUpdate()

的好处是可以直接.list获.one,当然他们的功能是差不多的。主要用于构造sql语句的where条件的。简单的直接用ServiceImpl的update方法就行了。简单的直接用ServiceImpl的get方法就行了。lambdaQuery()返回的是一个Wrapper对象。对于复杂条件的查询,使用。对于复杂条件的更新,使用。

2024-03-12 16:08:32 211

原创 自定义sql语句,但复杂的where部分由条件构造器wrapper来完成

【代码】自定义sql语句,但复杂的where部分由条件构造器wrapper来完成。

2024-03-11 17:47:01 160

空空如也

空空如也

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

TA关注的人

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