自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Tomcat原理(自己简单理解总结)

记得之前大二刚开始学习java web的时候就在想为什么tomcat能一直运行,为什么能接受前端浏览器发过来的请求,而且只能识别servlet文件,于是我就想着往源码里走一走初探1. 准备对应的环境既然是想看源码,那就得准备好相应的环境,于是我就去官网找了一下对应的源码,这里我下载的是tomcat 8.5。注意:源码文件结尾以src结尾,比起一般的tomcat,里面有更多的文件,文件大小也更大2. 找到对应的主类既然tomcat能一起跑着来监听来自客户端的请求,我就想着:不管是什么语言写的,肯定

2021-05-22 10:26:54 1336 1

原创 B-树、B+树、B*树

B-树B-树就是B树,普通节点也存数据特点:​ 1. 根结点的儿子数为[2, M]​ 2. 除根结点以外的非叶子结点的儿子数为[M/2, M]​ 3. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字(至少2个关键字)​ 4. 非叶子结点的关键字个数=指向儿子的指针个数-1​ 5. 所有叶子结点位于同一层B+树只有叶子节点才存数据,非叶节点只存储关键字,非叶子节点所能保存的关键字大大增加,树的高度降低,磁盘IO次数减少应用:mysql索引的一种(聚簇和非聚簇索引)特点:​

2021-05-14 20:30:05 647 2

原创 Bean的生命周期

定义bean指的就是:由Spring IOC容器管理的对象,bean的创建过程为:实例化 -> 填充属性(基本类型、引用类型) -> 初始化,而bean的声明周期指的就是在bean的创建过程中,还实现了很多扩展点。我刚开始看的时候不太理解扩展点这个概念,后来才知道,其实扩展点很简单,其实就是实现一些接口,在bean创建过程中就会自动调用其实现的方法方法相关操作先来看看,Spring在Bean从创建到销毁的生命周期中可能做得事情实例化bean对象并且注入对象属性在Bean属性值设

2021-05-12 22:23:03 675

原创 redo log、binlog、undo log总结

redo log和undo log是InnoDB引擎的,binlog是server层的undo log和binlog是逻辑日志,redo log是物理日志undo log用于记录事务开始前的状态,用于事务失败时的回滚操作;redo log记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据redo log:重做日志,属于物理日志,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来更新语句执行时,InnoDB引擎会把更新记录写到redo log

2021-05-07 23:06:09 348

原创 对于MySQL集群(读写分离)的一些思考和总结

在企业开发过程中,数据库属于非常重要的一环,而MySQL作为最为常见的关系型数据库(之一),在日常使用过程中通常是单机的,很容易造成单点故障问题,这篇文章便是我对于MySQL集群学习的一些思考和总结定义读写分离是一种很经典的数据库拆分方案,将MySQL集群中的节点分为主库和从库,主库负责写,从库负责读问题1:如何保证写请求打到主库,读请求打到从库?1. 程序实现由开发人员实现,在代码中根据SQL语句进行分发,insert、delete、update请求打到主节点上,select请求打到从节点上解

2021-05-07 23:02:08 217

原创 MySQL事务详解

1. 定义事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消注意:在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务2. 使用开启事务:begin;或start transaction;提交:commit;回滚:rollback;3. 自动提交和手动提交查看当前自动提交状态:show variables like 'autocommit';3.1 自动提交默认开启,即用户对数据库的每一个操作为一个孤立的事务,也就是说用

2021-04-12 10:33:47 83

原创 MySQL大表优化

当MySQL单表记录数过大时,数据库的CRUD性能会明显下降常见的优化方法如下:限定数据范围:加上where条件,不要查全表读写分离:主库负责写,从库负责读垂直分表:对字段进行拆分,放在不同的表优点:列数据变小,减少I/O次数,简化表结构,易于维护缺点:主键冗余,需要管理冗余列,并会引起联表join操作,会让事务变得负责水平分区:根据某种策略对数据行进行拆分,分散到不同表或库中,最好分库放到不同服务器上,例如对时间段进行划分推荐阅读:https://blog.csdn.net/itgua

2021-04-11 21:49:03 206

原创 Redis三种集群搭建方式

redis集群搭建在redis集群搭建过程中,涉及到3种节点:主节点(leader)、从节点(slave)、哨兵节点(sentinel)1、主从模式1主多从,主节点写,从节点读,数据只能由主节点同步到从节点主从复制模式全量复制:Master 全部同步到 Slave部分复制:Slave 数据丢失进行备份常见性质主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库从数据库一般都是只读的,并且接收主数据库同步过来的数据一个master可以拥有多个slave,但是一

2021-04-11 21:25:02 643

