自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 问答 (14)
  • 收藏
  • 关注

原创 使用Quartz实现定时任务

Quartz是一个定时任务框架,相较于JDK和Spring的定时任务线程池,其功能更加多样,调度更加灵活,而且更适合分布式系统(因为引入了数据库)。核心组件Scheduler:调度器。控制任务调度Trigger: 触发器。决定什么时候来执行任务。JobDetail :定义任务细节Job:任务的执行逻辑代码示例首先引入依赖<dependency> <groupId>org.springframework.boot</groupId> &l

2022-02-02 17:04:37 1935

原创 Caffeine+Redis实现二级缓存以及JMeter性能测试

概念缓存能够减少IO操作,减轻数据库压力,提高性能。常见的缓存实现方案便是使用Redis,但是Redis缓存也会有网络开销。所以便有了本地缓存与Redis缓存共同存在的方案。常见的就是Caffeine+Redis对于一些热点数据,我们可以分别将数据缓存到本地缓存Caffeine和Redis中。获取数据时,首先在本地缓存中查询是否存在数据,如果存在则返回。不存在,则去Redis中获取,返回并将数据缓存到Caffeine中。如果Redis中仍不存在,则去数据库中获取,并将返回的数据缓存到Caffeine和R

2022-01-29 16:49:05 1908

原创 多线程-线程池的核心参数介绍

线程池可以通过重用已存在的线程,降低线程创建和销毁造成的消耗。并且方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成CPU过度切换(CPU切换线程是有时间成本的,需要保持当前执行线程的现场,并恢复要执行线程的现场)核心参数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long

2022-01-16 21:49:06 789

原创 Netty-心跳机制的实现-基于简易手写RPC框架

所谓心跳机制,其本质作用就是保证服务端与客户端的连接的可用性。当客户端出现宕机,或因网络故障无法连接工作时。服务端应该及时发现,并将该连接断开,避免服务端或重启后的客户端仍使用这个连接读写数据,造成异常。为了实现这个功能,我们可以在客户端,一段事件没有向服务端写数据时,向服务端发送一个心跳包。服务端接收到该心跳包,则表示当前客户端仍在线。当服务端在一段事件后没有获取到来自客户端的心跳包时,则可判定客户端掉线,将与该客户端的连接断开。Netty中为我们提供了IdleStateHandler类,我们可以用

2022-01-14 22:25:40 202

原创 Netty-使用业务处理线程池处理业务

