自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 资源 (1)
  • 收藏
  • 关注

原创 设计模式—观察者模式

1、观察者模式类似于发布-订阅,需要被观察者发出信息让观察者去处理,但是又与发布-订阅模式不同,观察者与被观察者是直接联系,互相有感知,中间没有第三方角色存在,而发布-订阅模式中,发布者与订阅者之间有第三方角色存在,比如kafka中,生产者发送消息到 topic,消费者从topic获取消息,而不是生产者直接发消息给消费者,更多地是体现发布者与订阅者之间的相互无感知,解耦,以及异步机制。Subject(主题):也称为被观察者或可观察对象,它是具有状态的对象,当其状态发生变化时,会通知所有的观察者。

2023-12-13 00:38:20 419

原创 浅谈jvm full gc

jvm的内存模型分为:堆、本地方法栈、虚拟机栈,方法区、程序计数器。其中,gc(垃圾回收)主要集中在堆,堆又划分为2个区域:新生代、老年代。当空间不足时,会触发,回收新生代的垃圾。当空间不足时,会触发,回收老年代的垃圾,同时,full gc 会触发 minor gc。

2023-06-06 21:15:09 190

原创 redis数据类型

字符串类型是最常用的,底层结构是一个动态字符串,包含3个核心组件: 第一个,字符数组用于存储字符串,最大不能超过512M; 第二个,已使用长度,表示字符串真实占用了字符数组的长度; 第三个,剩余长度,表示字符数组未被使用的长度。字符数组的长度是动态变化的,当需要扩容时,如果字符串长度小于1M,则会加倍扩大字符数组长度,直到能存下,如果字符串长度超过1M,则会以1M的大小进行扩容,直到能存下。而缩容是不会主动触发的,只有当key被删除了,字符数组的空间才会被收回,或者

2022-07-06 20:55:59 566 1

原创 EasyExcel 工作原理

1. EasyExcel 类EasyExcel 类什么都没有,只是简单继承了 EasyExcelFactory,因此,EasyExcelFactory 才是核心。public class EasyExcel extends EasyExcelFactory { public EasyExcel() { }}2. EasyExcelFactory 类源码2.1 EasyExcelFactory 中读 excel 的源码部分从如下源码可以看出,EasyExcelFactory 使用

2021-09-10 19:23:51 8312

原创 springboot Caffeine 详解(一篇就明白)

1、添加依赖首先考虑添加 maven 依赖。 <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.6.2</version> </d

2021-07-23 12:51:44 13986 1

原创 Caffeine本地缓存详解(一篇就明白)

结论:Caffeine 是目前性能最好的本地缓存,因此,在考虑使用本地缓存时,直接选择 Caffeine 即可。先看一个小例子,明白如何创建一个 Caffeine 缓存实例。 Caffeine caffeine = Caffeine.newBuilder() .initialCapacity(3) .maximumSize(4); Cache cache = caffeine.build(); cache.

2021-07-21 20:46:04 20448 8

原创 StringUtils工具类的常用方法

boolean isEmpty(CharSequence cs) :判断字符串是否为 null 或者长度为 0,如果是,则返回 true。boolean isNotEmpty(CharSequence cs) :与 isEmpty 相反,实际上就是 ! isEmpty()。boolean isAnyEmpty(CharSequence… css) :字符串列表中如果存在某个字符串满足 true = isEmpty(),就返回 true,通俗讲,如果字符串列表中有一个字符串是 null 或者为空,则返回

2021-07-19 17:38:25 675

原创 Java Stream 集合的快速处理