原创 Redis缓存穿透和缓存雪崩

1、缓存穿透:绕过缓存大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层,当每次请求数据都不存在时则每次都会走数据库解决方案缓存无效key:如果缓存和数据库都查不到某个key的数据就写一个到Redis中去并设置过期时间,当每次构建的key都不一样的时候则无效,不能从根本上解决问题布隆过滤器:通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中,如果发现是无效数据则直接返回错误信息关于布隆过滤器,这里推荐一篇我自认为写的很好的文章:布隆过滤器2、缓

2021-04-11 21:04:02 69

原创 Redis持久化机制

快照RDB默认使用,性能高备份某个时间点上内存中数据的副本,不仅可以本地持久化,还可以传给其他服务器用来创建相同数据的服务器副本,完成Redis集群的搭建。每经过规定时间检查是否有指定数量的key发生改变,如果达到则进行快照持久化除了满足save规则会触发RDB持久化外,执行flushall命令或客户端退出redis时,也会持久化。把dump.rdb放在config get dir的指定目录下,启动就会恢复其中的数据Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时

2021-04-11 20:58:33 77

原创 Mybatis一级缓存和二级缓存

mybatis缓存:在内存中临时存储数据,速度快,可以减少数据库的访问次数经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中一级缓存默认开启,是SqlSession的缓存,SqlSession对象中维护了一个Map集合,用于存储相互的缓存数据。查询的时候,先从SqlSession的缓存中查找,如果有,直接返回。如果没有,查询数据库原理分析一级缓存底层使用的是Map集合,key存储的是执行的SQL语句,value存放的是查询的对象一级缓存的生命周期和SqlSession的生命

2021-04-11 20:52:42 92

原创 Mybatis四大核心组件

Mybatis四大核心组件分为以下4个部分SqlSessionFactoryBuilder(构造器):根据配置来构造SqlSessionFactory。配置方式有2种:xml和java config,使用的设计模式是建造者(Builder)模式SqlSessionFactory(工厂接口):用于生产SqlSession的工厂,使用的设计模式是工厂(Factory)模式SqlSession(会话):包含了执行SQL的所有的方法Mapper(会话):完成Java与SQL语句之间的映射,也就是我们平时说

2021-04-11 20:47:21 2032

原创 AQS同步组件

队列同步器AQS:同步状态(共享资源)state + CLH同步队列(内置FIFO队列,请求共享资源的线程),用来构建锁或者其他同步组件的基础框架,既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,这样就可以方便实现不同类型的同步组件独占式组件ReentrantLock:重入锁,不同线程不能共享访问共享资源,分为公平锁和非公平锁模式,实现Lock接口state为0:资源可用,state为1:资源正被一个线程使用Mutex共享式组件Semaphore:限制某种资源的线程数量,也

2021-04-11 20:33:57 89

原创 关于ThreadLocal你知道多少?

定义:线程(本地)变量,一种保证和规避多线程出现不安全的同步方式ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。也就是说,一个以ThreadLocal对象为键、任意对象为值的存储结构,这个结构被附带在线程上set(T)方法设置值,get()方法获取值,这个所谓的key-value只对当前线程可见表面上看,ThreadLoc

2021-04-11 20:26:43 112

原创 JVM调优工具

基础故障处理工具jps:虚拟机进程状况工具对于本地虚拟机进程来说,进程的本地虚拟机ID和操作系统的进程ID是一致的参数:可综合使用-q:仅显示本地虚拟机唯一ID(LVMID),不显示主类名称-l:输出应用程序主类的全类名,如果进程执行的是jar包,则输出jar完整路径-m:虚拟机启动时传给主类main()的参数-v:虚拟机启动时的jvm参数,如:-Xmas20m -Xmax50mjstat:虚拟机统计信息监视工具常用于检测垃圾回收和内存泄露问题jinfo:java配置信息工具

2021-04-11 20:15:48 118

原创 Java死锁的产生和解决

定义所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进死锁产生的4个必要条件互斥。一个资源只能被一个进程占用请求和保持。某个进程之前申请了资源,还想再申请资源,同时不释放原来的资源不可剥夺。某个进程占用了资源,就只能他自己去释放循环等待。一定会有一个环互相等待避免死锁的常见方法解决死锁只要破坏其中一个必要条件就行避免一个线程同时获取多个锁避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源尝试使

2021-04-06 10:49:52 176 1

原创 Spring 5大隔离级别和7大传播行为

5大隔离级别使用后端数据库事务默认的隔离级别读未提交:允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读读提交:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生可串行化:事务依次逐个执行,事务之间完全不可能产生干扰,可以防止脏读、不可重复读以及幻读注意:Spring事务的使用前提是所连接的数据库支持事务,例如mysql的MyISAM

