自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

huangqingfeng的博客

会把自己学的知识分享给大家,希望可以帮助到大家,如果觉得写的可以,麻烦你点个赞,觉得写的不好,可以评论指点下

  • 博客(37)
  • 收藏
  • 关注

原创 Mysql-如何进行慢SQL查询

官方慢SQl查询打开慢日志开关因为开启慢查询日志是有代价的(跟 bin log、optimizer-trace 一样),所以它默认是关闭的:show variables like 'slow_query%';除了这个开关,还有一个参数,控制执行超过多长时间的 SQL 才记录到慢日志,默认是 10 秒。除了这个开关,还有一个参数,控制执行超过多长时间的 SQL 才记录到慢日志,默认是 10 秒。show variables like '%long_query%';可以直接动态修改参数(重启

2022-05-01 19:10:49 13372

原创 Mysql-EXPLAIN执行计划详解

如何查看执行计划官方文档执行计划介绍我们先创建三张表。一张课程表,一张老师表,一张老师联系方式表(没有任何索引)。我们先创建三张表。一张课程表,一张老师表,一张老师联系方式表(没有任何索引)。DROP TABLEIF EXISTS course;CREATE TABLE `course` ( `cid` INT ( 3 ) DEFAULT NULL, `cname` VARCHAR ( 20 ) DEFAULT NULL, `tid` INT ( 3 ) DEFAULT NULL ) ENG

2022-04-30 12:33:37 1349

原创 Mysql-一条更新语句要经历那些流程

1. Mysql客户端将SQl语句传入MysqlServer层2. 将name=666的数据查找到,实际上,存储引擎去磁盘当中找到这条数据,并加载Buffer Pool当中然后将name=666所在行的数据name字段改为涛哥3. 修改以后不会将修改结果直接修改进磁盘,而是将修改进内存当中,会等待刷脏4. 记录Redo Log,记录Redo Log之后,并将这行记录状态改为prepare(准备状态),并没有commit5. 修改了好了之后,可以提交事务6. 生成操作Bin Log,并将Bin L.

2022-04-29 17:34:32 769

原创 Mysql-一条查询语句它到底是怎么执行的?

1. 客户端/服务器通信协议客户端和Mysql服务端建立连接2. 查询缓存(Query Cache)MySQL 内部自带了一个缓存模块。默认是关闭的。主要是因为 MySQL 自带的缓存的应用场景有限,第一个是它要求 SQL 语句必须一模一样。第二个是表里面任何一条数据发生变化的时候,这张表所有缓存都会失效。在 MySQL 5.8 中,查询缓存已经被移除了。3. 语法解析和预处理(Parser & Preprocessor)下一步我们要做什么呢?假如随便执行一个字符串 fkdljask.

2022-04-29 00:06:25 3550

原创 MySQL-InnoDB 锁的基本类型

路。Mysql官网对锁的介绍锁的基本模式——共享锁第一个行级别的锁就是我们在官网看到的 Shared Locks (共享锁),我们获取了一行数据的读锁以后,可以用来读取数据,所以它也叫做读锁。而且多个事务可以共享一把读锁。那怎么给一行数据加上读锁呢?我们可以用 select lock in share mode;的方式手工加上一把读锁。释放锁有两种方式,只要事务结束,锁就会自动事务,包括提交事务和结束事务。锁的基本模式——排它锁第二个行级别的锁叫做 Exclusive Locks(排它锁),它

2022-04-28 12:06:50 166

原创 Mysql-Buffer Pool和Redo Log详解

1. 什么是Buffer Pool?缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。2. Buffer Pool的内存淘汰策略冷热分区的LRU策略LRU链表会被拆分成为两部分,一部分为热数据,一部分为冷数据。冷数据占比 3/8,热数据5/8。数据页第一次加载进来,放在LRU链表的什么地方?放在冷数据区域的头部冷数据区域的缓存页什么时候放入热数据区域?MySQL设定了一个规则,在 innodb_old_blocks_time 参数中,默认

2022-04-27 11:18:04 838 1

原创 设计模式-Factory工厂系列模式详解

1.工厂模式的理解工厂模式的作用是帮助我们创建对象,我们不用自己来创建,根据需要创建的对象的复杂度我们可以把工厂模式分为简单工厂,工厂方法和抽象工厂。2. 简单工厂  简单工厂模式又称为静态工厂方法,他可以根据不同的参数而返回不同的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。JDK中的简单工厂应用:DataFormat自己写一个简单工厂的案例/** * 简单工厂 */public class SimpleFactory { pu

2022-04-26 13:24:04 949

原创 Mysql-详解脏读、不可重复读、幻读

Mysql的事务隔离级别Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。脏读大家看一下,我们有两个事务,一个是 Transaction A,一个是 Transaction B,在第一个事务里面,它首先通过一个 where id=1 的条件查询一条数据,返回 name=Ada,age=16 的这条数据。然后第二个事务呢,它同样地是去操作 id=1 的这行数据,它通过一个 update 的语句,把这行 id=1 的数据的 age 改成了

2022-04-25 16:16:14 3504

原创 Mysql-MVCC多版本并发控制详解

1、MVCCMVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有>读写冲突时,也能做到不加锁,非阻塞并发读。2、当前读像select lock in share mode(共享锁), select for update ; upda

2022-04-24 18:45:46 878

原创 设计模式-Strategy策略模式详解

策略模式是什么?策略模式定义一系列算法,封装每个算法,并使他们可以互换,不同的策略可以让算法独立于使用它们的客户而变化。 以上定义来自设计模式之美是不是很抽象,下面我们就用模拟Comparator接口为大家讲解策略模式,首先我定义一个Cat类,里面有weight,height,age 属性public class Cat { int weight, height,age; public Cat(int weight, int height,int age) {

2022-04-23 22:34:49 451 1

原创 设计模式-Singleton单例模式详解以及8种写法

什么是单例模式单列模式是保证在内存之中只有一个实例单列模式的八种写法第一种写法饿汉式 类加载到内存后,就实例化一个单例,JVM保证线程安全。简单实用,推荐使用!缺点:不管用到与否,类装载时就完成实例化public class Mgr01 { private static final Mgr01 INSTANCE = new Mgr01(); private Mgr01() {}; public static Mgr01 getInstance() {

2022-04-22 16:22:15 464

原创 如何在不加锁的情况下解决线程安全问题

1. 什么是线程安全问题线程安全问题就是多个线程同时对于某个共享资源的访问,导致的原子性,可见性和有序性的问题,而这些问题会导致共享数据存在一个不可预测性,使得程序在执行过程中会出现一些超过预期的一个结果2. 解决线程安全问题的方式一般情况下解决线程安全问题的方式是增加同步锁,常见的是像synchronzied,lock等等,由于导致线程安全问题的根本原因是多线程并行访问。对共享资源加锁之后呢,多个线程在访问这个资源的时候,必须要先获得锁,也就是先获得访问资格,而同步锁的特征是在同一个时刻只允许一

2022-04-21 18:15:00 649

原创 CPU飙高系统反应慢怎么排查?

什么是CPUCPU是整个电脑的核心计算资源,对于一个应用程序来说,CPU是最小执行单元是线程导致CPU飙高的原因CPU的上下文切换过多,对于CPU来说,同一个时刻下每个CPU核心只能运行一个线程,如果有多个线程要去被执行怎么办,CPU只能通过上下文切换的方式来执行调度不同的线程,上下文切换需要做两个事情,第一个是保存运行中线程的执行状态,第二个是处于等待中的线程恢复执行,这两个过程需要CPU执行内核相关指令,去实现状态的保存和恢复,如果较多的上下文切换,会占据大量的CPU资源,从而使得CPU无法执行

2022-04-21 16:14:28 660

原创 死锁的发生原因和怎么避免,写的明明白白

死锁是什么死锁就是两个或者两个以上的线程,在执行的过程中,去争夺同样一个共享资源,造成的相互等待的一个现象,如果没有外部的干预,线程会一直阻塞,无法往下去执行,这样一直处于相互等待资源的线程,我们称为死锁线程。产生死锁的条件互斥条件,共享条件X和Y只能被一个线程占用请求和保持条件,线程T1已经去的共享资源X,在等待共享资源Y的时候,不释放共享资源X不可抢占条件,其他线程不能强行抢占线程,T1占有的资源循环等待条件,线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源就是循环等待

2022-04-20 20:28:13 299

原创 对象的创建过程

如何创建对象在实例化一个对象的时候,JVM首先会去检查目标对象,是否已经被加载并初始化,JVM需要去做的是立刻加载目标类,然后去调用目标类的构造器,去完成初始化,目标类的加载,通过类加载器来实现的,主要就是把一个类加载到内存里面,然后是初始化的过程,主意是对目标类里面的静态变量,成员变量,静态代码块进行初始化,当目标类被初始化以后,就可以从常量池里面去找到对应的类元信息了,并且目标对象的大小,在类加载完成之后呢就已经确定了,所以这个时候,就需要为新创建的对象根据目标对象的大小,在堆内存里面去分配内存空间,

2022-04-20 17:45:54 464

原创 HashMap如何解决哈希冲突?

1. Hash算法和Hash表了解Hash冲突首先了解Hash算法和Hash表Hash算法就是把任意长度的输入通过散列算法变成固定长度的输出,这个输出结果就是一个散列值Hash表又叫做“散列表”,它是通过key直接访问到内存存储位置的数据结构,在具体的实现上,我们通过Hash函数,把key映射到表中的某个位置,来获取这个位置的数据,从而加快数据的查找2. Hash冲突Hash冲突是由于哈希算法,被计算的数据是无限的,而计算后的结果的范围是有限的,总会存在不同的数据,经过计算之后得到值是一样,

2022-04-19 23:11:40 18944 4

原创 ConcurrentHashMap底层实现原理

1. ConcurrentHashMap的整体架构如图,这是ConcurrentHashMap在jdk1.8中的存储结构,它是由数据,单项链表,红黑树来构成,当我们去初始化一个ConcurrentHashMap实例的时候,默认会初始化一个长度等于16的数组,由于ConcurrentHashMap它的核心仍然是Hash表,所以必然会存在Hash冲突的问题,所以ConcurrentHashMap采用链式寻址的方式,来解决Hash表的冲突,当Hash冲突比较多的时候,会造成链表长度较长的问题,这种会使得Con

2022-04-19 11:23:55 6595 3

原创 wait和notify 为什么要在synchronized代码块中

什么是wait和notifywait和notify是用来去实现多个线程之间的一个协调,wait表示让线程进入到阻塞状态,notify让阻塞的线程被唤醒,wati和notify必然是成对出现的,如果一个线程被线程被wait()方法阻塞,那么必然需要另外一个线程通过notify()方法来唤醒,从而去实现多个线程之间的一个通信在多线程里面呢,要实现多线程之间的一个通信,除了管道流的以为,只能去通过共享变量的方法来实现,也就是说线程t1修改共享变量s,线程t2获得修改后的共享变量s的值,从而完成数据的一个通讯

2022-04-18 22:16:55 517

原创 基于数组的阻塞队列 ,ArrayBlockingQueue 原理

阻塞队列阻塞队列是在队列的基础上,去增加了两个附加操作,第一个队列为空的时候,获取元素的线程会等待队列为非空,当队列满时,存储元素的线程会等待队列可用,由于阻塞队列的这样一个特性,可以非常容易的去实现,生产者和消费者这样一个模型,也就是说,生产者只需要关心数据的一个生产,而消费者只需要关心数据的一个消费,所以,如果队列满了,生产者就等待,同样队列空了,消费者也需要等待。实现这样一个阻塞队列,需要用到两个非常关键技术是队列元素的一个存储线程阻塞核唤醒ArrayBlockingQueue而Ar

2022-04-18 21:07:11 322

原创 类加载过程,以及什么是双亲委派?

类的加载机制如图,我们自己写的Java文件到最终运行,它必须要经过编译和类加载这两个阶段,而编译的过程就是.java文件编译成.class文件,而类的加载就是把.class文件加载到JVM内存里面,装载完成以后会得到一个Class对象,我们就可以使用new关键字,来实例化这个对象。一个类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initializat

2022-04-18 17:50:06 358

原创 彻底搞懂Mybatis缓存机制

Mybatis有哪些缓存机制?如图Mybaits里面设计了二级缓存,来提升数据的一个检索效率,也就是避免每一次数据的检索都去查询数据库,一级缓存是SqlSession级别的一个缓存,也叫本地缓存,因为每一个用户在执行查询的时候,都需要使用SqlSession来执行,为了避免每一次都去查询数据库,Mybatis把查询出来数据,缓存到SqlSession的本地缓存里面,后续的Sql如果在命中缓存的情况下,就可以从本地缓存去读取这样一个数据,如果想要去实现跨SqlSession级别的一个缓存,那么一级缓存是无

2022-04-17 23:15:35 572

原创 Spring中事务的传播行为有哪些?

什么是事务传播行为所为的事务传播行为就是多个声明的事务的方法 相互调用的时候,这个事务该如何传递如图,methodA()调用methodB()那么这两个方法都显示了开启事务,那么methodB()开启一个新的事务,还是继续在methodA()这个事务里面去执行,就去决所谓的事务传播的一个行为Spring7种事务传播行为REQUIRED(默认):它是Spring里面默认的事务传播行为,也就新当前存在事务就加入到当前事务去执行,如果不存在事务就创建一个事务REQUIRE_NEW:它不管是否存在事

2022-04-16 22:22:30 3789

原创 MySQL-如何分库分表?一看就懂

一、为什么要分库分表如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯定无法满足这么高的Tps,业务越来越大,单表数据超出了数据库支持的容量,持久化磁盘IO,传统的数据库性能瓶颈,产品经理业务·必须做,改变程序,数据库刀子切分优化。数据库连接数不够需要分库,表的数据量大,优化后查询性能还是很低,需要分。二、什么是分库分表分库分表方案是对关系型数据库数据存储和访问机制的一种补充

2022-04-15 00:12:09 44942 8

原创 缓存雪崩、缓存穿透、缓存击穿的理解以及如何避免?

缓存雪崩缓存雪崩就是存储在缓存里面的大量数据在同一个时刻全部过期,原本缓存组件能够扛住大部分流量,全部请求到了数据库,从而导致数据库压力增加,造成数据库服务器的崩溃一种现象。导致缓存雪崩的原因中间件宕机(可以对缓存中间件做高可用来避免)缓存中大部分key都设置了相同的过期时间(可以在失效时间里面去增加1-5分钟的随机值,避免同时失效的问题)缓存穿透缓存穿透表示段时间内有大量的不存在key请求到应用程序里面,而这些不存在key,在缓存里面又找不到,从而导致全部的请求,全部穿透到了数据库,造成

2022-04-12 19:47:59 843

原创 Lock和Synchronized的区别

Lock和Synchronized的区别1. 从功能角度来看Lock和Synchronized都是java中去用来解决线程安全问题的一个工具2. 从特性来看Synchronized是java中的同步关键字,Lock是J.U.C包中提供的接口,而这个接口有很多的实现类,包括ReentrantLock这样重入锁的实现,Synchronized可以通过两种方式去控制锁的力度一种把synchronized关键字修饰在方法层面,另一种是修饰在代码块上,可以通过synchronized加锁对象的生命周期,来

2022-04-11 22:39:31 756

原创 SpringBoot自动装配机制的原理

Spring Boot 自动装配机制的原理?自动装配是什么?自动装配简单来说就是自动去把第三方组件的Bean装载到IOC容器里面,不需要开发人员在去写Bean相关的一个配置。SpringBoot如何实现自动装配在SpringBoot应用里面只需要在启动类上加上去加上@SpringBootApplication注解,就可以实现自动装配,@SpringBootApplication注解是一个复合注解,真正去实现自动装配的注解是@EnableAutoConfiguration自动装配的实现三个核心的关

2022-04-11 18:00:05 359

原创 Mysql-什么是聚集索引和非聚集索引?

什么是聚集索引和非聚集索引?聚集索引聚集索引就是基于主键创建的索引,因为在InnoDB的引擎里面呢,一张表的数据对应的物理文件本身就是按照B+树来组织的,聚集索引就是按照每张表的逐渐来构建这样一个B+树,然后叶子节点里面存储了这个表里面的每一行数据记录,所以基于InnoDB这样一个特征。聚集索引并不仅仅是一种索引类型,还代表了一种数据的存储方式,同时意味着,每个表里面必须有一个主键,如果没有主键,InnoDB会默认选择或添加一个隐藏列,作为主键索引来存储这个表的数据行,一般情况是建议使用自增id作为主键

2022-04-10 23:51:52 3172 1

原创 Spring如何解决循环依赖?

一、Spring容器启动流程创建配置类@ComponentScan(value = {"com.woniu"})@Configurationpublic class MyConfig {}创建一个普通类package com.woniu.service;import org.springframework.stereotype.Component;@Componentpublic class Eservice {}创建一个启动类public class Applicat

2022-04-10 16:05:05 722 4

原创 ThredLocal的底层原理

ThredLocal的底层原理ThreadLocal是什么?ThreadLocal是一种线程隔离机制,它提供多线程环境下对于共享变量访问的一个安全性,在多线程访问功效变量这一个场景里面如图,一般情况下我们解决办法对于共享变量去加锁,所以保证在同一个时刻,只有一个线程能够对共享变量进行更新,并且基于Happens-Before规则里面的一个锁监视器的一个规则,又能够保证数据修改之后,对于其他线程是可见的但是加锁呢,会带来一个性能上的下降,所以ThreadLocal用了一种换时间的一个设计思想,在每

2022-04-09 18:50:38 367

原创 AQS理解

AQS是什么?AQS全称Abstract Queued Synchronizer是并发编程中比较核心的一个组件,多线程同步器,它是J.U.C包中多个组件的底层实现,比如Lock、CountDownLatch、Semaphore都用到了AQS,从本质上来说,AQS提供了两种锁的机制,分别是排它锁和共享锁,所谓排它锁就是存在多个线程去竞争同一个共享资源的时候,同一个时刻,只允许一个线程去访问这样一个共享资源,也就是说,多个线程只能有一个线程去获得这样一个锁的资源,比如Lock中ReentrantLock重入锁

2022-04-08 00:16:29 590

原创 B树和B+树的理解

B树和B+树的理解二叉树、AVL树、B树的概念B树是一种多路平衡查找树,为了更加形象去理解树的概念,先来看下二叉树B树和B+树的应用场景为什么用B树或B+树来做索引结构

2022-04-07 23:04:45 831

原创 CAS机制

什么是CAS机制CAS是Java中Unsafe类里面的一个方法,它的全称是CompareAndSwap,比较并交换的一个意思,它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。比如这样一个列子,有一个成员变量叫state,它的默认值是0,其中定义了一个方法叫doSmething(),这个方法的逻辑是先判断state是否为0,如果为0就修改成1,这个逻辑在单线程的情况下,没有任何问题,但是在多线程的环境下,会存在原子性的问题,因为这是典型的Read - Write的一个操作,一般情况

2022-04-05 21:02:11 428

原创 volatile关键字有什么用?

volatile关键字有什么用?volatile作用可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间的重排序什么是可见性可见性是指当一个线程对于共享变量的修改,其他线程可以立刻看到修改之后的一个🈯️,可见性本质上由几个方面造成的cpu层面的高速缓存,在cpu里面呢设计了三级缓存去解决cpu运算效率和内存IO效率的问题,但是它也带来缓存一致性的一个问题,而在多线程执行的情况下呢,缓存一致性的问题就会导致可见性的问题,所以,对于增加了volatile关键字的一个修饰的共享变

2022-04-05 15:02:09 146

原创 Mysql-innoDB如何解决幻读?

innoDB如何解决幻读?1.mysql的事务隔离级别这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现脏读,不可重复读,幻读的一些问题,而innoDB在可重复读隔离级别模式下解决了幻读的一个问题,2.什么是幻读幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致...

2022-04-02 23:48:46 3294 1

原创 JDK动态代理为什么只能代理有接口的类

JDK动态代理为什么只能代理有接口的类为什么只能代理有接口的类?是因为JDK动态代理本身机制决定的,首先在java里面动态代理是Proxy.newProxyInstance()这个方法来实现的,它需要传入被动态代理的一个接口类,还是取决于JDK动态代理的的一个底层实现,JDK动态代理会在程序运行期间,去动态生产一个代理类,叫$ProxyO,那么这个动态生成的代理类会去继承一个java.lang.reflect.Proxy这样一个类,同时还会去实现被代理类的接口,在java里面不支持多种继承的,而每个动

2022-04-01 20:41:18 4134

原创 Redis的内存淘汰算法和原理是什么

Redis的内存淘汰算法和原理是什么Redis里面的内存淘汰策略,是指当内存的使用率达到了maxmemory的上限的时候,它的一种内存释放的一个行为.Redis里面提供了很多种内存的淘汰算法归纳起来主要有4种1.随机,随机移除某个key2.TTL算法 就是在设置了过期时间的键里面呢,去找到更早过期的时间key进行有限的移除3.LRU算法去移除最近很少使用的key4.LFU算法跟LRU算法是类似的LRU算法是一种常见的内存淘汰算法,在Redis里面它会维护一个大小为16的候选池,而这个候选池里面

2022-04-01 12:27:05 3910

原创 Redis和Mysql如何保证数据一致性?

Redis和Mysql如何保证数据一致性Redis和Mysql如何保证数据一致性一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层,主要目的是减少数据库的io,还可以提升数据库io性能它的一个整体架构1.命中缓存从缓存加载数据,直接返回2.没有命中缓存,从数据库加载加载数据3.加载到的数据写入缓存一份数据同时保存在数据库和Redis里面,当数据发生变化的时候,需要同时更新Redis和Mysql,由于更新操作是有先后顺序的,并且它并不像Mysql中的多表事务操作可以满足ACID

2022-04-01 10:53:02 1641 1

空空如也

空空如也

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

TA关注的人

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