Mysql 执行流程和日志系统
Mysql 执行流程和日志系统一、Mysql 逻辑架构这里先拿一张图来简单说明一下
客户端层: 负责连接处理、授权认证、安全服务等功能的处理
核心服务层: 查询解析、分析、优化、调用内置函数等等。所有的跨存储引擎功能也在这一层实现:存储过程、触发器、视图等等
存储引擎: 负责MySQL中的数据存储和提取。中间的服务层通过API与存储引擎通信,屏蔽了不同存储引擎实现上的差异
二、执行流程
1. 客户端/服务端通信协议
在任一时刻, 要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。
一旦一端开始发送消息,另一端要接收完整个消息才能响应它。
服务端响应客户端请求时,客户端必须接收整个返回结果。
因此在实际开发中,应该尽量保持查询简单且只返回必须的数据,这也是查询中尽量避免使用 SELECT * 和 LIMIT 的原因之一。
2. 查询缓存
在查询缓存打开的情况下,解析一个查询语句的时候,MySQL会先检查这个查询缓存是否命中查询缓存中的数据。
如果当前查询恰好命中查询缓存,在检查用户权限之后,会直接返回缓存中的结果, ...
Mysql 锁机制
Mysql 锁机制根据上面一篇文章,我们可以知道:当发生了读-写和写-读 问题的时候,innodb 是通过 MVCC 和 undo log 实现了在不加锁的情况下的事务隔离,保证了数据安全的同时也提高了并发性能。
那么这里我们提到的锁机制 就是来解决 写-写 问题。
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
一、全局锁1. 加锁顾名思义,全局锁就是对整个数据库实例加锁。
MySQL 提供了一个加全局读锁的方法,命令是
1Flush tables with read lock (FTWRL)。
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:
数据更新语句(数据的增删改)
数据定义语句(包括建表、修改表结构等)
更新类事务的提交语句。
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
2. 逻辑备份以前有一种做法,是通过 FTWRL 确保不会有其他线程对数据库做更新,然后对整个库做备份。
注意,在备份过程中整个库完全处于只读状态。但是让整库都只读,听上去就很 ...
Mysql 隔离级别与MVCC
Mysql 隔离级别与MVCC
以下内容都是基于 5.7 的 MySQL 的 innode 的存储引擎
一、问题的出现
读-读:没有并发问题
读-写:会造成数据不一致
写-写:造成数据丢失问题
很明显在两个事务同时读操作,是不存在线程并发安全问题。但当一旦开始出现了写操作,那么就会开始干扰另一个事务了。
为了解决 读-写 和 写-写 这两个场景下的问题,innodb 引入了 MVCC 和 锁机制 来保证事务的隔离
二、隔离级别这里我们引入一个场景再来看看事务的隔离级别
12create table T(c int) engine=InnoDB;insert into T(c) values(1);
事务A
事务B
启动事务
查询得到结果 1
启动事务
查询得到结果 1
将 1 改成 2
查询得到值 a
提交事务
查询得到值 b
提交事务
查询得到值 c
在不同隔离级别下 a b c 的值:
读未提交 Read UnCommitted:
a:2
b:2
c:2
事务A 总是能直接读到 事务B 未提交的 ...
数据库四大性质和隔离等级
数据库四大性质和隔离等级一、四大性质:ACID
如果想要说明一个数据库或者一个框架支持事务性操作,则必须要满足下面的四大特性:
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
1. 原子性(Atomicity)
事务包含的所有操作要么全部成功,要么全部失败回滚。
失败回滚的操作事务,将不能对事物有任何影响。
2. 一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
数据库状态如何变化?
每一次数据变更就会导致数据库的状态迁移。
如果数据库的初始状态是C0,第一次事务T1的提交就会导致系统生成一个SYSTEM CHANGE NUMBER(SCN),这是数据库状态从C0转变成C1。
执行第二个事务T2的时候数据库状态从T1变成T2
以此类推,执行第Tn次事务的时候数据库状态由C(n-1)变成Cn。
一致性可以从一致读和一致写两个方面来理解。
一致读 事务读取数据只能从一个状态中读取,不能从2个 ...
HashMap、HashTable和ConcurrentHashMap
HashMap、HashTable和ConcurrentHashMap一、接口和继承
HashMap:继承于 AbstractMap类
ConcurrentHashMap:继承于AbstractMap类
HashTable:继承于Dictionary类,自己实现了Map接口
根据jdk中的注释我们可以看出Dictionary已经是一个历史遗留的集合抽象类:
注意:这个类已经过时了。 新的实现应该实现 Map 接口,而不是扩展这个类。
Hashtable类与HashMap类的作用一样,实际上,它们拥有相同的接口。与Vector类的方法一样。Hashtable的方法也是同步的。如果对同步性或与遗留代码的兼容性没有任何要求,就应该使用HashMap。如果需要并发访问,则要使用ConcurrentHashMap。
二、ConcurrentHashMap 的 put方法123public V put(K key, V value) { return putVal(key, value, false);}
123456789101112131415161718 ...
HashMap源码解析
HashMap源码解析作为面试必问的hashmap,我们今天来一起来探究一下他的源码。这里先贴一张 hashmap 的内部类和部分方法函数
一、什么是 哈希, 哈希函数(散列函数)
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
上面是百度百科的解释。我们可以简单的概括为
hash 就是将 任意的输入 通过 一种 特殊的算法 变成 长度固定 的输出。
可以类似于一种摘要算法,获取我们输入内容的特征来生成一个简短的摘要
由于算法可以保证:相同的输入每次都是可以得到相同的输出,即hash值
但是也会发生:不同的输入哈希之后会得到相同的结果 即 哈希冲突
object 中的 hashcode 方法1public native int hashCode();
方法本身是 na ...
源码环境搭建
源码环境搭建为什么要读源码
还记得之前有一次面试,面试官上来就直接开始问:
你看过 JDK 源码吗
作为一名的开发人员,学习源码是我们在技术成长的道路上不可或缺的一步。在源码的翻阅学习和探究中,你将会
知晓和熟悉底层的代码逻辑原理
理解代码的设计思路和设计原因
培养抽象封装的代码思维
以此来更好的服务于上层的业务逻辑需求
面试必问(那不得好好学)
而作为一份经历过多次的迭代积累以及无数业务场景考验的基石,更是值得我们深入的去学习。
虽然我们平时也是可以在idea中跟进源码,进行翻阅查看,但是由于做了保护,我们是无法对其修改和添加注释的,所以我们这里将源码单独拿出来作为一个项目工程,可以更方面我们的总结学习。
环境搭建获取源码其实我们不用去网上下载源码,重要你的电脑下载安装过 JDK 环境,那么你的电脑上就有一份打包好的源码。
找到你本地的 jdk 安装目录,如果忘记了可以去看一下之前设置的环境变量
将这个压缩包拷贝出来,解压后导入到idea工程里面就可以了
一些常用的包
java.lang:语言包
object类
数据类型包装类
数学工具类 Math
字符串类
系统和运行时类 ...
Spring 中的9种设计模式
Spring 中的9种设计模式一、简单工厂实现方式BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获取Bean对象,但是否在传入参数后创建还是传入参数前创建这个要根据具体情况来定
实质由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类
实现原理Bean容器的启动阶段
读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。
然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。
将BeanDefinition注册到了beanFactory之后,在这里Spring为我们提供了一个扩展的接口,允许我们通过实现接口BeanFactoryPostProcessor 在此处来插入我们定义的代码。
典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的。
容器中bean的实例化阶段实例化阶段主 ...
JAVA 排序算法
JAVA 排序算法一、冒泡排序(Bubble Sort)1. 算法简介冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2. 算法描述
比较相邻的元素。如果第一个比第二个大,就交换它们两个;
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
3. 动态演示
4. 代码实现1234567891011121314public static int[] bubbleSort(int[] array){ if(array.length > 0){ for(int i = 0;i<array.length;i++){ for(int j = 0;j<array.length - ...
使用 frp 搭建内网穿透
使用 frp 搭建内网穿透一、什么是 frp通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:
客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
代理组间的负载均衡。
端口复用,多个服务通过同一个服务端端口暴露。
多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
服务端和客户端 UI 页面。
在办公室访问家里的电脑,反之亦然
自己电脑上的项目,方便发给客户朋友演示。比如我做了个小网站,发给朋友看看未上线版本,发个url给他就好了。
调试一些需要远程调用的程序,远程调用比如微信的API 回调接口。
二、服务端搭建
https://github.com/fatedier/frp/releases 下载对应安装包
修改配置文件 frps.ini
123456[common]bind_ ...