2021-04-05 16:13:50 1489 2

原创 双亲委派机制和破坏双亲委派机制

双亲委派机制要了解双亲委派,必须得知道类加载器,类加载器是用来把class文件加载进内存的类加载器3层架构启动类加载器:C++实现,是虚拟机的一部分,java虚拟机能够识别,无法被java程序直接引用(null)。负责加载放在<JAVA_HOME>\lib目录,或者被-Xbootclasspath参数所指定的路径中存放的,只加载指定的文件,如:rt.jar、tools.jar,按照文件名识别,名称不符合的类库即使放在lib目录下也不会被加载扩展类加载器:负责加载<JAVA_HOM

2021-04-02 21:36:52 508

原创 ReentrantReadWriteLock读写锁实现原理

要了解ReentrantReadWriteLock,首先要了解AQSAQS是队列同步器,由2部分组成:同步状态:共享资源state和CLH同步队列:内置FIFO队列,请求共享资源的线程,用来构建锁或者其他同步组件的基础框架,既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,这样就可以方便实现不同类型的同步组件独占式实现有:ReentrantLock、Mutex等共享式实现有:Semaphore、CountDownLatch、CyclicBarrier等我们要说的ReentrantRe

2021-03-22 21:07:23 784 1

原创 带你快速了解SSO单点登陆

定义在多个应用系统中共享登录、撤销状态这里说的多个应用系统其实就是指的不同的域,因为登陆状态的保存基本上就是基于cookie实现的,而cookie受到浏览器同源策略的影响,是不能跨域的也就是说,实现单点登录的核心是:让客户端浏览器的登陆状态(Session ID、Token)在多个域中共享举例:淘宝(www.taobao.com)和天猫(www.tmall.com)就实现了单点登录,淘宝和天猫属于不同域,在淘宝登陆了天猫也就自然登陆了实现前提多个不同应用系统(不同源网站的服务器端)需要登陆状态共

2021-03-17 00:10:59 307 3

原创 Win10家庭中文版安装Docker Desktop(亲测成功,建议收藏)

之前学习Docker的时候想安装一下Windows版的Docker图形化管理工具,然后百度搜了一下,知道了Docker DeskTop这款工具,于是找了个教程准备安装一下,然后发现竟然对操作系统还有要求:接着我查看了一下我电脑的操作系统竟然是家庭中文版真是坑爹啊,于是无奈只能在Linux服务器上进行Docker的安装学习最近我还是尝试搭建了一下,没想到竟然成功了,在这里分享一下搭建过程1. 添加Hyper-V我了解到,对操作系统有要求是因为:只有Win10 专业版、企业版或教育版才自带Hype

2021-03-13 21:30:09 17822 11

原创 @Component和@Bean注解的区别和联系

