自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM-GC-基础知识

JVM中的GC使用Root Searching寻找垃圾单独方式,并结合mark-sweep、copying、mark-compact三种清除算法形成了各有特点的垃圾回收器,且垃圾回收器的演变过程是因为内存空间的不断增大的必然原因。

2024-06-16 12:05:28 177

原创 JVM-GC-什么是垃圾

所谓垃圾其实是指,内存中没用的数据;没有任何引用指向这块内存,或者没有任何指针指向这块内存。没有的数据应该被清除,垃圾的处理其实是内存管理问题。JVM虽然不直接遵循冯诺依曼计算机体系架构,但极其相似,像是一台小型计算机。一台计算机运行程序的流程大概是这样的:操作系统先将程序加载(load)至内存中,并产生一个进程;CPU在内存中读取指令集并执行;在CPU执行期间需要用到内存中的数据,因此在CPU执行期间内存是必须的;

2024-06-16 12:04:57 294

原创 JVM-类加载

继承ClassLoader重写findClass方法在findClass方法中调用super.defineClass方法可以通过调用父类构造方法super(parent)指定父加载器可通过重写loadClass方法打破双亲委派,tomcat的热部署就是这个逻辑。

2024-06-16 12:03:41 729

原创 JVM-基础知识

全称ThreadLocal Allocation Buffer,在edne区大约占用1%的内存归线程独有空间,多线程下不必争抢堆内存空间,提高效率。

2024-06-16 01:20:25 305 1

原创 设计模式-迭代器模式Iterator(行为型)

迭代器模式属于行为型模式,用来遍历容器的一种模式。

2024-06-15 22:17:27 262

原创 设计模式-组合模式Composite(结构型)

组合模式是一种结构型模式,它可以将对象组合成树状结构,用来区分部分和整体的层次机构,又叫。

2024-06-15 17:51:17 179

原创 设计模式-代理模式Proxy(结构型)

可以发现代理类只能代理实现Pay接口的类,不够灵活。开发过程中,经常会有日志、事务等的操作是不区分业务逻辑的,可以使用动态代理。代理模式和装饰模式非常相似,只是在语义上不一样。

2024-06-11 21:52:53 456

原创 设计模式-享元模式Flyweight(结构型)

享元模式是一种结构型模式,它主要用于减少创建对象的数量,减少内存占用。通过重用现有对象的方式,如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。最多产生五个连接对象。

2024-06-11 21:50:02 402

原创 Java中的动态代理

动态代理的时候,定义一个接口,需要代理人和被代理类实现这个接口,这样不够灵活,代理类能够代理的类只有实现这个接口的类。非常不灵活,假如被代理人的类没有实现这个接口,那么就需重新写一个代理类。对于日志、事务这些操作是不区分业务的,即不需要规定都实现某接口。因此,出现了动态代理java种的动态代理生成的方式大概有三种JDK动态代理、instrument动态代理、cglib动态代理。其中,前两种是JDK自带的,cglib是需要第三方依赖使用的。JDK动态代理和cglib动态代理的底层都是;

2024-06-11 20:23:06 684

原创 设计模式-装饰器模式Decorator(结构型)

装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。

2024-06-10 16:57:28 633

原创 设计模式- 责任链模式Chain of Responsibility(行为型)

责任链模式的使用有拦截器、过滤器等使用场景,如果在业务种使用不确定数量类处理,可以考虑责任链模式。

2024-06-10 16:47:36 401

原创 设计模式-中介者(调停者)模式Mediato(行为型)

在学习中介者模式的时候一直疑惑,为什么要有中介者接口?学习完后感悟:设计模式是一种思想,不应该去套公式。中介者模式的核心思想就是通过对象引用的方式实现多个同事类通过一个中介者建立联系,可以中介者中引用同事类,也可以同时类引用中介者,甚至可以用一个不用中介者接口,直接定义具体中介者实现。具体怎么实现要根据具体情况而论。设计模式是一种思想,而不是一种公式模板。

2024-06-08 18:16:58 529

原创 设计模式-外观(门面)模式Facade(结构型)

外观模式又称门面模式(结构型模式),它是一个可以屏蔽系统复杂性的设计模式。俗话说没有什么问题是加一层“介质”解决不了的,如果有那就在加一层。在开发过程中肯定封装过Utils类,我认为这就是一种门面模式;与之类似的还有一种模式叫模式(又叫调停者模式),它是用于解决”内部问题"的,即系统内多个类直接问题的;

2024-06-08 18:15:09 401

原创 Liunx环境下redis主从集群搭建(保姆级教学)02

