数据库 | 001-MySQL梳理系列(一)
MySQL基本组成 SQL执行流程 Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数、存储过程、触发器、视图等,其实就是所有跨存储引擎的功能都是在这一层实现的 存储引擎层,主要负责数据的存储和读取,是以插件的形式存在的 ,支持如 InnoDB 、MyISAM、Memory 等多个存储引擎,现在默认为 InnoDB 查询缓存 当一个SQL执行时首先会进入查询缓存 查看之前是否执行过该语句,如果执行过则会以key-value的形式保存在缓存中,key是查询语句,value是查询结果 如果缓存命中则直接返回结果,如果查询语句不在缓存中继续后面的流程 大多数情况下我们不推荐使用查询缓存,因为缓存失效非常频繁,只要一个更新,那么这个表上所有的缓存都会失效,吐过数据的更新比较多,那么缓冲命中的效率很低,不断的在失效 在MySQL中提供了参数 query_cache_type 参数来设置,默认是 DEMAND ,表示对默认的SQL都不使用查询缓存,如果要对特的语句进行缓存查询,则可以使用 SQL_CACHE 来显示的 ...
数据库 | 000-🗜Sysbench数据库压力测试工具
sysbench 是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下操作都将以支持MySQL数据库为例进行。 1. Linux 上安装 sysbench 工具 安装方式有两种,一种是通过 yum/apt 等来安装,另一种自己下载源码包来安装,笔者这里采用的是centos , 采用yum 安装 sysbench 的源码包下载地址: http://sourceforge.net/projects/sysbench ,采用源码安装的可转这里 通过 yum 安装如下: 设置 yum repo 仓库 curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash 安装 sudo yum -y install sysbench 安装完检查是否成功 sysbench –version 2. 数据库测试用例准 ...
JVM专题 | 001-堆栈检查利器jstat的使用
jstat 可以检查 JVM 整体的运行情况,可以看到 新生代,老年代等的内存使用情况,以及GC 次数和耗时 命令格式 如 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] 其中 -option 必选参数表示命令参数 如 gc 等, -t 为可选参数表示是否打印时间(秒),-h<lines> 可选参数,表示每隔多少行打印头部列表,如设置 -h 5 , 那么每五条记录就会重新打印表头,vmid 必选参数,Java 进程id,interval 可选参数表示采样的时间间隔,count 可选参数表示需要采样多少条, jstat -gc pid jstat -gc pid 这是最常用的语法,可以直接查看内存和垃圾回收情况 首先我们要获得Java 进程的 PID 信息,可以通过 jps 命令来获取 之后执行 jstat -gc pid 即可看到对应 Java 进程的内存情况,如下: 这里说明一下关于这些列名的含义: S0C : 新生代中第 ...
数据结构 | 000-顺序栈与链式栈的图解与实现
栈是一种特殊的线性表,它与线性表的区别体现在增删操作上 栈的特点是先进后出,后进先出,也就是说栈的数据操作只能发生在末端,而不允许在中间节点进行操作 如上图所示,对栈的增删操作都只能在末端也就是栈顶操作, 栈既然是线性表那么就存在表头和表尾,不过在栈结构中,对其都进行限制改造,表尾用来输入数据也叫做栈顶(top), 相应的 表头就是栈底(bottom),栈顶和栈顶是两个指针用来表示这个栈 与线性表类似,栈也是又顺序表示和链式表示,分别称作顺序栈和链栈 栈的基本操作 如何通过栈这个后进先出的线性表,来实现增删查呢? 初始时,栈内没有数据,即空栈。此时栈顶就是栈底。 当存入数据时,最先放入的数据会进入栈底。接着加入的数据都会放入到栈顶的位置。 如果要删除数据,也只能通过访问栈顶的数据并删除。对于栈的新增操作,通常也叫作 push 或压栈。 对于栈的删除操作,通常也叫作 pop或出栈。对于压栈和出栈,我们分别基于顺序栈和链栈来分析 顺序栈 顺序栈即就是顺序存储元素的,通常顺序栈我们可以通过数组来实现,将数组的首元素放在栈底,最后一个元素放在栈顶,之后指定一个 top 指针指向栈 ...
并发编程 | 009-CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的详细解析
本文主要介绍和对比我们常用的几种并发工具类,主要涉及 CountDownLatch 、 CyclicBarrier 、 Semaphore 、 Exchanger 相关的内容,如果对多线程相关内容不熟悉,可以看笔者之前的一些文章: 《Java并发编程-线程基础》 《总算把线程六种状态的转换说清楚了!》 《[高频面试]解释线程池的各个参数含义》 《知道线程池的四种拒绝策略吗?》 《java中常见的六种线程池详解》 《基于synchronized的锁的深度解析》💡推荐 《JAVA中常见的阻塞队列详解》 《优雅关闭线程池的方案》 介绍 CountDownLatch 、CyclicBarrier 两者的使用与区别,他们都是等待多线程完成,是一种并发流程的控制手段, 介绍 Semaphore、Exchanger 的使用,semaphore 是信号量,可以用来控制允许的线程数,而 Exchanger 可以用来交换两个线程间的数据。 CountDownLatch CountDownLatch 是 JDK5 之后加入的一种并发流程控制工具,它在 java.util.concurrent 包 ...
并发编程 | 008-优雅的关闭线程池方案
我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去关闭,这其实是存在非常大的风险的,大量的线程常驻在后台对系统资源的占用是巨大的 ,甚至引发异常。所以在我们平时使用线程池时需要注意优雅的关闭,这样可以保证资源的管控。 在 Java 中和关闭线程池相关的方法主要有如下: void shutdown() List<Runnable> shutDownNow boolean awaitTermination boolean isShutDown boolean isTerminated 对于这些方法有着不同的使用和作用,下面我们真的会这些不同的方法做详细的介绍。 ShutDown shutDown 方法从字面意思我们可以看到是停止关闭的意思,我们先来看下面的一段代码,首先我们通过 ThreadPoolExecutor 来创建一个容量是10的无界线程池,与 FixedThreadPool 类似的,这里手动创建可以更好地理解线程池的创建。在后我们提交一千个任务执行,再执 ...
并发编程 | 007-JAVA中常见的阻塞队列详解
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事。 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JDK5 中加入的 。 BlockingQueue 阻塞队列是线程安全的,在我们业务中是会经常频繁使用到的,如典型的生产者消费的场景,生产者只需要向队列中添加,而消费者负责从队列中获取。 如上图展示,我们生产者线程不断的put 元素到队列,而消费者从中take 出元素处理,这样实现了任务与执行任务类之间的解耦,任务都被放入到了阻塞队列中,这样生产者和消费者之间就不会直接相互访问实现了隔离提高了安全性。 并发队列 上面是 Java 中队列Queue 类的类图,我们可以看到它分为两大类,阻塞队列与非阻塞队列 阻塞队列的实现接口是 BlockingQueue 而非阻塞队列的接口是 ConcurrentLinkedQueue , 本文主要介绍阻塞队列,非阻塞队列不再过多阐述 BlockingQueue 主要有下面六个实现类,分别是 ArrayBlockingQueue、LinkedBl ...
并发编程 | 006-基于synchronized锁的深度解析
1. 问题引入小伙伴们都接触过线程,也都会使用线程,今天我们要讲的是线程安全相关的内容,在这之前我们先来看一个简单的代码案例。代码案例: 1234567891011121314151617181920212223242526272829303132333435/** * @url: i-code.online * @author: AnonyStar * @time: 2020/10/14 15:39 */public class ThreadSafaty { //共享变量 static int count = 0; public static void main(String[] args) { //创建线程 Runnable runnable = () -> { for (int i = 0; i < 5; i++) { count ++; try { Thread.sleep(1); ...
并发编程 | 005-常见的六种线程池
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如下 线程池名称 描述 FixedThreadPool 核心线程数与最大线程数相同 SingleThreadExecutor 一个线程的线程池 CachedThreadPool 核心线程为0,最大线程数为Integer. MAX_VALUE ScheduledThreadPool 指定核心线程数的定时线程池 SingleThreadScheduledExecutor 单例的定时线程池 ForkJoinPool JDK 7 新加入的一种线程池 在了解集中线程池时我们先来熟悉一下主要几个类的关系,ThreadPoolExecutor 的类图,以及 Executors 的主要方法: 上面看到的类图,方便帮助下面的理解和查看,我们可以看到一个核心类 ExecutorService , 这是我们线程池都实现的基类,我们接下来说的都是它的实现类。 ...
并发编程 | 004-知道线程池的四种拒绝策略吗?
在之前的文章中我们知道了线程池各个参数的含义,其中有个参数 handler 我们说了是拒绝策略,具体关于线程池的拒绝策略我们这篇文章来分析 首先我们要理解线程池的拒绝策略的作用,它是用来处理当线程池无法继续处理更多的任务时的处理机制,那么首先我们要知道拒绝策略的触发时机,我么们来看下面代码: 123456789ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 2, 1, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardOldestPolicy() ); ...