stream 可理解为一种数据结构,用于方便地对集合进行处理,比如:将集合按照某个字段进行分组,将集合按照某个字段进行排序,将集合中的某个字段值单独拿出来作为一个新的集合,等等。一般步骤为:先将集合转为 Stream 结构,再调用 Stream 对象自身的方法对 Stream 进行处理。至于能对集合做哪些处理呢? 下面看看 Stream 接口的常用方法。1. collect 方法收集集合中的某些数据生成新的数据结构。<R, A> R collect(Collector<? super

2021-07-09 10:20:12 643 1

原创 ThreadLocal 类的解读与用法(一篇就明白)

ThreadLocal 是与线程关联的局部变量,凡是利用 ThreadLocal 存储和获取的数据都只与当前线程有关,与其它线程无关。看看原理图:

2021-06-11 17:41:10 292

原创 zookeeper集群(1leader,2follower,1observer)搭建

1、去官网下周zookeeper压缩包:https://zookeeper.apache.org/releases.html

2021-06-03 21:16:17 371

原创 zookeeper简单介绍

1. 数据节点数据节点其实就可以直接理解为目录,跟windows里面的文件夹很像,文件夹下面创建子文件夹,文件夹本身可以包含很多数据与内容。

2021-06-02 21:26:18 60

原创 tkmybatis详细教程(一篇就明白)

tkmybatis 是对底层 sql 进行了抽象封装,不需要考虑 sql 怎么写,只需要按照逻辑思维,遵循 tkmybatis 的语法即可实现数据库操作。本文适合对springboot项目结构有一定了解的读者。本文的项目基础是一个demo项目(多模块的)。1. 配置1、添加 tkmybatis 的依赖 <dependency> <groupId>tk.mybatis</groupId>

2021-05-28 21:48:37 48417 9

原创 springboot项目中的参数检验(javax.validation方式,Preconditions方式)

1、springboot添加tkmybatis的依赖kebootdubbo kafka redis mysql mybatis tkmybatis

2021-05-28 12:23:34 894

原创 FileChannel 和 ByteBuffer 的使用

目录1、存入文件2、读取文件3. 直接将数据从一个文件通道写入另一个文件通道4. 直接内存1、存入文件下面给个例子,简单地把内容写入到指定文件中。public class FileChannelTest { public static void main(String[] args){ try { // 先把字符串内容写入source.txt文件中 String message = "hello, h.

2020-10-30 17:56:25 1539

原创 java nio基本解读

1、Channel 接口Channel 接口是定义通道基本规范的,就2个方法,如下。 Channel 通道就相当于鼻子一样,nio 下面的输入输出都需要靠通道来进行,读取数据(吸气),需要通过嘴巴,写出数据(呼气),也是需要通过嘴巴。public interface Channel extends Closeable { // 查看通道是否开启 public boolean isOpen(); // 关闭通道 public void close() throws I

2020-10-28 17:12:52 261

原创 U盘方式搭建centos 8操作系统,搭建jdk环境

1、准备下载好 UltraISO.exe 可执行文件,绿色免安装的,可以去网盘里搜一搜。到官网下载 centos 8 的镜像文件 .iso 。2、将镜像文件刻录进U盘中先将U盘中的数据备份,因为要清空U盘。双击 UltralSO.exe 运行起来,最好把镜像的名字改一下,改得短一些,如下图,找到我们的 centos 镜像文件。然后点击“启动”-》写入硬盘映像,注意:硬盘驱动器是你的U盘,映像文件是你的镜像文件,先点击“格式化”,将U盘格式化,再点击“写入”,将镜像文件写入U盘中。

2020-10-25 22:20:54 340

原创 Mybatis——初始化过程,基本原理,配置文件详解

一、mybatis 基本原理在项目里需要配置 Mybatis.xml 配置文件,里面包含了各种相关的配置信息(比如,数据库url,连接用户名、密码、连接池等等),1、读取配置文件InputStream input= Resources.getResourceAsStream("mybatis.xml"); 将文件以输入字节流的形式打开,可以通过 input 去以字节流的形式获取文件里的信息。2、获取sqlsession工厂SqlSessionFactoryBuilder 类的作用就是..

2020-09-04 23:25:24 488

原创 http 协议详解

1、http 协议http 协议是一个超文本传输协议,位于应用层,所能包含的数据类型非常丰富(文字,图片,音频等等),最常见的就是应用在web 浏览器中的,它的特性是请求 / 响应,客户端主动发起请求,服务端收到请求并处理,处理后返回客户端一个回应。1.1、http 报文格式http 请求报文的格式如下,分三个部分:请求行,请求头部,请求数据。图片来自:https://www.cnblogs.com/myseries/p/11239662.html举个例子,http 请求报文如下:.

2020-08-18 18:30:00 1216

原创 redis 持久化方式 RDB AOF

目录1、RDB 文件2、AOF 文件3、几个疑问redis 是一个内存数据库,一旦断电或者宕机,内存中的数据将不可恢复,这也是 redis 的特点,但是可以通过持久化手段去将内存中的数据存储到磁盘中,这样便可以通过磁盘中的内容恢复 redis 的数据。主要手段为 RDB 文件 和 AOF 文件形式。1、RDB 文件RDB 文件是 redis 实例里所有数据的一个快照文件,包含了截止某个时刻的所有数据的数据集文件,可以通过 RDB 文件恢复数据,基本上是周期性地进行 RDB 文件持久化

2020-08-12 21:34:09 167

原创 redis 主从复制

1、主从复制至少由2个redis实例构成,一个主节点,其余的都是从节点,一般情况下都是进行读写分离,主节点负责处理写请求,从节点负责处理读请求,主节点上的数据会不停地发生改变,同时也不停地将这种改变复制给其它的从节点,让从节点上的数据与主节点上的数据保持一致性。 另外,从节点还可以有从节点。主从复制的优点:将读请求分流到从节点,减轻主节点压力,让主节点专注于写请求,提升了写性能;从节点可以有多个,大大提升了读性能;另外,还可以起到数据备份的功能,如果主节点挂了,从节点上还保存着数据。主从复制

2020-08-11 23:19:16 117

原创 强引用、软引用、弱引用、虚引用、引用队列

引用强度从高到低的顺序:强引用、软引用、弱引用、虚引用。1、强引用强引用就是我们平常最多使用的引用方式,比如 Student a = new Student(); Student b = a; 这两种形式都是强引用。如果一个对象上有强引用,则垃圾回收器不会回收它,即便内存不足并抛出空间不足异常,也不会回收它。要让垃圾回收器回收它的话,就令强引用 = null,比如 a = null,等同于让一个对象(假设对象只有一个强引用)没有了任何引用。2、软引用 和 引用队列SoftRef...

2020-07-11 18:31:11 726

原创 Future,FutureTask,线程池ThreadPoolExecutor

1、Future接口Future 是配合用Callable实现的线程的,Callable实现的线程可以有返回值,必须等到线程执行完了才会返回值,难道我们要一直等它执行完,岂不是阻塞浪费。因此才用Future来异步获取线程的返回值,不用等待。public interface Future<V> { /** * Attempts to cancel execution of this task. This attempt will * fail if the

2020-07-01 00:20:24 808

原创 java 反射机制

1、什么是反射?反射是将 java 类信息、方法信息 或者 字段信息包装为一个特定的实例化对象,通过这些对象内部方法的调用,可以达到使用java类功能的效果。下面用一个Parent类来说明反射如何使用。public class Parent { public static String city = "成都"; private int age = 23; protected int heveay = 56; public String name = "小明";

2020-06-29 17:33:07 129

原创 MySQL数据库——事务

1、事务的4个特性ACID原子性(Automicity):一个事务包含多个操作,这些操作要么全被成功执行,要么全都不被执行。一致性(Consistency):一致性是针对数据的,不管事务执行成功与否,都不会破坏数据的完整性和一致性。隔离性(Isolation):多个事务之间相互不影响。持久性(Durability):事务一旦执行成功,那么事务的执行结果会存储于磁盘中,即便是计算机宕机或者重启,事务的结果仍然存在。2、事务的分类2.1、扁平事务是我们最常用的一种事务,一般就是: B

2020-06-24 15:25:00 256

原创 MySQL数据库——InnoDB引擎(四种线程,缓存池)

1、4种后台线程MySQL数据库实例是一个进程,包含了多个线程,这篇文章将介绍一下InnoDB引擎的4种线程。1.1、Master Thread主线程。是数据库功能的核心提供者,如果主线程崩溃了,那数据库就没法正常使用了,除非重启主线程。1.2、IO Thread这是负责数据库读取和写入的线程,默认读取线程有4个,写入线程有4个,当然可以通过设置下图的两个参数来增加或者减少线程数。1.3、Purge Thread在提交了一个事务给数据库时,为了保证事务能够回滚,会在内存中

2020-06-24 10:09:06 1259

原创 MySQL数据库——聚集索引,非聚集索引,自适应哈希索引,全文索引,索引优化

1、自适应哈希索引InnoDB 引擎下的主键索引是 b+树 索引,b + 树的特点是非叶子节点只存储主键索引值,叶子节点既存储了索引值,还存储了对应的行记录,所以数据都在叶子节点,而 InnoDB 是用页为单位去存储 b + 树的节点,一页存一个节点,故一个节点可以存很多条索引信息,树的高度一般最多也就在 3 ~ 4 层,精准查询的话,会有 3 ~ 4 次查询。数据库里存储的数据非常多,被访问频繁非常高的数据被称为热点数据,针对热点数据,InnoDB 做了一个性能的提升,就是采用了自适应哈希索引,为

2020-06-18 22:06:13 480

原创 java 字节输入流/输出流

先序下面这张图是来自这篇博客https://blog.csdn.net/u010145219/article/details/89792877,我觉得梳理得很棒,所以借用一下。1、Bits 工具类Bits 是一个工具类,一般是供 java io 包下的类使用的,用于处理字节,因为输入输出流分为 字节流 和 字符流。接下来看看有哪些方法:1、static boolean getBoolean(byte[] b, int off):判断字节数组 b 的第 off 位置是否不为0,true表示

2020-06-16 15:00:26 964

原创 MySQL数据库——配置文件、日志文件、套接字文件、pid文件、表结构文件、存储引擎文件

1、配置文件配置文件里是MySQL数据库的全局参数,指定了MySQL启动时的各种配置,比如缓存池的大小,缓存池实例数量,日志文件大小(位置),等等。配置文件就是之前博客里讲的(linux下)my.cnf 或者(windows下)my.ini。配置文件里的参数按照在运行期间是否可以被修改分为 静态参数 和 动态参数。静态参数是在数据库运行期间无法修改的,如果要修改静态参数,只能在配置文件里修改,然后重启数据库。动态参数是在数据库运行期间可以修改的。按照参数的作用范围可以分为 会话参数 和 全局参数

2020-06-08 10:22:55 676

原创 MySQL数据库——介绍

1、数据库 和 数据库实例的区别数据库是一系列文件的集合,是静止的。而数据库实例是运行起来的进程,是动态的,通过运行起来的数据库实例去操作数据库。MySQL数据库实例是单进程的(包含多线程),一般一个实例对应一个数据库,但是对于集群或者分布式,可能多个实例对应于一个数据库。2、启动数据库安装好MySQL后,启动数据库:./mysql && 作为命令参数,表示将MySQL作为后台进程,即便我们关闭了命令行窗口,数据库依然是运行的。查看MySQL进程信息:ps -ef | g

2020-06-03 14:38:37 171

原创 TimeUnit类源码详解(concurrent包下的时间工具类)

目录1、TimeUnit介绍与基本使用2、其它的操作方法2.1、timedWait方法2.2、timedJoin方法2.3、sleep方法2.4、int excessNanos(long d, long m) 方法1、TimeUnit介绍与基本使用TimeUnit类的作用:用于时间的换算,比如纳秒,微秒,毫秒,秒,分钟,小时,天等等的换算。下面看看TimeUnit的源码,提供了每个时间单位的换算方法。public enum TimeUnit { // .

2020-06-01 00:32:18 608

原创 java 数据结构大全(Map、List、Set、BlockingQueue、BlockingDueue)

1、集合框架下面这个图基本包括了java中核心的集合结构,个人觉得还可以。1.1、Iterable 接口这个接口是集合系列的根接口,都要实现它,因为 Iterable 接口里面有个iterator()方法,用于遍历集合里的每一个元素,所以记着:凡是集合类,都可以通过iterator来遍历。1.2、 Collection接口public interface Collection<E> extends Iterable<E> { // 返回集合的元素个数

2020-05-24 16:28:36 430

原创 并发限流——Semaphore类

目录1 初识Semaphore1.1 动态增加许可证数量1.2 公平和非公平方式获取许可证2 常用方法2.1acquireUninterruptibly() 和acquireUninterruptibly(int permits) 方法2.2drainPermits() 和 availablePermits() 方法2.3getQueueLength() 和hasQueuedThreads() 方法2.4 尝试获取许可证1 初识SemaphoreSem...

2020-05-17 22:51:55 335 1

原创 jackson序列化和反序列化、国际化、thymeleaf模板、错误页面

1. @ResponseBody 和 @RequestBody虽然总提序列化,但是我们很少深刻体会到,那是因为在web项目中,方便的注解替我们解决了。@RestController 的效果 = @Controller + @ResponseBody@ResponseBody注解在Controller层的某个方法,表示返回给前端的对象要进行序列化。@RequestBody注解在Con...

2020-04-22 11:39:49 694 1

原创 java 泛型

1. 泛型类、泛型方法类名<T>、类名<T, S> 泛型类的声明形式就是这样的,<>里面就是泛型类型变量,可以是一个,也可以是多个,用于代表任意一种类型。建议:泛型类型变量用大写形式,且比较短,不一定非是一个大写字母,但是建议最好这样遵循,在java库中,使用E表示集合的元素类型,K和V分别表示映射的键与值类型,T表示任意类型。 举个例子:pu...

2020-04-22 11:20:57 157 1

原创 springboot+mybatis 详解

1. mybatis中的一些概念jdbc :是java版本的操作数据库的接口,就是规范大家操作数据库所使用的接口。数据库驱动程序:是实现那些接口的程序,真正操作数据库的代码。数据库:数据库不止一种,对于不同的数据库,厂商提供的数据库驱动程序都会有所不同。数据库连接池:类似于线程池,先把数据库连接创建出来放在池子里,等应用程序要借助连接操作数据库时,即可选取一条可用连接即可,连接池处...

2020-04-06 23:40:01 3415

原创 单例模式、工厂模式、代理模式、命令模式、策略模式、适配器模式

懒汉模式、饿汉模式。1、懒汉模式(多线程不安全)public class Singleton{ private static Singleton singleton=null; private Singleton(){} public static Singleton getInstace(){ if(singleton==null){ ...

2020-03-17 00:44:09 254 1

原创 @ConfigurationProperties注入yml配置参数,@Validated校验,输出彩色日志

1. 将yml配置文件中的属性转换为bean,注解@ConfigurationProperties首先我们在yml中定义好内容:student: name: 张三 parents: - 父亲 - 母亲 grades: 语文: 92 数学: 98 英文: 94然后定义一个类Student:@Component@Configur...

2020-03-14 11:07:33 1272

原创 springboot devtools热部署、banner.txt启动时的图像、配置文件中的随机值

devtools在开发阶段非常有用,当我们修改了代码之后,往往需要重新启动项目,如果项目很大的话,启动时间长,非常麻烦,于是有了热启动,即不用重新启动项目,只需要重新加载更改的文件即可,大大节省了时间。首先添加maven依赖:<dependency> <groupId>org.springframework.boot</groupId> &lt...

2020-03-12 20:30:20 299 1

原创 springboot的4种监听器方式

1. 这里的事件是什么意思:实际上就是一个指定类型的对象实例。2. 事件监听器能做什么:只要发布了事件,就会触发监听器的执行。定义事件:public class MyEvent extends ApplicationEvent { // 第一个参数是不可缺少的,后面的参数可以是任意多个(或零个,自定义) public MyEvent(Object source, St...

2020-03-12 19:48:51 1610

原创 JVM——运行时常量池

“运行时常量池” 不等于 “常量池”。运行时常量池 不是 class字节码中的常量池,运行时常量池是jvm在运行时,属于jvm内存区域中的一块内存,将class字节码文件中的常量池进行解析,然后再运行时常量池中进行相应的初步内存分配。jvm如何执行一个代码?加载字节码。java代码是由一个个类组成的,经过编译后,就形成了一个个class字节码文件,文件自然是存放在磁盘中的,要执行代码...

2020-03-05 10:27:04 208

Arduino 基础套件入门教程

一步一步了解和开发arduino,从基础入手,利用几个功能模块练手

2017-03-18

空空如也

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

TA关注的人

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