在redis的同级目录(/opt/redis)下创建三个文件夹存放redis实例,文件夹名为7000、7001、7002。本次演示使用三个节点实例一个主节点,两个从节点:7000端口(主),7001端口(从),7002端口(从);有两种方式一种是修改配置文件(永久生效),另一种是使用命令(重启redis后失效)修改三个文件夹下的redis.conf文件内容中的端口。复制redis的配置文件到三个文件夹下。主节点负责写数据,从节点负责读数据;进入主节点7000节点,查看集群状态。启动三个redis实例。

2024-06-08 02:18:42 334 1

原创 Liunx环境下redis主从集群搭建(保姆级教学)01

因为我们没有设置redis可以后台启动,要想一直启动着服务端,那么必须开着这个窗口。在任何目录下都可以执行redis-cli --version检查redis是否安装成功,如果出现版本号,证明安装成功。第三个办法:在redis.conf配置文件中修改配置,指定它可以后台启动,这个办法往下看下一篇;解压完毕后可以看到,在/opt/redis文件夹下可以看到我们解压后的文件夹。进入创建的/opt/redis文件夹下,可以看到我们上传的安装包。进入到/opt/redis/src目录下,执行安装命令。

2024-06-08 02:13:55 320 1

原创 设计模式-策略模式Strategy(行为型)

使用策略模式定义行为的抽象,行为的具体方式由实现类实现;如果再添加其他行为的时候只需要增加策略接口的实现类,而不需要修改现有的代码,提高了代码的拓展性能,同时保证的对拓展开放对修改关闭的开闭原则;

2024-06-05 23:34:42 560

原创 设计模式-抽象工厂Abstract Factory(创建型)

抽象工厂是生产一族的产品,族的概念可根据不同的业务规则区分。扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。对于新增族来说,满足开闭原则,而对于新增产品来说,不满足开闭原则。

2024-06-05 23:33:25 419

原创 设计模式-工厂模式Factory(创建型)

简单工厂不符合开闭原则。工厂方法,每次增加一个产品时,都需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加了系统的复杂度和具体类的依赖;

2024-06-05 23:31:02 402

原创 设计模式-单例模式Singleton (创建型)

单例模式是一种创建型设计模式,它提供了一种创建对象的最佳方式;

2024-06-05 00:00:43 593

原创 MySQL查询成本

在使用二级索引的时候,如果需要回表,回表的成本是及其高的,所以MySQL一般会使用通过二级索引检索出来数据量少的索引,因为需要回表的数据量少,成本低。

2024-06-01 21:41:48 989

原创 MySQL优化器的SQL重写规则

优化器在分析一个查询语句时,先首先执行常量表查询,然后把查询中涉及到该表的条件全部替换成常数,最后再分析其余表的查询成本。对于列子查询和表子查询来说,它们的结果集中包含很多条记录,这些记录相当于是一个集合,所以就不能单纯的和另外一个操作数使用操作符来组成布尔表达式了,MySQL通过下面的语法来支持某个操作数和一个集合组成一个布尔表达式。所谓物化表转连接,就是外层表和物化表做连接查询,MySQL通过计算外层表作为驱动表和物化表作为驱动表进行连接查询的查询成本,然后使用成本较低的方式进行查询。

2024-05-31 00:38:27 721

原创 MySQL目录和文件

重要的日志为错误日志、慢日志、binlog日志。

2024-05-28 23:54:45 440

原创 MySQL体系架构

且不能通过命令修改,只能通过配置文件修改。InnoDB和MyISAM对比。

2024-05-28 23:54:11 311

原创 MySQL中的锁

又称S锁,排他锁主要用于写操作,如更新或删除,它阻止其他事务对数据进行访问。只有一个事务可以获得排他锁,其他事务无法获得任何类型的锁,直到该事务释放排他锁。排他锁的目的是确保在写操作完成前,数据不会被其他事务读取或修改,从而保持数据的完整性和一致性。又称X锁,共享锁主要用于读操作,允许事务对数据进行读取。多个事务可以同时对同一数据对象加共享锁,进行读取操作。共享锁的目的是允许并发读取,但阻止其他事务对数据对象加排他锁,从而阻止写操作。

2024-05-28 23:52:27 1120

原创 SpringBoot自定义starter

以下是基本的依赖,如果用到其它东西,还可以导入其它依赖

2024-05-27 22:59:53 601

原创 SpringBoot自动装配原理

这里采用的SPI接口的思想,“约定大于配置”,就是SpringBoot在整合其它项目的时候,比如MyBatis、redis等的时候,和SpringBoot约定好将要加载的配置类放到META-INF/spring.factories或者SpringBoot3.0后放到META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件夹中,SpringBoot在启动的时候就可以实现自动装配。