先说联系联系@Component和@Bean注解的目的一样,都是注册bean到IOC容器中区别@Component 注解作用于类,而@Bean注解作用于方法@Component 注解是通过类路径扫描来自动装配到IOC容器中的,而@Bean注解是将方法返回值作为bean装载到IOC容器中@Bean注解比@Component注解的自定义性更强,而且很多地方我们只能通过@Bean注解来注册bean。比如当我们引用第三方库中的类需要装配到Spring容器时,则只能通过 @Bean来实现(其实很好理解:

2021-03-08 10:44:23 3416 8

原创 @Autowired和@Resource注解的区别和联系(十分详细,不看后悔)

先说联系联系@Autowired和@Resource注解都是作为bean对象注入的时候使用的两者都可以声明在字段和setter方法上注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了区别@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的@Autowird注解默认通过byName方式注入,而@Resource注解默认通过byType方式注入对

2021-03-07 10:53:20 45142 22

原创 C++大顶堆实现堆排序

代码中有详细的注释,如有不懂的地方欢迎评论区交流~#include<iostream>using namespace std;const int N = 1e5 + 10;int n, q[N];//向下调整,low为欲调整的数组下标,high一般为堆的最后一个元素的数组下标,在[low, high]范围内进行调整void down_adjust(int low, int high) { int i = low, j = 2 * i; while (j &lt

2021-03-06 10:51:13 299

原创 JVM从入门到精通(一)

走进JavaJDK、JRE与JVMJDK:Java程序设计语言、Java虚拟机、Java类库。支持Java程序开发的最小环境JRE:Java类库API中的Java SE API子集、Java虚拟机JVM:JRE的子集Java技术体系Java发展史1995.5.23:Oak改名Java,正式发布Java1.01996.1.23:JDK1.0,代表技术包括:Java虚拟机、Applet、AWT1997.2.19:Sun公司发布JDK1.11998.12.4:JDK迎来了一个里程碑式的重要版

2021-03-05 23:38:25 1009 1

原创 对于Java是静态多分派、动态单分派语言的理解

在理解这个之前,首先我们需要知道:在JVM中,方法的调用过程这里的方法调用并不指方法中的代码被执行,而是指确定被调用方法的版本 (即调用哪一个方法)方法的调用分为两个阶段,分别是解析阶段和分派阶段解析阶段也就是我们在Java基础中了解的前期绑定,或者说静态绑定,指代的是在编译期间就能够确定执行的是哪个方法。分类final修饰的方法static修饰的方法private修饰的方法构造方法分派也就是后期绑定,或者说动态绑定,指代的是在运行期间才能够确定执行的是哪个方法。注意:分派本身就

2021-03-04 13:16:22 466 4

原创 IDEA多模块项目创建、不同模块间的maven相互依赖

就以快速构建Dubbo项目为例,需要创建具有三个模块的项目:生产者Producer、消费者Consumer以及公用的API接口依赖,并且需要将API依赖到生产者和消费者模块中。1. 创建API接口2. 创建生产者Provider模块...

2021-01-31 19:02:18 1631

原创 你还记得Java中抽象类和接口各自的特点吗?

前言抽象类和接口在面试中经常被同时问到,两者有一定的相似点与不同点,很容易发生混淆。我本人也是记住了忘,忘了复习一下,过段时间又忘了。所以说今天写下这篇文章总结一下两者的特点与区别,顺便巩固一下自己的Java知识体系,也方便以后复习。我会尽可能全面的阐述两者的特点,如有遗漏,敬请补充。抽象类抽象类属于类,由class关键字修饰,单继承,同时会由abstract关键字修饰;含有抽象方法的类是抽象类,但是抽象类可以没有抽象方法;抽象类可以拥有构造函数,但是无法实例化,即无法通过new创建对象。但是

2020-05-08 22:29:28 345

原创 Java 传递机制:值传递还是引用传递?(详细图文版)

前言明白Java中的传递机制,有助于帮助我们更好的理解Java在内存中的地址指向。这篇文章我会通过尽可能简单的讲解,让大家更好的理解。1. 传递类型首先,我们需要知道,传递类型指的是调用函数时传入的参数传递的方式。传递类型包括两种:值传递和引用传递值传递:我们传入的实参拷贝一份传给函数的形参,在函数中操作形参不改变实参的值引用传递:我们传入的实参实际上传入的是其在内存中的地址指向,在函...

2020-05-07 22:57:29 463

原创 SSM中通过mybatis反向生成,sql报错,报500错误

错误信息如下HTTP Status 500 - Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException:type Exception reportmessage Request processing failed; nested exception is or...

2020-04-24 22:41:13 1101

原创 C++并查集经典例题(代码备注详细版)

题目描述有一个叫做“数码世界”奇异空间,在数码世界里生活着许许多多的数码宝贝,其中有些数码宝贝之间可能是好朋友,并且数码宝贝世界有两条不成文的规定:第一,数码宝贝A和数码宝贝B是好朋友等价于数码宝贝B与数码宝贝A是好朋友第二,如果数码宝贝A和数码宝贝C是好朋友,而数码宝贝B和数码宝贝C也是好朋友,那么A和B也是好朋友现在给出这些数码宝贝中所有好朋友的信息,问:可以把这些数码宝贝分成...

2020-03-21 00:00:37 635

原创 Windows解决GitHub项目克隆到本地速度过慢的问题

总所周知,GitHub是全球最大的"同性"交流平台,我们可以将GitHub作为我们的远端代码仓库,将我们的项目推送上去进行管理。可是存在GitHub作为一个国外的网站,我们在使用的时候总会遇到一些速度过慢的时候,尤其是当我们想要通过git将一个项目克隆到本地时,会发现速度实在是太慢了,通常只有几十KB。项目小还好,多等一会就能克隆下来,可是当项目过大时,等待的时间会异常的长,让人难以忍受。在搜寻一...

2020-03-07 23:49:13 1311

原创 分享几个实用的Python高阶函数

什么是高阶函数?高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。map()映射函数如上图所示,map()函数其实是一个一一映射的关系使用方法: map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为迭代器返回。注:map()函数返回的是一...

2020-02-17 20:17:24 1094

原创 模拟停车场管理系统(栈和队列的应用)

模拟停车场管理系统(数据结构)ps. 这是我们学校的实验课题目,本文章用来记录,本人能力有限,本文章仅为参考 实验目的和要求通过实验进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 问题描述设停车厂只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能...

2019-10-15 23:23:04 5515 3

空空如也

空空如也

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

TA关注的人

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