- 博客(79)
- 资源 (3)
- 收藏
- 关注
原创 Mysql主从部署
1 准备准备两台主机和安装包,具体版本如下: 名称 版本 操作系统 CentOS 7.564bit mysql安装包 mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz 2 Master/Slave部署主从服务器均需要进行本mysql安装步骤。默认部署安装包是在/mnt路径下2.1 环境准备2.1.1 解压安装包# 解压mysql安装..
2022-04-19 17:45:28
2386
2
原创 分布式-dubbo
一、dubbo概述1.1 什么是dubbo Apache Dubbo是一款高性能的RPC框架(支持多语言java、golang等)。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。1.2 dubbo的流程图上面这张图是很经典的dubbo流程图:调用流程:服务提供者在服务容器启动时,向注册中心注册自己提供的服务 服务消费者在启动时,向注册中心注册自身和订阅自己所需的服务 注册中心返回服务提供者地址列表给消...
2021-08-11 11:58:32
486
原创 分布式-Zookeeper
一、Zookeeper简介 Zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂的且容易出错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并以⼀些简单的接⼝提供给⽤户使⽤。zookeeper是⼀个典型的分布式数据⼀致性的解决⽅案,分布式应⽤程序可以基于它实现诸如数据订阅/发布、负载均衡、命名服务、集群管理、分布式锁和分布式队列等功能。1.1ZooKeeper数据模型Znode 在ZooKeeper中,数据信息被保存在⼀个个数据节点上,这些节点被称为zno...
2021-08-03 23:05:44
1431
2
原创 网络编程-Netty编程-线程模型
上一章我们主要讲了NIO编程,实际上直接使用nio编程,会有比较多的缺点,比如NIO 的类库和 API 繁杂,使用麻烦,需要自己处理网络问题造成的断连重连以及阻塞造成一系列问题,导致开发工作量和难度都非常大,同时还有Epoll Bug,那么有什么优秀框架可以解决这些问题呢?那就是netty。一、Netty 介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty 是一..
2021-07-22 12:16:14
229
原创 网络编程-NIO编程
目录一、I/O模型说明1.1BIO(同步并阻塞) 1.2NIO(同步非阻塞) 1.3AIO(异步非阻塞) 1.4BIO、NIO、AIO 适用场景分析二、NIO详细介绍三、NIO 三大核心原理示意图四、缓冲区(Buffer)4.1基本介绍4.2Buffer常用API介绍 4.2.1 缓冲区对象创建API4.2.2缓冲区对象添加数据4.2.3缓冲区对象读取数据五、通道(Channel) 5.1基本介绍...
2021-07-22 11:09:41
626
原创 Nginx基础和应用
目录一、认识Nginx1.1 什么是Nginx 1.2Nginx核心配置解读 1.2.1全局块 1.2.2events块 1.2.3http块二、Nginx的主要应用场景2.1Nginx应⽤场景之反向代理 2.2Nginx应⽤场景之负载均衡三、ngnix的日志四、Nginx的进程机制4.1nginx信号处理流程4.2worker多进程进程处理机制一、认识Nginx1.1 什么是Nginx ...
2021-07-20 13:21:09
111
原创 分布式-Session共享问题
一、分布式环境下的Session问题 在单体应用时代,我们不需要考虑Session不同步的问题,但在分布式系统中,因为Http协议是⽆状态的协议,客户端和服务端在某次会话中产⽣的数据不会被保留下来,所以第⼆次请求服务端⽆法认识到你曾经来过。 Http为什么要设计为⽆状态协议?早期都是静态⻚⾯⽆所谓有⽆状态,后来有动态的内容更丰富,就需要有状态,出现了两种⽤于保持Http状态的技术,那就是Cookie和Session。单体应用时代依靠Cookie和Session成功实现了记录登录状态的功能,可s...
2021-07-19 16:33:56
373
原创 深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)
我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估指标的以及优化器生成执行计划的整个过程的方法。一、查看执行计划计算的成本数据 我们上边介绍的EXPLAIN语句输出中缺少了一个衡量执行计划好坏的重要属性 -成本。那如何查看具体的成本呢?MySQL也贴心的为我们提供了一种查看某个执行计划花费的成本的方式-Json格式的执行计划。我们只需要在EXPLAI.
2021-07-16 10:45:26
710
原创 深入理解mysql-第十一章 mysql查询优化-Explain 详解(中)
一、执行计划-type属性 执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问这个单表的方法具体是什么,比方说下边这个查询:mysql> EXPLAIN SELECT * FROM s1 WHERE key1 = 'a';+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+------...
2021-07-16 10:21:54
146
原创 深入理解mysql-第十章 mysql查询优化-Explain 详解(上)
一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。Mysql为我们提供了EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,从而可以有针对性的提升我们查询语句的性能。一、初识Expalin 如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个EXPLAIN,就像这样:mysql> EXPLAIN SEL..
2021-07-15 18:10:03
199
原创 深入理解mysql-第九章 mysql查询优化-基于规则
本章我们继续开始对sql语句的查询优化讲解,上一章我们主要讲mysql内部对索引的选择优化。本章我们讲一下mysql依据一些规则,把糟糕的SQL语句转换成可以比较高效执行的语句,这个过程也可以被称作查询重写。一、条件化简1.1移除不必要的括号有时候表达式里有许多无用的括号,比如这样:((a = 5 AND b = c) OR ((a > c) AND (c < 5)))优化器会把那些用不到的括号给干掉,就是这样:(a = 5 and b = c) OR (a...
2021-07-15 17:34:22
168
原创 深入理解mysql-第八章 mysql查询优化-基于成本
我们知道mysql服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是连接管理、解析与优化、存储引擎。存储引擎我们已经前几章已经讲过了,下面几个章节主要研究下mysql的的优化。本章主要讲解对索引的最优选择,内连接的驱动表选择。一、所谓成本 MySQL执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。其实在MySQL中一条查询语句的执行成本是由下边这两个方面组成的:I/O成本,我们的表经常使用的MyISAM、InnoDB存储引擎都是将数.
2021-07-15 16:11:04
302
1
原创 Tomcat系统架构与原理剖析
目录一、Tomcat架构1.1Tomcat 连接器组件 Coyote1.2Tomcat Servlet 容器 Catalina二、Tomcat的核心配置三、Tomcat的核心流程3.1 tomcat启动流程3.2 tomcat的请求解析流程3.3 tomcat的请求处理流程四、Tomcat 类加载机制4.1 jvm类加载机制4.2 tomcat的类加载机制五、Tomcat 性能优化策略5.1 虚拟机运行优化5.1.1 内存分配优化...
2021-07-14 12:14:04
544
1
原创 第十章 springboot源码系列-依赖管理和自动配置
关于springboot,我们使用它的主要原因是配置极其简单,其中配置我们过去主要工作一是配置依赖,有时候甚至还要解决依赖冲突;二是需要进行大量的文件配置。springboot正是凭借着依赖管理和自动配置来实现这些功能,大大简化开发成本,当然springboot还有其他很多强大功能。今天我们就可以研究一下这两个功能是怎么实现的。
2021-07-06 18:08:09
568
原创 第九章 springboot源码系列-springboot主要特性
一、SpringBoot的定义和主要特性1.1 定义 SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。1.2 主要特性SpringBoot Starter:他将常用的依赖分组..
2021-07-06 12:13:43
389
1
原创 ngnix跨域问题整理
一、nginx配置跨域location / { # 配置允许跨域的域名 add_header Access-Control-Allow-Origin *; # 为 true 的时候指请求时可带上Cookie # add_header 'Access-Control-Allow-Credentials' 'true'; # 配置允许的方法 add_header Access-Control-Allow-Methods 'GET, POST, OPTIO
2021-06-24 17:31:52
661
原创 第三章 mybatis源码系列-mybatis的源码分析
一、源码剖析-初始化1.1 加载配置文件 mybatis-configInputstream inputstream = Resources.getResourceAsStream("mybatis-config.xml");//这一行代码正是初始化工作的开始。SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(inputStream);咱们来分析从读取配置文件开始进行源码分析: /...
2021-06-22 19:08:14
241
原创 第五章 spring源码系列-ioc原理分析
一、什么是IOC和DI控制反转的英文翻译是 Inversion Of Control,缩写为 IOC。IOC是一种思想,并不是spring特有的
2021-06-18 13:36:48
122
原创 第四章 mybatis源码系列-mybatis的高级应用
一、缓存1.1缓存-一级缓存的设计与原理 一级缓存基于SqlSession,所以我们可以直接创建SqlSessionFactory,并从中开启一个新的SqlSession,默认情况下它会自动开启事务,所以一级缓存会自动使用。...
2021-06-18 12:24:38
140
原创 第一章 mybatis源码系列-手写mybatis
一、分析jdbc// 加载数据库驱动Class.forName("com.mysql.jdbc.Driver");// 通过驱动管理类获取数据库链接Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");// 定义sql语句?表示占位符String sql = "select * fro
2021-06-10 18:35:48
251
原创 深入理解mysql-第七章 mysql存储引擎InnoDB的索引-索引的使用
索引会给我们定位到数据页提供很大的便利,但根据算法的思想,这种快速的定位数据必定要复出一定的代价。所以索引并不是越多越好。一、索引的代价 如何更好的使用索引之前先要了解一下使用的代价,它在空间和时间上都会拖后腿: 空间上的代价 每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页组成,占用了很大的一片存储空间。 时间上的代价(维护b+查询树结构) 每次对表中的数据进行增、删、改操作..
2021-05-20 16:12:01
195
1
原创 深入理解mysql-第六章 mysql存储引擎InnoDB的索引-B+树索引
一、引入索引 在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能从第一个页沿着双向链表一直往下找,因为要遍历所有的数据页,时间复杂度就是O(n),所以这种方式显然是超级耗时的。所以我们需要采取一定的数据结构来存储数据,方便我们进行数据的增删改查操作。 问题的需求大致定义清楚了,我们现在回想一下,能否利用已经学习过的数据结构解决这个问题呢?支持快速查询、插入等操作的动态数据结构,我们已经学习过散列表、平衡二叉查找树、跳表。 ...
2021-05-20 11:51:56
216
原创 重学数据结构和算法系列-第一章(数据结构和算法简介)
前言:本专栏主要是学习王争的《数据结构与算法之美》专栏的学习笔记。什么是数据结构?什么是算法?一、数据结构和算法的定义 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。数据结构和算法在编程界有很高的地位,甚至认为”算法+数据=程序”,可见算法的重要性。 从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用。我们要学习的这些经典数据结构和算法,都是前人从很多实际操...
2021-04-19 15:46:36
186
翻译 设计模式系列-第二十六章(23种设计模式总结)
一、创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。1.1 单例模式 单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。尽管单例是一个很常用的设计模式,在实际的开发中,我们也确实经常用到它,但是,有些人认为单例是一种反模式(anti...
2021-04-14 15:52:06
849
翻译 设计模式系列-第二十五章(行为型-中介模式)
一、中介模式的定义 中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。 实际上,中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。二、中介模式的实现 假设我...
2021-04-14 15:10:12
108
原创 设计模式系列-第二十四章(行为型-解释器模式)
一、解释器模式 解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。它用来描述如何构建一个简单的“语言”解释器。解释器模式很小众,只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。二、解释器模式的实现假设我们定义了一个新的加减乘除计算“语言”,语法规则如下:运算符只包含加、减、乘、除,并且没有优先级的概念; 表达式(也就是前面提到的“句子”)中,先书写数字,后书写运算符,空格隔开; 按照先后顺序,取出两个数字和一个运算符计算结果,结果...
2021-04-14 15:01:16
121
原创 设计模式系列-第二十三章(行为型-命令模式)
现在我们只剩下 3 个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这 3 个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。一、命令模式的定义 命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。 落实到编码实现,命令模式用的最核心的实现手段,是将函数封装成对...
2021-04-14 14:41:11
101
原创 设计模式系列-第二十二章(行为型-备忘录模式)
一、备忘录模式的定义 备忘录模式,也叫快照(Snapshot)模式。在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义主要表达了两部分内容。一部分是,存储副本以便后期恢复。这一部分很好理解。另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。二、备忘录模式实现 示例一个小程序,可以接收命令行的输入。用户输入文本时,程序将其追加存储在内存文本中;用户输入“:list”,程序在命令行中输出内存文本的内容;...
2021-04-14 14:19:58
113
原创 设计模式系列-第二十一章(行为型-访问者模式)
一、访问者模式定义 访问者模式允许一个或者多个操作应用到一组对象上,设计意图是解耦操作和对象本身,保持类职责单一、满足开闭原则以及应对代码的复杂性,实际策略加工厂模式也可以达到同样效果。虽然策略模式也能实现,但对于多种类型的同个操作聚合在了一起,这种情况属于同父类的一些相同操作就能抽私有共用方法,相对于策略模式会更加优雅和简单。。对于访问者模式,学习的主要难点在代码实现。而代码实现比较复杂的主要原因是,函数重载在大部分面向对象编程语言中是静态绑定的。也就是说,调用类的哪个重载函数,是在编译期间,由...
2021-04-14 12:26:19
100
原创 设计模式系列-第二十章(行为型-迭代器模式)
一、迭代器的定义 上一课,我们学习了状态模式。状态模式是状态机的一种实现方法。这一章我们学习迭代器模式,迭代器也是比较简单的一种设计模式,,它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。 迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。为了达到基于接口而非实现编程的目的,容器又包...
2021-04-14 11:51:33
105
原创 设计模式系列-第十九章(行为型-状态模式)
一、状态模式的定义 状态模式。虽然网上有各种状态模式的定义,但是你只要记住状态模式是状态机的一种实现方式即可,状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。状态机又叫有限状态机,它有 3 个部分组成:状态、事件、动作。其中,事件也称为转移条件。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。 状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上来看,它有点像我们之前讲到的组合模式(主要针对树结构的...
2021-04-13 17:55:16
129
原创 设计模式系列-第十八章(行为型-职责链模式)
一、职责链模式定义 职责链模式,将请求的发送和接收解耦,将接收对象串成一条链,并沿着这条链传递这个请求,链条上的每个对象各自承担各自的处理职责。 在 GoF 给出的定义中,如果处理器链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上,职责链模式还有一种变体,那就是请求会被所有的处理器都处理一遍,不存在中途终止的情况。职责链模式和模板模式、策略模式的作用类似,主要是复用和扩展。职责链常见的应用主要是过滤器和拦截器。二、职责链模式的实现2.1 简单的实现 ...
2021-04-13 17:32:36
136
原创 设计模式系列-第十七章(行为型-策略模式)
一、策略模式定义 策略模式,定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。 工厂模式是解耦对象的创建和使用,观察者模式是解耦观察者和被观察者。策略模式跟两者类似,也能起到解耦的作用,不过,它解耦的是策略的定义、创建、使用这三部分。策略模式通常跟工厂一起配合使用。策略侧重如何灵活选择替换,工厂侧重怎么创建实例。二、策略模式的实现2.1 策略类定义 策略类的定义比较简单,包含一...
2021-04-13 15:58:21
110
原创 设计模式系列-第十六章(行为型-模板模式)
一、模板模式定义 模板模式,全称是模板方法设计模式。模板模式有两大作用:复用和扩展。模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。二、模板模式的代码示例 原理很简单,代码实现就更加简单,如下所示。templateMethod() 函数定义为 final,是为了避免子类重写它。method1() 和 method2() 定义为 abstract,是为了强迫子类去实现。不过,这些都不是...
2021-04-13 15:47:20
114
原创 设计模式系列-第十五章(行为型-观察者网模式)
一、观察者模式定义 观察者模式也被称为发布订阅模式。定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。设计模式要干的事情就是解耦,创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦,具体到观察者模式,它将观察者和被观察者代码解耦。借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,..
2021-04-13 15:34:15
134
原创 设计模式系列-第十四章(结构型-享元模式)
一、享元模式定义 所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段)提取出来,设计成享元,让这些大量相似对象引用这些享元。二、享元模式...
2021-04-13 11:09:04
127
原创 设计模式系列-第十三章(结构型-组合模式)
一、组合模式定义 组合模式主要是用来处理树形结构数据。这里的“数据”,可以简单理解为一组对象集合。组合模式的设计思路,与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。 组合模式,将一组对象组织成树形结构,将单个对象和组合对象都看做树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现。使用组合模式的前提在于,你的业务场景必须能够表示成树形结构。所以,组合...
2021-04-12 17:59:41
104
原创 设计模式系列-第十二章(结构型-门面模式)
一、门面模式定义 门面模式,也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。 门面模式主要解决的是接口设计问题,接口粒度设计得太大,太小都不好。太大会导致接口不可复用,太小会导致接口不易用。在实际的开发中,接口的可复用性和易用性需要“微妙”的权衡。针对这个问题,我的一个基本的处理原则是,尽量保持接口的可复用性,但针对特殊情况,允许提供冗余的门面接口,来提供更易用的接口。适配器模式是做接口转换,解决的是原接口和目标接口不匹配的问题。门面模式做接口整合,解决...
2021-04-12 17:47:17
92
翻译 设计模式系列-第十一章(结构型-适配器模式)
一、适配器的定义 适配器模式的英文翻译是 Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。二、适配器的两种实现 适配器实现主要分类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。具体的代码实现如下所示。其中...
2021-04-12 17:41:51
146
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人