- 博客(106)
- 收藏
- 关注
转载 扒一扒MySQL的InnoDB存储引擎
在讲之前,我先抛几个问题MYSQL的记录是怎么存储的?页内记录到底是怎么维护的?页内查询过程是怎样的?1.Page页面MYSQL管理数据库的一个单位叫Page页面,数据都是存在页面里的。那我们想要知道数据是怎么存的,就需要了解页长什么样子我们来盘点一下:页头(Page Header):存一些统计信息,记录页面的控制信息,共占56字节,包括页使用情况,页的左右兄弟页面指针(这个就是双向链表,把左右兄弟页面的指针给拿到)等虚记录:分为最大虚记录和最小虚记录。它两把这页里存储的数据的范围给
2021-12-15 13:55:35
286
转载 Innodb Buffer Pool的三种Page和链表
一、Innodb Buffer Pool 简介Buffer Pool 是Innodb 内存中的一块占比较大的区域,用来缓存表和索引数据。众所周知,从内存访问会比从磁盘访问快很多。为了提高数据的读取速度,Buffer Pool 会通过三种Page和链表来管理这些经常访问的数据,保证热数据不会被置换出Buffer Pool。二、三种PageBuffer Pool 是按照page大小来分配,收innodb_page_size控制Free Page (空闲页) 此page未被使用,位于Free链表Cle
2021-12-15 10:21:26
409
转载 数组和链表的对比
链表是什么链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素;链表是线性表的一种。所谓的线性表包含顺序线性表和链表。顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。所以,链表允许插入和删除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表1.单向链表单向链
2021-12-10 11:21:28
333
原创 RocketMQ - Dledger模式的搭建
1.准备环境本文主要是以RocketMQ-4.8.0进行的搭建(RocketMq好像是从4.5.0之后才支持Dledger模式的,Dledger模式:当master宕机不可用的时候,slave会进行选举,然后选择一个slave作为master继续提供服务)下载地址:http://rocketmq.apache.org/dowloading/releases/在需要部署的机器上安装,配置jdk和引入rocketmq的环境准备三台服务器(192.168.1.21 , 192.168.1.23 , 19
2021-11-11 10:49:22
2566
1
转载 AQS系列(2)-独占锁的释放
开始之前先提一句,JAVA的内置锁在退出临界区之后是会自动释放锁的,但是ReentrantLock这样的显示锁是需要自己显示释放的,所以在加锁之后一定不要忘记在finally快中进行显示的锁释放:Lock lock = new ReentrantLock();...lock.lock();try { // 更新对象 //捕获异常} finally { lock.unlock();}ReentrantLock的锁释放由于锁的释放操作对于公平锁和非公平锁都是一样的
2021-04-02 17:32:59
165
转载 AQS系列(1)-独占锁的获取
本篇我们以ReentrantLock的公平锁为例来详细看看使用AQS获取独占锁的流程本文中的源码基于JDK1.8.Java并发工具类的三板斧状态,队列,CAS每当我们学习一个java并发变成工具的时候,我们首先要抓住这三点状态:一般是一个state属性,它基本是整个工具的核心,通常整个工具都是在设置和修改状态,很多方法的操作都依赖于当前状态是什么。由于状态是全局共享的,一般会被设置成volatile类型,以保证已修改的可见性。 队列:队列通常是一个等待集合。大多数以链表的形式实现.
2021-04-02 16:59:59
200
转载 创建多少个线程合适?
创建多少个线程,一般我们根据场景来进行讨论CPU密集型程序一个完整请求,I/O操作可以在很短时间内完成,cpu还有很多运算要处理,也就是说CPU计算的比例占很大一部分假如我们要计算1+2+3+4+....+100亿的总和,很明显,这就是一个CPU密集型程序。在单核CPU下,如果我们创建4个线程来分段计算,即:线程1计算【1,25亿】 ...以此类推 线程4计算【75亿,100亿】我们来看下图他们会发生什么?由于是单核CPU,所有线程都在等待CPU时间片。按照理想情况来看,四
2021-02-07 15:44:44
1557
3
转载 一文讲透如何排查Redis性能问题
Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。你也许或多或少地,也遇到过以下这些场景: 在 Redis 上执行同样的命令,为什么有时响应很快,有时却很慢? 为什么 Redis 执行 SET、DEL 命令耗时也很久? 为什么我的 Redis 突然慢了一波,之后又恢复正常了? 为什么我的 Redis 稳定运行了很久,突然从某个
2021-01-26 15:03:45
559
转载 java内存泄露排查总结
1.内存溢出和内存泄露一种通俗的说法:内存溢出:你申请了10个字节的空间,但是你在这个空间写入了11个或者以上字节的数据,则出现溢出 内存泄露:你用new申请了一块内存,后来很长时间都不使用了,但是因为一直被某个或者某些实例所持有导致GC不能回收掉,也就是该释放的对象没有释放,则出现泄露。1.1 内存溢出java.lang.OutOfMemoryError:是指程序在申请内存时,没有足够的内存空间供其使用,出现OutOfMemoryError。产生的原因JVM内存过小 程序不严密,
2021-01-18 11:14:24
623
转载 双亲委派10连问
什么是双亲委派机制?首先,我们知道,虚拟机在加载类的过程中需要使用类加载器,而在java中,类加载器有很多,那么当jvm想要加载一个class文件第额时候,到底应该由哪个类加载器加载呢?这就不得的提到双亲委派机制。首先我们需要知道的是,java语音系统中支持一下4种类加载器:Bootstrap ClassLoader:启动类加载器 Extention ClassLoader:标准扩展类加载器 Application ClassLoader:应用类加载器 User ClassLoader
2021-01-11 16:40:45
103
原创 分析下MYSQL的三大日志 - 8
Mysql 中有6中日志文件,分别是:二进制日志 - binlog 重做日志 - redo log 回滚日志 - undo log 错误日志 - error log 慢查询日志 - slow query log 查询日志 - general log 中继日志 - relay log二进制日志 binlog1.概述binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生
2021-01-11 11:25:19
199
转载 DDL变更,你可能不知道的事 -7
前言随着业务的发展,用户对系统需求变得越来越多,这就要求系统能够快速更新迭代以满足业务需求,通常系统版本发布时,都要先执行数据库的DDL变更,包括创建表、添加字段、添加索引、修改字段属性等。在数据量不太大的情况下,执行DDL都很快,对业务基本没啥影响,但是数据量大的情况,而且我们业务做了读写分离,接入了实时数仓,这时DDL变更就是一个的难题,需要综合各方业务全盘考虑。下面就聊聊这些年我公司在里面,MySQL中的DDL执行方式的变化、大表DDL该如何选择以及DDL执行过程监控。MYSQL中的D
2021-01-08 15:10:39
1568
转载 为什么mysql不建议使用delete删除数据 -6
InnoDB存储架构从这张图可以看到,InnoDB存储结构主要包括两部分:逻辑存储结构和物理存储结构。逻辑上是由表空间tablespace —> 段segment或者inode —> 区Extent ——>数据页Page构成,Innodb逻辑管理单位是segment,空间分配的最小单位是extent,每个segment都会从表空间FREE_PAGE中分配32个page,当这32个page不够用时,会按照以下原则进行扩展:如果当前小于1个extent,则扩展到1个extent;.
2021-01-08 11:10:26
780
4
转载 MySQL索引凭什么让查询效率提高这么多?-5
我相信大家在数据库优化的时候都会说到索引,我也不例外,大家也基本上能对数据结构的优化回答个一二三,以及页缓存之类的都能扯上几句,但是有一次阿里P9的一个面试问我:你能从计算机层面开始说一下一个索引数据加载的流程么?(就是想让我聊IO)Mysql的索引本质上是一种数据结构让我们先了解一下计算机的数据加载磁盘IO和预读:先说一下磁盘IO,磁盘读取数据靠的是机械运动,每一次读取数据都需要寻道,寻点,拷贝到内存三步操作。寻道时间是磁臂移动到指定磁道所需要的时间,一般在5ms以下;寻点是从
2021-01-06 16:45:38
164
转载 数据库调优-3
面试官一问到数据库调优的,除了加索引大家还知道别的么?或者索引相关的点你全部都知道么?聚簇索引,非聚簇索引,普通索引,唯一索引,change buffer,表锁、行锁、间隙锁以及行锁,还有索引为啥会选择错误?这些大家知道嘛?排除缓存干扰因为在mysql8.0之前我们的数据库是存在缓存这样的情况,因为存在缓存,大多时候sql怎么执行都是很快的,当然第一次其实不快,只是没有注意到。以至于上线后因为缓存经常失效,导致rt(response time)时高时低后面发现是缓存的问题,我们在执行sql的
2021-01-06 10:32:04
159
转载 数据库索引-2
前言写数据库,我第一时间就想到了MySQL、Oracle、索引、存储过程、查询优化等等。不知道大家是不是跟我想得一样,我最想写的是索引,为啥呢?以下这个面试场景,不知道大家熟悉不熟悉:面试官:数据库有几千万的数据,查询又很慢我们怎么办?面试者:加索引。面试官:那索引有哪些数据类型?索引是怎么样的一种结构?哪些字段又适合索引呢?B+的优点?聚合索引和非聚合索引的区别?为什么说索引会降低插入、删除、修改等维护任务的速度?……..正文索引有哪些数据结构Hash,BTree哈
2021-01-05 15:23:04
192
转载 数据库基础知识-1
正文你知道mysql的基本架构吗?画出这个示意图我们按照顺序了解下,连接器是什么?我们要进行查询,第一步就是先去链接数据库,那这个时候就是连接器跟我们对接。他负责跟客户端建立链接,获取权限,维持和管理链接。链接的时候会经过TCP握手,然后身份验证,然后我们在输入用户名密码就好了。验证ok之后,我们就连上了这个mysql服务了。但是这个时候我们处于空闲状态。怎么查看空闲链接列表?show processlist 其中Command列显示为sleep的这一行,就表示现在系统里面有一个空.
2021-01-05 13:52:38
266
转载 jvm面试题-1
java内存区域说一下jvm的主要组成部分及其作用jvm包含两个子系统和两个组件,两个子系统为Class loader(类加载),Execution engine(执行引擎),两个组件为Runtime data area(运行时数据区),native interface(本地接口)。Class loader(类加载):根据指定的全限定名(如:java.lang.Object)来装载class文件到Runtime data area(运行时数据区)中的method area(方法区) Ex.
2020-12-28 15:17:15
402
转载 24.线程系列- google提供的一些好用的并发工具类
关于并发方面,juc已帮我们提供了很多好用的工具,而谷歌在此基础上做了扩展,使并发更容易,这些工具放在guava.jar包中。本文演示几个简单的案例,见一下guava的效果。guava maven配置<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.0-jre<
2020-12-22 14:13:44
564
转载 23.线程系列- 高并发中计数器的实现方式
本文主要内容4中方式实现计数器功能,对比其性能 介绍LongAdder 介绍LongAccumulator需求:一个jvm中实现一个计数器功能,保证多线程情况下数据正确性我们来模拟50个线程,每个线程对计数器递增100万次,最终结果应该是5000万我们使用4中方式实现,看一下其性能,然后引出为什么需要使用LongAdder,LongAccumulator。方式1:synchronized方式实现public class Demo1 { static int count =
2020-12-22 13:18:50
338
转载 22.线程系列- 获取线程执行结果的方式
在一个线程中需要获取其他线程执行的结果,能想到几种方式?各有什么优缺点?结合这个需求,我们使用6中方式,来对之前学过的知识点做一个回顾,加深记忆。方式1:Thread的join方法实现代码:public class Demo1 { //用于封装结果 static class Result<T> { T result; public T getResult() { return result;
2020-12-22 10:49:24
905
转载 21.线程系列- JUC工具类CompletableFuture
CompletableFuture是java8新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类CompletionStage接口CompletionStage代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段 一个阶段的计算执行可以是一个Function,Consumer或者Runnable。比如:stage.thenApply(x -> square(x)).thenAccept(x -> System.out.print(x)
2020-12-21 18:31:30
282
转载 20.线程系列- 高并发中常见的限流方式(并发控制,漏桶,令牌桶(RateLimiter))
本文内容介绍常见的限流算法 通过控制最大并发数来进行限流 通过漏桶算法来进行限流 通过令牌桶算法来进行限流 限流工具类RateLimiter常见的限流算法通过控制最大并发数来进行限流 通过漏桶算法来进行限流 通过令牌桶算法来进行限流通过控制最大并发数来进行限流以秒杀业务为例,100万人抢购,100万人同时发起请求,最终能抢到的人也就是前面几个人,后面的基本上都没有希望。那么我们可以通过控制并发数来实现,比如并发控制在10个,其他超过并发数的请求全部拒绝,提示秒杀失败,请稍后重试。
2020-12-21 16:26:27
700
转载 19.线程系列- 实战篇,接口性能的简单提升
案列讲解电商app都有用过吧,商品详情页,需要给他们提供一个接口获取商品相关信息:1,商品基本信息(名称,价格,库存,会员价格等)2,商品图片列表3,商品描述信息等等数据库中我们用了3张表存储上面的信息: 商品基本信息表:t_goods(字段:id【商品id】、名称、价格、库存、会员价格等) 商品图片信息表:t_goods_imgs(字段:id、goods_id【商品id】、图片路径),一个商品会有多张图片 商品描述信息表:t_goods_ext(字段:id,g
2020-12-21 14:10:22
124
转载 18.线程系列- JUC中的阻塞队列
本文内容掌握Queue,BlockingQueue接口中常用的方法 介绍6种阻塞队列,以及相关场景示例 重点掌握4种常用的阻塞队列Queue接口队列是一种先进先出FIFO的数据结构,java中用Queue接口来表示队列Queue接口中定义了6个方法:public interface Queue<E> extends Collection<E> { boolean add(e); boolean offer(E e); E remove(
2020-12-21 13:53:37
129
转载 17.线程系列- ThreadLocal、InheritableThreadLocal(通俗易懂)
本文的内容需要解决的问题 介绍ThreadLocal 介绍InheritableThreadLocal需要解决的问题目前java开发web系统一般有3层,controller,service,dao,请求到达controller。controller调用service,service调用dao,然后进行处理我们写一个简单的列子,有3个方法分别模拟controller,service,dao。代码如下:public class Demo { static AtomicInte
2020-12-21 09:53:42
145
转载 16.线程系列- JUC中原子类
本文主要内容JUC中的原子类介绍 介绍基本类型原子类 介绍数组类型原子类 介绍引用类型原子类 介绍对象属性修改相关原子类预备知识JUC中的原子类都是依靠volatile,cas,Unsafe类配置来实现的,需要了解的请看之前的线程系列的文章,都有详解JUC中原子类介绍什么是原子操作?atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作
2020-12-18 11:09:51
181
转载 15.线程系列- JUC底层工具类Unsafe
本文的内容Unsafe基本介绍 获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线程调度先关方法介绍 park和unpark示例 Unsafe锁示例 Unsafe中对volatile的支持基本介绍最新我们一直在学习java高并发,java高并发中主要涉及到类位于juc包中,juc中大部分类都是依赖于Unsafe来实现的,主要用到了Unsafe中的CAS,线程挂起,线程恢复等相关功能。所以如果打算深入了解juc原理,必须先了解Unsa
2020-12-17 16:20:51
87
转载 14.线程系列- CAS,你需要知道的东西
本文主要内容从网站计数器实现中一步步引出CAS操作 介绍java中CAS以及CAS可能存在的问题 悲观锁和乐观锁的一些介绍以及数据库乐观锁的一个常见示例 使用java中的原子操作实现网站计数器功能我们需要解决的问题方式1:需求:我们开发了一个网站,需要对访问量进行统计,用户每次发一次请求,访问量+1,如何实现?下面我们来模仿有100个人同时访问,并且每个人对网站发起10次请求,最后总访问次数应该是1000次。我们实现访问如下:public class demo1 {
2020-12-17 14:55:51
123
转载 13.线程系列- JUC中的Executor详解2
本文的内容ExecutorCompletionService出现的背景 介绍CompletionService接口以及常见的方法 介绍ExecutorCompletionService类以及其原理 实例:执行一批任务,然后消费执行结果 实例:异步执行一批任务,有一个完成则立即返回,其他取消需要解决的问题举个例子:买新房了,然后在往下下单买冰箱,洗衣机,电器商家不同,所以送货耗时不一样,然后等他们送货,快递只愿意送到楼下,然后我们自己将其搬到家中。public class Demo
2020-12-17 11:00:19
118
转载 12.线程系列- JUC中的Executor详解1
Executors框架介绍Executor框架主要包含3部分内容:任务相关的:包含被执行的任务要实现的接口:Runnable接口或Callable接口 任务执行相关的:包含任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架中有两个关键的类实现了ExecutorService接口:ThreadPoolExecutor和ScheduleThreadPoolExecutor 异步结算结果相关的:包含接口Future和实现Futu
2020-12-16 16:40:51
241
转载 11.线程系列- 线程池
什么是线程池大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁。数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的。每个数据库操作之前都需要创建连接,为了提升系统性能,后来出现了数据库连接池,系统启动的时候,先创建很多连接放在池子里面,使用的时候,直接从连接池中获取一个,使用完毕之后返回到池子里面,继续给其他需要者使用,这其中就省去创建连接的时间,从而提升了系统整体的性能。线程池和数据库连接池的原理也差不多,创建线程去
2020-12-16 14:56:58
246
转载 10.线程系列- JUC中的CyclicBarrier
CyclicBarrier简介CyclicBarrier通常称为循环屏障。它和CountDownLatch很相似,都可以使线程先等待然后再执行。不过CountDownLatch是使一批线程等待另一批线程执行完后再执行;而CyclicBarrier只是使等待的线程达到一定数目后再让它们继续执行。故而CyclicBarrier内部也有一个计数器,计数器的初始值在创建对象时通过构造参数指定,如下所示:public CyclicBarrier(int parties) { this(parties
2020-12-15 18:20:18
111
转载 36.spring系列- 事务失效的原因
事务失效的常见7中情况未启动spring的事务方法不是public类型的数据源未配置事务管理器自身调用问题异常类型错误异常被吞了业务和spring事务代码没在一个线程中1.未开启spring事务@EnableTransactionManagement 注解用来启用spring事务自动管理事务的功能2.方法不是public类型的@Transaction 可以用在类上,接口上,public方法上3.数据源未配置事务管理器spring是通过事务管理器来管理事务的,要注意为每个数据源配
2020-12-07 11:15:00
363
转载 9.线程系列- JUC中的Semaphore
Semaphore常用场景:限流举个例子:比如有个停车场,有5个空位,门口有个门卫,手中5把钥匙分别对应5个车位上面的锁,来一辆车,门卫会给司机一把钥匙,然后进去找到对应的车位停下来,出去的时候司机将钥匙归还给门卫。停车场生意比较好,同时来了100两车,门卫手中只有5把钥匙,同时只能放5辆车进入,其他车只能等待,等有人将钥匙归还给门卫之后,才能让其他车辆进入。上面的例子中门卫就相当于Semaphore,车钥匙就相当于许可证,车就相当于线程Semaphore主要方法Semaphore(int pe
2020-11-09 14:12:50
213
转载 8.线程系列- JUC中等待多线程完成的工具类CountDownLatch
本片内容介绍CountDownLatch及使用场景提供几个示例介绍CountDownLatch的使用手写一个并行处理任务的工具类假如有这样一个需求,当我们需要解析一个Excel里多个shee的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要统计解析总耗时。分析一个:解析每个sheet耗时可能不一样,总耗时就是最长耗时的那个操作。我们能够想到的最简单的做法是使用join,代码如下:public class ThreadDemo13 {
2020-11-09 11:12:51
178
转载 7.线程系列- JUC中的LockSupport工具类
本文主要内容讲解3中让线程等待和唤醒的方法,每种方法配合具体的实例介绍LockSupport主要用法对比3中方式,了解他们之间的区别LockSupport位于juc包下,算是juc中一个基础类,juc中很多地方都会使用LockSupport关于线程等待、唤醒的方法,前面的文章中我们已经讲过2种了:使用Object中的wait(),notify()方法让线程等待,唤醒使用juc包中的Condition的await(),signal()方法唤醒线程使用Object类中的方法实现线程等待和
2020-11-06 14:54:21
110
转载 6.线程系列- JUC中的Condition对象
Condition使用简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Objetc的几个方法,比如wait(),notify(),notifyAll()几个方法实现等待或通知机制,同样的,在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,前者是java底层级别的,后者是语言级别的,具有更高的可控制性
2020-11-05 17:32:25
315
1
转载 35.spring系列- ConfigurationClassPostProcessor Spring的重要后置处理器
疑惑@Configuraction注解的作用是什么,Spring是如何解析加了@Configuraction注解的类Spring在什么时候对@ComponentScan,@ComponentScans注解进行了解析Spring什么时候解析了@Import注解,如何解析的Spring什么时候接卸了@Bean注解?作用ConfigurationClassPostProcessor 是一个BeanFactory的后置处理器,因此它的主要功能是参与BeanFactory的建造。在这个类中,会解析加
2020-11-04 16:37:56
145
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人