自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

哼哼的博客

学习日记,大牛养成日记

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

原创 数据结构算法系列3-排序算法

1. 冒泡排序从数组头开始,比较相邻的元素。如果第一个比第二个大(小),就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到尾部的最后一对,这样在最后的元素应该会是最大(小)的数;重复步骤1~2,重复次数等于数组的长度,直到排序完成。public static void sort(int[] array) { if (array.length == 0) ...

2019-06-11 00:09:18 280

原创 数据结构算法系列2-图

图是由顶点(vertex)和边(edge)组成的一种结构。顶点的集合V,边的集合是E,所以图记为G = (V,E)。有向图是边有方向,无向图是边之间没有方向。无向图顶点的边数叫度,有向图顶点的边数叫出度和入度。连通图是图的任意两个顶点都有路径可达。如果图的边有值,成为权值。图一般在程序中用矩阵,也就是数组表示。1.图的深度优先遍历访问顺序是: A -> C -> B -&gt...

2019-06-10 21:27:20 256

原创 数据结构算法系列1-哈夫曼树、AVL树、红黑树

1. 树的定义树是由N个结点构成的有限集合,每个节点都有0个或者多个互不相交的树,称为结点的子树。结点的度:结点的子树个数树的度:树中所有结点中最大的度叶结点:度为0的结点父结点:有子树的结点是其子树的根结点的父结点子树是不相交的2. 二叉树度为2的树,子树有左右顺序之分。3. 哈夫曼树一棵二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffman ...

2019-06-10 16:12:50 823

原创 mysql性能优化系列9-分库分表mycat

1. 分库分表如果在数据库中表的数量达到了一定的量级, 则需要进行分表, 分解单表的大数据量对索引査询带来的压力,方便对索引和表结构的变更 。如果数据库的吞吐量达到了瓶颈,就需要增加数据库实例,利用多个数据库实例来分解大量的数据库请求带来的系统压力。分库分表就是将一个表分为多个表, 这些表可以放在同一个库里, 也可以放到不同的库里, 甚至可以放在不同的数据库实例上。(1)单实例单库单库单...

2019-05-22 00:09:57 943 1

原创 mysql性能优化系列8-mysql集群

1. 为什么要使用集群(1)可用性单个数据库实例宕机,其他的数据库实例可提供服务,对业务来说基本无感知。同时数据在多个实例之间的复制,提高数据的安全性和可用性。(2)提高性能业务对数据的访问可以分散到不同的数据库实例上,比如读写分离降低单个数据库实例的访问压力。2. 集群方案(1)MySQL ClusterMysql本身提供,优势:可用性和性能非常好。每份数据至少可在不同主机存一份拷...

2019-05-21 11:35:00 1216 1

原创 mysql性能优化系列7-索引与执行计划

1. 索引1.1 索引分类(1)主键索引根据主键建立索引,不允许重复,不允许空值(2)唯一索引索引的列值必须唯一,允许空值(3)普通索引普通列构建的索引,无限制(4)全文索引用大文本对象的列构建的索引(5)组合索引多个列组合构建索引,每个列不允许有空值。组合索引遵循最左前缀原则1.2 实现原理MySQL数据库支持多种索引类型。(1)哈希索引只有memory存储引擎支持...

2019-05-20 21:11:56 377

原创 mysql性能优化系列6-慢查询

1.慢查询慢查询日志是mysql用来记录执行时间超过long_query_time参数设定的时间阈值的SQL语句。默认慢查询日志是关闭的。1.1 慢查询配置slow_query_log:打开、关闭慢查询日志slow_query_log_file:慢查询日志的存储路径及文件(默认和数据文件放一起)long_query_time:慢查询SQL执行时间得伐值,默认10秒log_querie...

2019-05-19 23:22:39 240

原创 mysql性能优化系列5-三大范式

1. 三大范式(1)第一大范式数据库表中的所有字段都只具有单一属性,单一属性的列是由基本数据类型所构成。(2)第二大范式表中只具有一个业务主键,也就是说不能存在非主键列只对部分主键的依赖关系。(3)第三大范式每一个非主键列既不部分依赖于也不能传递依赖于业务主键,也就是在第二范式的基础上相处了非主键对主键的传递依赖。2. 反范式化设计反范式化是针对范式化而言得,是为了性能和读取效率得...

2019-05-19 20:29:27 227

原创 mysql性能优化系列4-在线修改表结构

修改表结构会导致表锁,数据量大修改数据很长,导致大量操作阻塞。解决方案:可以使用pt-online-schema-change,它的大致过程为:首先创建一个和原表一样的空的表结构修改表结构,copy原表中的数据到新表在原表上创建一个触发器在数据copy的过程中,将原表的更新操作全部同步到新表中copy完成之后,用rename table 新表代替原表,默认删除原表。...

2019-05-19 17:56:23 284

原创 mysql性能优化系列3-锁和事务

1. 锁分类表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发度最低。适合于以查询为主,只有少量按索引条件更新数据的应用。行级锁:开销大,加锁慢,会出现死锁。锁定粒度最小,发生锁冲突的概率最低,并发度也最高。适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁。锁定粒度界于表锁和行锁之间,并发度一...

2019-05-19 17:52:14 243

原创 mysql性能优化系列2-mysql引擎

MySQL中数据以各种不同的方式存储在文件或者内存中。这些不同的方式以及配套的相关功能被称作存储引擎或者表类型。1. MyISAMmysql5.5之前默认的存储引擎,它不支持事务,也不支持外键,但是访问速度快。只支持表级锁,支持全文索引。(1)存储文件以MyISAM为引擎的表在磁盘上存储成3个文件,扩展名分别为frm、MYD、MYI。.frm:存储表定义MYD:存储表数据MYI:存...

2019-05-19 15:39:06 342

原创 mysql性能优化系列1-mysql架构

1. mysql性能指标mysql性能中有两个重要性能指标:TPS和QPS。(1)TPSTPS(Transactions Per Second)是指服务器每秒处理的事务数。不过有的存储引擎不支持事务,无法用这个指标衡量。(2) QPSQPS(Queries Per Second)是指每秒查询处理量。(3)等待时间(UPTIME)指执行Sql语句等待返回结果之间的等待时间TPS = ...

2019-05-18 13:25:11 144

原创 Netty系列10-客户端源码分析

客户端的流程和服务端的大致相同,在服务端分析过的这里不再分析,看这篇文章前可以先看下服务端源码分析的文章。先大致看下客户端的代码。 public void start() throws InterruptedException { EventLoopGroup group = new NioEventLoopGroup();/*线程组*/ try { ...

2019-05-17 00:22:24 268

原创 Netty系列9-服务端源源码分析

1. 服务端源码分析我们以一个入门级别的服务端代码进行分析,这里对代码添加编号注释。这里先有个概念,netty其实就是对原生的java nio编程进行了封装,所以整个过程的分析就本质就是找netty是怎么封装的。 /*线程组*/ EventLoopGroup group = new NioEventLoopGroup();//1 EventLoopGroup w...

2019-05-16 12:34:08 204

原创 Netty系列8-服务器推送

一般客户端和服务端交互是由客户端发起一个请求,服务端回答响应。但有时候服务端需要主动的推送数据,比如视频、弹幕、新闻实时刷新等,这时候就用到了服务器推送技术。1.Ajax短轮询Ajax短轮询就是前端通过ajax不断向服务端发送请求,这种方式最简单但是性能最低,尤其在服务端未使用netty等高性能框架下。客户端代码样例:function showTime(){…//发送请求setInte...

2019-05-14 19:56:22 1506

原创 Netty系列7-编解码器

编码器是将消息转换为适合于传输的格式,一般是二进制;而对应的解码器则是将网络字节流转换回应用程序的消息格式。因此,编码器操作出站数据,而解码器处理入站数据。我们上一篇文章解决粘包拆包用到的也是编解码器。1. 解码器解码器是负责将入站数据从一种格式转换到另一种格式的,所以解码器实现ChannelInboundHandler。Netty提供了丰富的解码器抽象基类,主要分两类:1.1 将字节解码为...

2019-05-13 23:58:19 467

原创 Netty系列6-TCP粘包拆包

(1)TCP粘包拆包现象假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下5种情况。服务端分两次读取完数据,第一次读到D1,第二次读到D2,这里没有粘包和拆包;服务端一次性读取完数据,D1和D2粘合在一起,这里发生TCP...

2019-05-13 18:58:05 565

原创 Netty系列5-netty介绍

1.netty的组件1.1 ChannelChannel 是 NIO 基本的结构。官方解释:它代表了一个用于连接到实体如硬件设备、文件、网络套接字或程序组件,能够执行一个或多个不同的 I/O 操作(例如读或写)的开放连接。简单的来说Channel就是通信的载体,通过客户端和服务端通过它进行通信、读写数据。1.2 CallbackCallback就是回调,回调在java中很常见,通常是提供...

2019-05-13 10:53:32 332

原创 Netty系列4-buffer

(1)bufferNIO通信中数据不会和通道直接交互。对于读来说,数据总是先从通道读到缓冲,应用程序再读缓冲的数据。对于写,数据也是先写入缓冲,再通过通道把缓冲的数据发送出去。缓冲区本质上是一块可以读写的内存,这块内存被包装成NIO Buffer对象,并提供了一组方法来访问该内存。(2)重要属性capacity:Buffer内存块的大小。一旦Buffer满了,需要将其清空(通过读数据或者...

2019-05-11 23:59:42 356

原创 Netty系列3-BIO、AIO、NIO

客户端和服务端通信本质上就是服务端监听端口,客户端发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字socket进行通信。根据通信实现方式的不同又分为BIO、AIO、NIO三种。1.BIOBIO是同步阻塞模型。通常由一个Acceptor线程监听客户端的连接,接收到连接请求后为每个客户端都创建一个新线程进行处理,最后将响应通过输出流返回给客户端,线程销毁。BIO最大的缺点...

2019-05-11 22:47:31 290

原创 Tomcat系列4-内嵌Tomcat

我们在前边几篇文章分析了tomcat的初始化和启动流程,现在看下springboot等内嵌的tomcat是怎么启动的。1.Tomcat7RunnerCli内嵌tomcat的入口是在Tomcat7RunnerCli,看下它的main方法。public static void main( String[] args ) throws Exception { ...

2019-05-11 10:04:50 743

原创 Tomcat系列3-启动阶段源码分析

Tomcat的初始化流程结束后,就进去Tomcat各组件启动流程。初始化方法是在Bootstrap的main方法中的daemon.load(args),启动就是它后续的 daemon.start()。这个方法调用的是Catalina的start方法。1.Catalina public void start() { log.info("Catalina--------start...

2019-05-10 17:20:42 194

原创 Tomcat系列2-初始化阶段源码分析

从Tomcat的启动脚本中可以看出Tomcat的入口是Bootstrap类的main方法。1.Bootstrap类main方法 public static void main(String args[]) { if (daemon == null) { // Don't set daemon until init() has comple...

2019-05-09 14:54:13 177

原创 Tomcat系列1-配置文件

tomcat配置文件目录是conf目录,主要配置文件有5个,下面一个个分析下。1.context.xmlContext.xml是Tomcat公用的环境配置,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。不同于server.xml 文件是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加...

2019-05-07 19:11:15 2389

原创 Mybatis系列9-mybatis插件源码分析

mybatis的插件开发使用了责任链模式,老规矩先介绍设计模式。1. 责任链模式责任链模式(Chain of Responsibility Pattern)为请求创建了一个处理请求的链。这个请求由责任链中的处理器一个接一个的处理。责任链中的角色:Handler:处理请求的标准接口ConcreteHandler:具体的处理者,并将请求转发给它的后继者client :发起请求的客户端...

2019-05-06 23:01:37 121

原创 Mybatis系列8-mybatis和spring结合分析

我们之前使用的时候创建SqlSessionFactory、加载配载文件等步骤都是手动代码执行的,和spring集合后这些都可以托管给spring自动执行。mybatis和spring结合的时候主要依赖三个类SqlSessionFactoryBean、MapperFactoryBean、MapperScannerConfigurer。1.SqlSessionFactoryBean看这个类名可以...

2019-05-06 20:46:27 117

原创 Mybatis系列7-核心主流程分析

在前面的文章中,写了一个mybatis样例执行了一次查询,大致分为四步:加载配置文件、获得session、获得Mapper对象、执行查询。1.配置文件加载老规矩由于配置文件加载时候用到了建造者模式,先介绍下这个设计模式。1.1 建造者模式建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方...

2019-05-06 08:13:28 474

原创 Mybatis系列6-对象的创建和赋值

mybatis从数据库查出数据来后,需要创建实体对象并设值,然后返回。这个过程是通过JDK的反射实现的。mybatis只是对JDK的反射进行封装,避免每次调用JDK反射的重复性代码。mybatis封装JDK反射有五个关键类:(1)ObjectFactory工厂类接口(2)DefaultObjectFactory上述接口的实现类,主要使用反射创建对象。public class Defau...

2019-05-05 13:57:15 1469

原创 Mybatis系列5-缓存源码分析

1.装饰器模式mybatis缓存模块用了装饰器模式,装饰器模式就是用来在类的原有功能基础上添加新功能。装饰器模式中又四个角色:组件接口:Component,定义了组件的行为组件实现类:ConcreteComponent,也就是被装饰的对象装饰器抽象类:Decorator,也实现了组件接口,并且持有一个被装饰的对象装饰器实现类:ConcreteDecorator,实现了装饰器是不是...

2019-05-05 12:46:09 207

原创 Mybatis系列4-数据源源码分析

1.工厂模式mybatis的数据源模块使用了工厂模式,分析源码前先讲下工厂模式。(1)简单工厂模式简单工厂模式是工厂类直接根据参数创建不同对象。public class SimpleFactory { public static final int TYPE1= 1; public static final int TYPE2 = 2; public static ...

2019-05-05 11:02:56 186

原创 Mybatis系列2-一级缓存和二级缓存

1.一级缓存一级缓存默认会启用,存在于 SqlSession 的生命周期中,在同一个SqlSession 中查询时, MyBatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中。如果同一个SqlSession 中执行的方法和参数完全一致,则会返回缓存中的对象。任何的 INSERT 、UPDATE 、 DELETE 操作都会清空一级缓存。可以通过在select标...

2019-05-05 09:14:57 137

原创 Mybatis系列3-日志源码分析

mybatis本身没有提供日志的实现,引入的是第三方组件。mybatis支持多个第三方日志插件,优先级由低到高为slf4J、commonsLoging、Log4J2、Log4J和JdkLog。这里有两个问题:(1)mybatis只有trace、debug、warn、error四个日志级别,但第三方日志组件却有不同的日志级别。怎么兼容的?(2)日志优先级怎么实现的?1.日志级别1.1 适配...

2019-05-05 09:14:27 1718

原创 Mybatis系列1-Mybatis介绍和配置

Mybatis前身是iBatis,本质是一种半自动的ORM框架,除了POJO和映射关系之外,还需要编写SQL语句。1.mybatis样例(1)配置文件mybatis-config.xml<configuration> <properties resource="db.properties" /> <settings> <setting nam...

2019-05-04 22:13:06 187

原创 Docker系列1-Docker介绍

1.Docker优势Docker目标是实现轻量级的操作系统虚拟化解决方案。(1)启动快Docker相比于传统的虚拟机方式要快得多,可以在秒级实现。(2)资源利用率高而且对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。(3)更快速的交付和部署开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。(4)更高效的虚...

2019-05-04 16:42:09 144

原创 redis系列6-缓存雪崩、缓存击穿、缓存穿透

我们在使用redis缓存时候常用方案是先查redis,如果redis有返回,没有则查数据库,数据库查出来后放入redis。1.缓存雪崩缓存雪崩是指缓存中数据在同一时间大量失效,导致查询全部落入数据库。解决方案:数据的过期时间随机设置,防止同时过期设置热点数据永远不过期。2.缓存击穿缓存击穿是指某一条热点数据失效,导致此时大批量查询这条数据的请求落到数据库。解决方案:加锁,只有第一...

2019-05-04 15:58:44 607

原创 redis系列6-RESP协议

redis原生的API,如果要发送N个命令,需要发送N个请求。这种比较耗费网络连接,我们可以借用redis提供的Pipeline管道一次发送多个命令执行。Pipeline管理实际上就是基于RESP协议。1.RESP协议RESP(REdis Serialization Protocal)全称是redis序列化协议。redis的请求基本都是命令+参数,所以可以将多个命令按照resp协议进行组合,...

2019-05-04 15:23:46 404

原创 redis系列5-集群

1.主从复制在从节点配置文件中加上slaveof 主节点ip,并且设置上只读slave-read-only=yes。主从复制肯定是有延迟的,repl-disable-tcp-nodelay参数决定是否关闭TCP_NODELAY,默认为关闭。关闭时无论大小都会及时发布到从节点,占带宽,适用于主从网络好的场景。开启时主节点合并所有数据成TCP包节省带宽,默认为40毫秒发一次。主从复制时,为提供主节...

2019-05-04 14:34:53 153

原创 redis系列4-持久化

redis持久化分为两种:RDB和AOF。1.RDBRDB持久化把当前进程数据生成快照(.rdb)文件保存到硬盘的过程,有手动触发和自动触发。(1)手动触发手动触发有有save和bgsave两命令。save命令:阻塞当前Redis,直到RDB持久化过程完成为止,若内存实例比较大会造成长时间阻塞。bgsave命令:redis进程执行fork操作创建子线程,由子线程完成持久化,阻塞时间很短...

2019-05-04 11:38:38 146

原创 redis系列3-发布订阅

redis的发布订阅很简单,发布订阅的最专业的还是MQ。MQ里面发布订阅和主题或者队列打交道。redis里面发布和订阅和channel打交道。(1)发布消息publish channel:aaa “hello”(2)订阅消息subscrible channel:test(3)查看订阅数pubsub numsub channel:test(4)取消订阅unsubscrible ch...

2019-05-04 11:12:58 229

原创 redis系列2-慢查询

1.慢查询redis命令的生命周期:发送、排队、执行、返回。慢查询只统计执行的时间。2.慢查询配置慢查询的阈值设置:(1)动态设置config set slowlog-log-slower-than 10000如果需要持久化保持到配置文件中需执行config rewrite。(2)修改配置文件在redis.conf文件中修改slowlog-log-slower-than 10000...

2019-05-04 11:01:12 173

空空如也

空空如也

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

TA关注的人

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