Netty-使用业务处理线程池处理业务.md业务线程是区别与通信线程的另外一种线程的使用类别。通信线程通常就是用来处理网络I/O相关的各种事件,例如连接操作,消息读取和发送操作。Netty中的NioEventLoop通常就是被用来处理这么一系列的操作。业务线程通常侧重于处理业务相关的逻辑,在Netty中配置任务处理链的时候可以配置某一个处理器使用特定的处理器实现。ChannelPipeline addLast(EventExecutorGroup group, ChannelHandler... h

2022-01-14 22:22:05 2364

原创 负载均衡-哈希一致性算法的实现与使用场景

负载均衡-哈希一致性算法负载均衡负载均衡通常用于服务器集群当中,就是当有多个服务器可以提供服务,负载均衡能够将请求均衡的分配到不同的服务器进行处理。避免了单个服务器流量过高而导致崩溃,或单个服务器长期空闲导致浪费资源。哈希一致性算法在了解哈希一致性算法之前,我们可以先看一下普通的hash算法。hash算法的主要作用就是散列,将一系列在形式上具有相似性质的数据,打散成随机的、均匀分布的数据。在JDK中,许多类都有重写hashcode()方法。普通的hash算法也是可以用来实现负载均衡的。例如我们有一

2022-01-14 22:21:00 862

原创 Netty-实现心跳机制-以简易手写RPC框架为例

所谓心跳机制,其本质作用就是保证服务端与客户端的连接的可用性。当客户端出现宕机,或因网络故障无法连接工作时。服务端应该及时发现,并将该连接断开,避免服务端或重启后的客户端仍使用这个连接读写数据,造成异常。为了实现这个功能,我们可以在客户端,一段事件没有向服务端写数据时,向服务端发送一个心跳包。服务端接收到该心跳包,则表示当前客户端仍在线。当服务端在一段事件后没有获取到来自客户端的心跳包时,则可判定客户端掉线,将与该客户端的连接断开。Netty中为我们提供了IdleStateHandler类,我们可以用

2022-01-14 22:17:38 1329

原创 算法与数据结构-排序算法

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。1.冒泡排序思路:对数组里的所有数字从左到右循环进行两两比较,若左边的值大于右边的值,则交换。继续循环比较循环重复第一步,直到数组有序public class test01 { public static void main(String[] args) { int[] arr = new

2021-10-10 15:06:40 214

原创 Java-HashMap的初始化与扩容

以无参构造为例,解析HashMap从创建到扩容的源码// 默认初始化容量 16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;// 默认加载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;// 初始节点数组transient Node<K,V>[] table;// 阈值,达到就扩容int threshold;final float loadFactor;

2021-10-07 18:49:48 193

原创 Java-Java是值传递

值传递:值传递就是在函数调用的时候,把实参复制一份传给函数,这样如果在函数中对参数进行修改的话,不会影响到实际参数。引用传递:而引用传递就是在函数调用的时候,把实际参数在内存中的地址直接传给函数,这样如果函数中对参数进行修改的话,就会影响到实参的值。如下代码,在所谓的引用传递当中,我们将user对象的地址传递给了形参,而方法内将对象做了修改,形参与实参指向对象相同,所以输出结果相同。public class test { public static void main(String[] arg

2021-10-07 18:49:16 108

原创 Java-HashMap尾插法

值传递:值传递就是在函数调用的时候,把实参复制一份传给函数,这样如果在函数中对参数进行修改的话,不会影响到实际参数。引用传递:而引用传递就是在函数调用的时候,把实际参数在内存中的地址直接传给函数,这样如果函数中对参数进行修改的话,就会影响到实参的值。如下代码,在所谓的引用传递当中,我们将user对象的地址传递给了形参,而方法内将对象做了修改,形参与实参指向对象相同,所以输出结果相同。public class test { public static void main(String[] arg

2021-10-07 18:46:54 1299

原创 算法与数据结构-简单实现LinkedList

public class test { public static void main(String[] args) { LinkedList<Character> linkedList = new LinkedList<>(); }}class Node<E>{ E item; Node<E> next; Node<E> prev; Node(Node<E> pr

2021-08-26 22:17:58 52

原创 SQL-触发器

在MySQL中,创建触发器语法如下:CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_nameFOR EACH ROWtrigger_stmt其中:trigger_name:标识触发器名称,用户自行指定;trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;tbl_name:标识建立触发器的表名,即

2021-08-15 14:47:58 140

原创 MySQL学习

1. 列类型1.1 数值类型类型大小范围(有符号)范围(无符号)用途TINYINT1 字节(-128,127)(0,255)小整数值SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(

2021-08-15 14:25:34 180

原创 SQL-窗口函数

窗口函数可以进行排序,生成序列号等一般的聚合函数无法实现的高级操作。RANK()在计算排序时,若存在相同位次,会跳过之后的位次。例如,有3条排在第1位时,排序为:1,1,1,4······DENSE_RANK()这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。例如,有3条排在第1位时,排序为:1,1,1,2······ROW_NUMBER()这个函数赋予唯一的连续位次。例如,有3条排在第1位时,排序为:1,2,3,4······<窗口函数

2021-08-13 23:22:48 103

原创 SQL-不使用order by查找数据中第n个数

查找salary中第二大的数据,不使用order by,使用group by实现首先通过自连接,查询每一个数据对应的大于等于它的数据select * from salaries s1 join salaries s2 on s1.salary<=s2.salary 从上图的结果中我们可以看出右边的每一个salary都要大于等于左边的salary,这样我们就可以查找出没有一个数据对应有几个大于等于它的数据通过group by对左边数据进行分组se.

2021-08-13 17:23:02 353

原创 Java-集合

数组长度固定,集合长度不固定数组可以存储基本类型和引用类型,集合只能存储引用类型[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Gah7KE4-1627712339924)(C:\Users\14284\Desktop\Markdown文档\Java 基础\集合\1.png)]1. List特点:有序,有下标,元素可重复,1.1 ArrayList特点:查找快,增删慢,线程不安全注意:我们所说的有序是指存入数据和读取数据顺序一致,反之则为无需。并不是..

2021-07-31 14:20:22 109

原创 Java-成员变量初始化优先于构造函数的执行

public class test { public static void main(String[]args){ test t = new test(); test.c2 c = t.new c2(); } class c2 extends c1{ // public String s="BBBB"; //子类构造函数 public c2(){ call();

2021-07-29 00:01:05 509

原创 算法与数据结构-排序函数

对于各种基本数据类型的一维数组的排序,我们通常可以使用Java中自带的sort函数对其进行排序。public static void main(String[] args) { char[] a = {'a','v','d','o'}; Arrays.sort(a); System.out.println(Arrays.toString(a));}然而对于自定义数据类型的排序,我们通常要继承Comparable接口,或者Comparator接口,来实现排序。Comparable接口C

2021-07-23 22:45:13 244 2

原创 Java-String.length()与String.getBytes().length()

String.length()是表示字符串所需的UTF-16代码单元的数量。也就是说,它是用于表示字符串的char值的数量,因此等于toCharArray().length。String.getBytes().length是在平台的默认编码中表示字符串所需的字节数。public class test { public static void main(String[] args) throws UnsupportedEncodingException { String s = "

2021-07-19 11:32:06 869

原创 Java-ArrayList扩容

以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。// 用于默认大小的空实例的共享空数组实例。我们将其与 EMPTY_ELEMENTDATA 区分开来,以了解在添加第一个元素时要膨胀多少private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};transient Object[] elementDat

2021-07-19 11:31:26 82

原创 Java-向上转型与向下转型

一,向上转型创建父类public class Father{ public void sayHello(){ System.out.println("i am your father"); } public void doSomething(){ System.out.println("make money"); }}创建子类public class Son extends Father{ public void sayH

2021-07-19 11:30:47 75

原创 Java-内部类

内部类的分类:成员内部类(静态,非静态),局部内部类(方法内,代码块内,构造器内)1. 成员内部类作为外部类的成员调用外部类的结构可以被static修饰可以被4种不同的权限修饰作为一个类类内可以定义属性,方法,构造器等可以被final修饰,表示此类不能被继承可以被abstract修饰public class Person { String name; int age; public void sayHello(){ System.out

2021-07-19 11:30:13 272

原创 Java-构造方法

Java 构造方法有以下特点:方法名必须与类名相同可以有 0 个、1 个或多个参数没有任何返回值,包括 void默认返回类型就是对象类型本身只能与 new 运算符结合使用在一个类中定义多个具有不同参数的同名方法,这就是方法的重载。在实例化该类时可以调用不同的构造方法进行初始化。public class Pet{ private String name; int health; int love; public Pet(String name, int health

2021-07-19 11:29:44 103

原创 Java-构造代码块与静态代码块

构造代码块public class Dog extends Pet{ // 子类特有成员 String strain; public Dog(String name,int health,int love,String strain){ this.strain = strain; System.out.println("Dog类的构造方法"); } { System.out.println("Dog类的构造代码块"); }

2021-07-19 11:29:12 52

原创 Java-访问控制权限

默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。public:用来修饰类的话,表示该类对其他所有的类都可见。只有default和public可以修饰类默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量。private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地

2021-07-19 11:28:16 54

原创 Java-断言

IDEA中开启断言在edit configurations… > VM options > 输入 -ea断言可以有两种形式assert 布尔表达式assert 布尔表达式:消息使用第一种格式,当布尔类型表达式为false时,抛出AssertionError异常;如果是第二种格式,则输出错误消息。public class test { static int i = 5; public static void main(String[] args) {

2021-07-18 22:41:52 64

原创 Java-接口

用 interface 来定义。接口中的所有成员变量都默认是由public static final修饰的。所以变量需要显示赋值。接口中的所有方法都默认是由public abstract修饰的。接口没有构造方法。因为构造方法有方法体{}在JDK1.8中,接口中的方法可以有方法体,但需要关键字static或者default来修饰。静态方法和默认方法都有自己的方法体,用于提供一套默认的实现,这样子类对于该方法就不需要强制来实现,可以选择使用默认的实现,也可以重写自己的实现。static修饰的方法不能重写

2021-07-18 22:41:09 69

原创 抽象类与抽象方法

需求 : 用面向对象的思维设计人类、动物、鱼之间的继承关系在继承金字塔中,越位于塔顶的类越来越简单、抽象,导致该类的方法无法根据自身条件得以实现,此时需要子类根据自身条件实现该方法,可以把父类的方法 “置空”,这个被 置空 的方法称为抽象方法,用 abstract 修饰,语法[修饰符] abstract 返回值 方法名(形参列表);抽象方法一定位于抽象类中。抽象类语法[修饰符] abstract class 类名{ }继承抽象类的子类称为抽象类的实现类(implement clas

2021-07-18 22:39:20 193

原创 JVM-垃圾回收器

一,垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。二,垃圾回收器分类按线程数分,可以分为串行垃圾回收器和并行垃圾回收器串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回

2021-07-18 21:59:40 220

原创 JVM-垃圾回收相关概念

一,**System.gc()**的理解在默认情况下,通过System.gc ()或者Runtime . getRuntime ().gc ()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc ()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC)。JVM实现者可以通过system.gc ()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,

2021-07-18 21:53:49 73

原创 JVM-垃圾回收的相关算法

一,垃圾标记阶段的算法在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。1. 引用计数算法引用计数算法(Reference C

2021-07-18 21:50:51 85

原创 JVM-垃圾回收概述

一,什么是垃圾垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题哪些内存需要回收?什么时候回收?如何回收?垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中

2021-07-18 21:47:15 49

原创 JVM-StringTable

一,String的基本特性String:字符串,使用一对" "引起来表示。String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为byte[]jdk9将String的底层实现由char[]改成了byte[]因为char类型的数据在jvm中占用了两个字

2021-07-18 21:46:16 188 1

原创 JVM-执行引擎

一,执行引擎概述执行引擎是Java虚拟机的核心组成部分之一虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JV.

2021-07-18 21:42:56 151

原创 JVM-直接内存

不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域直接内存是Java堆外的、直接向系统申请的内存区间public class BufferTest { private static final int BUFFER = 1024 * 1024 * 1024;//1GB public static void main(String[] args){ //直接分配本地内存空间 ByteBuffer byteBuffer = By.

2021-07-18 21:38:42 41

原创 Vue Element-ui 图片跟随表单一起上传

实现例如用户注册信息填写,商品发布等等需求时,通常会有需要上传图片的需求。这个时候我们可以使用Element-UI的el-upload组件进行图片上传。<el-upload action="https://jsonplaceholder.typicode.com/posts/" list-type="picture-card" :on-preview="handlePictureCardPreview" :on-remove="handleRemove"> <i cl

2021-07-17 21:22:49 4306 5

原创 JVM-对象的实例化内存布局与访问定位

一,对象的实例化1. 从字节码角度看待对象的创建过程new:判断对象对应的类是否加载,如果否,就加载。并在堆中开辟对象空间。dup:复制引用。invokespecial:调用Object当中的init方法。astore_1:将操作数栈中的变量取出放到对应的局部变量表中。2. 从执行步骤角度看待对象的创建过程具体过程见上述图片判断对象对应的类是否加载、链接、初始化:虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号

2021-06-20 13:05:16 133

原创 JVM-方法区

一,栈,堆,方法区的交互关系二,方法区的理解1. 方法区在哪里《Java虚拟机规范》中明确说明:‘尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。但对于HotSpot JVM而言,方法区还有一个别名叫做Non-heap(非堆),目的就是要和堆分开。所以,方法区可以看作是一块独立于Java堆的内存空间。2. 方法区的基本理解方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动时就会被创建,并且它.

2021-06-20 13:01:58 208

原创 JVM-堆

一,堆的核心概述1. 概述一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的么?不是,T

2021-06-17 12:39:05 242 1

空空如也

POI操作excel,克隆sheet后,导出文件。第一次打开后不做任何修改,关闭时显示是否保存修改?

2022-05-22

Redis 当中如何存储对象的同时,实现排行榜

2022-02-14

在NIO中,一个selector会被分配多少channel,或者说分配多少个较为合适呢?

2022-01-20

Netty中,当客户端向服务端发送数据,channel连接断了怎么?

2022-01-11

在Netty中,客户端处理器中的方法 channelInactive() 被调用后获取到一个新的连接channel,这个channel是怎么用到后续的读写操作中去的?

2022-01-11

RPC框架中,netty的心跳机制作用是什么?

2022-01-05

netty中服务端向客户写数据用到的 channel 和 客户端向服务端写数据的 channel 是同一个channel吗

2021-12-31

类似于这种题,该如何写输入数据

2021-11-18

为什么我在redis中保存数据后,没有设置过期时间,但是在一段时间后却自己消失了?

2021-11-15

springboot 中添加aop依赖后,项目所有controller都失效了,请求全部访问路径都是返回404

2021-11-14

在Oracle中,为什么我每次用sql语句查询序列的NEXTVAL值,会使该值自动+1

2021-10-01

有无知道Oracle中如何做到多条数据同时插入一张表中,为什么我用insert all插入,运行不报错,但是显示0行被插入?3q

2021-08-18

Spinrgboot项目为什么图片都不会自动更新到target文件中?

2021-04-23

在mybatisplus中添加乐观锁后,自动填充更新时间失效

2021-02-18

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

TA关注的人

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