2024-05-27 22:09:24 735

原创 SpringBoot前置知识02-spring注解发展史

在spring的发展中注解的开发已经为SpringBoot的诞生做好了铺垫,其中@EnabledAutoXXXConfiguration、@ConditionalOnXXX、@Import等注解是SpringBoot自动装配原理的核心注解。

2024-05-23 23:03:34 885

原创 SpringBoot前置知识01-SPI接口

SpringBoot的核心思想是“约定大于配置”,由此可以看出Spring发展为SpringBoot是必然结果。技术在变,但是思想不会变。

2024-05-23 23:02:42 606

原创 RabbitMQ02-RebbitMQ简介及交换器

RabbitMQ是通过Erlang语言基于AMQP协议编写的消息中间件,它在分布式系统中可以解应用耦合、流量削峰、异步消息等问题。它有两个特性队列排队和异步应用解耦:多个个应用程序之间可通过RabbitMQ作为媒介,两个应用不再粘连,实现解耦;异步消息:多个应用可通过RabbitMQ进行消息传递;流量削峰:在高并发情况下,可以通过RabbitMQ的队列特性实现流量削峰;应用场景:应用到队列特性的应用场景: 排序算法、秒杀活动。

2024-05-22 00:06:31 857

原创 RabbitMQ01-liunx下安装及用户权限分配

RebbitMQ是使用ELang语言编写,所以在Liunx下安装RebbitMQ时要先安装ErLong依赖。安装步骤。

2024-05-21 22:33:55 912

原创 分布式锁3-Redis分布式锁实战(手动实现)

基于jedis实现分布式锁,源码地址。

2024-05-19 22:26:57 174

原创 分布式锁2-Zookeeper分布式锁实战

使用curator操作Zookeeper进行实战;:Apache Curator包含一套高级API框架和工具类,它 是Apache ZooKeeper 的Java 客户端库。

2024-05-19 21:34:53 645

原创 分布式锁1-分布式锁实现的三种方式

假设有这样一个场景,双十一抢iphone15ProMax手机场景,可以抢多台。在单个应用情况下可以使用synchronized或者lock锁解决并发问题,因为只有这一个应用可以调用这个接口。那么在微服务应用下呢?多个请求同时访问这个接口,步骤1是可以同时执行的,在同一时间可能拿到的数量是相同的;假设A服务和B服务各有一个请求访问这个接口,那么A应用要抢5个,B应用要抢1个,这样就导致A应用要更新数据库的时候数量是95,B应用要更新的数量是99,不管谁先拿到数据库的锁,都会后拿到数据库锁的。

2024-05-17 00:08:55 296

原创 MySQL事务

事务1在第一次查询时候生成了ReadView,没有查到数据,事务2插入一条数据并提交事务后事务1执行了update语句,所以会有版本链生成,且最新的版本的事务ID为事务1的trx_id,所以第二次读取的时候creator_trx_id = 事务1的trx_id所以可以看到数据了。如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本。//此刻事务1还没有提交,但是事务2提交了。//此刻就可以看到数据了。

2024-05-12 18:38:03 436

原创 MySQL优化-04慢查询和执行计划

MySQL记录所有执行超过long_query_time参数设定实际阈值的SQL语句日志。

2024-05-12 18:36:59 952 1

原创 MySQL优化-03索引

左边列是精确查找,则右边列可进行范围查找中间有范围查找会导致后面列全部失效,无法充分利用联合索引。

2024-05-12 18:36:08 395

原创 MySQL调优-02数据类型优化

更小更简单,避免NULL。

2024-05-08 23:00:37 239

原创 MySQL调优-01反范式化表设计

这种情况下可以多创建一列slot,每次插入随机选择slot来执行update操作,统计的时候只需要sum操作,这样就提高了并发率。反范式化设计提高高并发情况下优化效率,比如网站点击次数、下载次数等;

2024-05-08 22:58:23 284

原创 JAVA常用集合

特点:有序、可重复、有索引底层原理:a. 数据结构为数组,内存连续,根据索引查询快;删除和添加效率低,需要移动元素位置。b.创建一个ArrayList集合时,会先创建一个长度为0的数组,用一个指针size指向第0个位置,当第一次add元素时,会将数组扩容成一个长度为10的数组,size指针指向第1个位置。(size的指向是数组长度,也是下次存入数据的位置)c. 扩容,当数组元素存满时,进行数组扩容,扩容为原来长度的1.5倍,将老数组中的数据迁移到新数组中,然后向新数组添加元素。

2024-04-25 23:07:44 615

原创 JDK8新特性

JDK8新特性

2024-04-21 17:23:12 909

空空如也

空空如也

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

TA关注的人

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