- 博客(105)
- 资源 (4)
- 收藏
- 关注
原创 MySQL的ACID是如何实现的?
写在前面本文主要探讨MySQL InnoDB 引擎下ACID的实现原理,对于诸如什么是事务,隔离级别的含义等基础知识不做过多阐述。ACIDMySQL 作为一个关系型数据库,以最常见的 InnoDB 引擎来说,是如何保证 ACID 的。(Atomicity)原子性: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;(Consistency)一致性: 执行事务前后,数据保持一致;(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。(D
2021-03-21 16:26:50
3456
1
原创 微服务架构体系发展
微服务架构体系前段内部听了下分享 Service Mesh。做一些总结架构的演进这种东西有点信雅达,没什么绝对标准单体应用:在第一阶段的单体应用很好理解。垂直应用:接着随着业务量增大, 将应用拆成互不相干的几个应用,Web框架(MVC) 是关键。这一步,前后端分离、使用缓存、数据库和应用服务分离都会做, 但服务间是独立的无法调用,且可能存在重复代码。分布式应用:垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务。这时用于提高业务复用及整合的 分布式服务框架(
2021-02-28 15:49:51
819
1
原创 分布式事务的方案选择
分布式事务方案XA/二阶段提交基于XA协议的二阶段提交所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问各个数据库准备好了吗?如果每个数据库都回 ok,那就正式提交事务,在各个数据库上执行操作;如果任何其中一个数据库回答不 ok,那么就回滚事务。这种分布式事务方案,比较适合单块应用里,跨多个库的分布式事务,而且因为严重依赖于数据库层面来搞定复杂的事务,效率很低,不适合高并发的场景。JTAJTA只是Java实现XA事务的一个规范
2021-02-28 15:32:31
325
1
原创 MySQL实战45讲总结
MySQL45讲1. 一条SQL查询语句怎么运行的但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。2. 一条SQL更新语句怎么运行MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写粉板,等不忙的时候再写账本。redo log(粉板)当有一条记录需要更新的时候,InnoDB 引擎就会先把记
2021-02-28 15:22:20
6249
1
原创 从 SpringApplication.run 开始
从 SpringApplication.run 开始这是你的 SpringBoot ,启动,只需一键。@SpringBootApplicationpublic class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class,args); }}但这一键背后发生了什么?挂着嘴边的 IOC 容器何时诞生,天天
2020-10-14 17:59:06
355
原创 23种设计模式【Java】解析 -备忘录模式
备忘录模式目的在不违反封装的情况下获得对象的内部状态,在需要时可以将对象恢复到最初状态。类图角色Originator: 原始对象,发起人。Caretaker: 管理角色,负责保存好备忘录。Menento: 备忘录,负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。实现这个就像打游戏时的存档独档机制,或者说 Ctrl + Z。备忘录public class Memento { private String state; public Memento
2020-07-12 16:40:16
205
原创 23种设计模式【Java】解析 -中介者模式
中介者模式目的集中相关对象之间复杂的沟通和控制方式。类图角色Mediator: 抽象中介者ConcreteMediator: 具体中介者Colleague: 抽象同事类ConcreteColleague: 具体同事类实现这个模式的现实案例最常见就是如其名的 中介 ,就拿租房中介来说,如果让租客和房东直接进行联系,是可以的,但是多对多的关系势必导致 结构 复杂,就需要一个中介。抽象中介者public abstract class Mediator { //申明一个联络方法
2020-07-12 16:39:00
251
原创 23种设计模式【Java】解析 - 迭代器模式
迭代器模式目的提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。类图角色Aggregate 聚合类,其中 createIterator() 方法可以产生一个 Iterator;ConcreteAggregate 具体聚合类,其中 createIterator() 方法可以产生一个 Iterator;Iterator 迭代器,主要定义了 hasNext() 和 next() 方法。ConcreteIterator 迭代器,主要定义了 hasNext() 和 next() 方法
2020-07-12 16:37:43
185
原创 23种设计模式【Java】解析 - 解释器模式
解释器模式目的为语言创建解释器,通常由语言的语法和语法分析来定义。类图角色AbstractExpression 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个 interpret() 方法,称为解释操作。TerminalExpression 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如公式 R=R1+R2 , R1 和 R2 就是终结符,对应
2020-07-12 16:36:39
242
原创 23种设计模式【Java】解析 - 访问者模式
访问者模式目的为一个对象结构(比如组合结构)增加新能力。类图角色Visitor: 访问者。为每一个 ConcreteElement 声明一个 visit 操作ConcreteVisitor: 具体访问者。存储遍历过程中的累计结果ObjectStructure: 对象结构。可以是组合结构,或者是一个集合。Element:抽象元素。抽象元素一般是抽象类或者接口,它定义一个accept()方法,该方法通常以一个抽象访问者作为参数。ConcreteElement:具体元素。具体元素实现了acce
2020-07-12 16:35:14
320
原创 23种设计模式【Java】解析 - 观察者模式
观察者模式目的定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且做出反应。发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系。类图角色Subject: 目标ConcreteSubject: 具体目标Observer: 观察者ConcreteObserver: 具体观察者实现目标public interface Subject { void resisterObserve
2020-07-12 16:33:38
182
原创 23种设计模式【Java】解析 - 命令模式
命令模式目的将命令(请求)封装在对象中,以便使用命令来参数化其它对象,或将命令对象放入队列中排队,或将命令对象的操作记录到日志中,以及支持可撤销的操作。类图角色Command: 命令ConcreteCommand:具体命令Receiver: 命令接收者:命令真正的执行者Invoker: 通过它来调用命令实现设计一个遥控器,可以控制电灯开关。命令public interface Command { void execute();}具体命令开灯public cla
2020-07-05 18:32:29
212
原创 23种设计模式【Java】解析 - 策略模式
策略模式目的定义一系列算法,封装每个算法,并使它们可以互换。可以让算法独立于使用它的客户端。类图角色Context: 环境类Strategy: 抽象策略类ConcreteStrategy: 具体策略类实现抽象策略类public interface Strategy { public int doOperation(int num1, int num2);}抽象策略类public class OperationAdd implements Strategy{ @O
2020-07-05 18:31:24
224
原创 23种设计模式【Java】解析 - 状态模式
状态模式目的允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。类图角色Context: 环境类State: 抽象状态类ConcreteState: 具体状态类实现抽象状态类public interface State { public void doAction(Context context);}抽象状态类public class StartState imp
2020-07-05 18:30:33
243
原创 23种设计模式【Java】解析 -责任链
责任链目的使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。类图角色抽象处理者(Handler)角色: 定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。具体处理者(ConcreteHandler)角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。实现抽象处理类public abstract class Handler { prot
2020-07-05 18:29:47
2096
原创 23种设计模式【Java】解析 - 模板方法
模板方法目的定义算法框架,并将一些步骤的实现延迟到子类。通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。类图角色AbstractClass:抽象类ConcreteClass: 具体实现类实现冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater();
2020-07-05 18:28:25
282
原创 23种设计模式【Java】解析 - 代理模式
代理模式目的为其他对象提供一种代理以控制对这个对象的访问。介绍代理有四类:远程代理(Remote Proxy): 控制对远程对象(不同地址空间)的访问,负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。虚拟代理(Virtual Proxy): 根据需要创建开销很大的对象,可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,不能马上完成,可以用虚拟代理缓存图片的大小信息,然后生成一张临时图片代替原始图片。保护代理(Protection Proxy):
2020-06-26 18:40:37
211
原创 23种设计模式【Java】解析 - 享元模式
享元模式目的实现对象的复用:利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的类图Flyweight: 抽象享元类ConcreteFlyweight: 具体享元类FlyweightFactory: 享元工厂类实现抽象享元类public interface Flyweight { // extrinsicState: 外部状态,每个享元对象的外部状态不同 void doOperation(String extrinsicState);}具体享元类
2020-06-26 18:40:02
203
原创 23种设计模式【Java】解析 - 装饰模式
装饰模式目的动态地给一个对象增加一些额外的职责。类图角色Component: 抽象构件ConcreteComponent: 具体构件 :用于定义具体的构件对象,实现了在抽象构件中声明的方法。Decorator: 抽象装饰类:用于给具体构件增加职责,但是具体职责在其子类中实现。ConcreteDecorator: 具体装饰类:抽象装饰类的子类,负责向构件添加新的职责。实现抽象构件使用奶茶的例子来说, 汉堡 是一个 Component 抽象构件,有一个方法 cost&nb
2020-06-26 18:39:14
235
原创 23种设计模式【Java】解析 - 组合模式
组合模式目的将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。类图Component :抽象构件类。定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。Leaf :叶子对象。没有子结点。Composite:容器(树枝)构件。包含子节点,子节点可以是叶子节点,也可以是容器节点,提供一个集合用于存储子节点,实现抽象构建类public abstract class Component { protected String na
2020-06-26 18:38:27
271
原创 23种设计模式【Java】解析 - 桥接模式
桥接模式目的将抽象与实现分离开来,使它们可以独立变化。类图角色Abstraction:抽象类RefinedAbstraction:扩充抽象类Implementor:实现类接口ConcreteImplementor:具体实现类动机当某个类具有两个以上维度,如果事先就把每一个维度进行组合,那类的个数就是 n * m … l 了,如果将各维度抽象出来,之后在通过聚合,根据实际需求组合,减少了不必要继承或实现,也减少了维度间的耦合。实现实现类接口public interface Im
2020-06-26 18:37:37
246
原创 23种设计模式【Java】解析 - 外观模式
外观模式目的提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。类图角色Facade: 外观角色SubSystem:子系统角色实现子系统类public class SubSystemA { public void a() { ... }}public class SubSystemB { public void b() { ... }}外观类public class Facade {
2020-06-21 17:54:55
190
原创 23种设计模式【Java】解析-适配器模式
适配器模式目的将一个接口转换成用户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。类图角色Target:目标抽象类Adapter:适配器类Adaptee:适配者类Client:客户类对象适配器类适配器在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系,一般是指多重继承.但 Java 等语言不支持多重继承,所以在实际开发中,大多是使用对象适配器。实现类适配器//目标
2020-06-21 17:53:16
248
原创 23种设计模式【Java】解析-原型模式
原型模式目的使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。类图角色Client : 调用类Prototype : 抽象原型类ConcretePrototype:具体实现类实现原型类public abstract class Prototype { abstract Prototype clone();}实现类public class ConcretePrototype extends Prototype { private String
2020-06-21 17:52:18
173
原创 23种设计模式【Java】解析-建造者模式
建造者模式目的封装一个对象的构造过程,并允许按步骤构造。类图角色Builder:抽象建造者ConcreteBuilder:具体建造者Director:指挥者Product:产品角色实现产品类public class Product { ...}抽象建造者public abstract class Builder { protected Product product = new Product(); // 具体的构建方法 public abstra
2020-06-21 17:51:27
169
原创 23种设计模式【Java】解析-抽象工厂
抽象工厂目的提供一个接口,用于创建相关的对象家族 。也就是说创建了很多对象而不是一个对象,且这些对象是相关的,必须一起创建出来。工厂方法是只用于创建一个对象。类图抽象工厂模式用到了工厂方法模式来创建单一对象, AbstractFactory中的 createProductA() 和 createProductB()方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。至于创建对象的家族这一概念是在 Client 体现,Client 通过 AbstractFacto
2020-06-21 17:50:31
192
原创 23种设计模式【Java】解析-工厂方法
工厂方法目的定义一个创建对象的接口,但由子类决定要实例化哪个类,把实例化操作推迟到子类。类图在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。下图中,Factory 有一个 doSomething()方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。角色Product:抽象产品ConcreteProduct:具体产品Factory:抽象工厂ConcreteFactory:具体工厂实
2020-06-21 17:48:23
262
原创 23种设计模式【Java】解析-简单工厂
简单工厂目的在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。类图简单工厂不是设计模式,更像是一种编程习惯。它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。因为客户类往往有多个,不使用简单工厂的话所有的客户类都要知道所有子类的细节,一旦子类发生改变,比如增加子类,所有的客户类都要进行修改。角色Factory:工厂角色Product:抽
2020-06-21 17:46:13
211
原创 23种设计模式【Java】解析-单例模式
单例模式确保一个类只有一个实例,并提供该实例的全局访问点,。类图使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。6种实现方式实现方式总结懒汉式-线程不安全私有静态变量 instance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 instance,节约资源。但多线程环境下是不安全的,如果多线程能够同时进入 if (instance == null) ,且
2020-06-21 17:31:05
239
原创 23种设计模式【Java】全案例解析
具体解析创建型结构型7个原则单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】: 一个类负责一项职责。里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】: 继承与派生的规则。依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。接口隔离原则【INTERFACE SEGREGATION PRINC
2020-06-21 16:13:28
2720
原创 如何完成一次 IO - Linux I/O详解
如何完成一次 IO哪个男孩不想来一场异步非阻塞的甜蜜恋爱?21 点,你打开微信,开心地对女孩说:“晚上好”。女孩说:“我在洗澡”。你抱着手机等待晚点聊,此刻,你是阻塞的,也是同步的。为什么?写在前面谈起 IO, Javaer 会说起 BIO、NIO、AIO,也会提到同步异步、阻塞非阻塞。但到底什么是 IO, IO又是怎么完成的?1. 什么是 I/O学术的说 I/O 是信息处理系统(计算机)与外界(人或信息处理系统)间的通信。如计算机,即 CPU 访问任何寄存器和 Cache 等封装以外的
2020-06-14 18:10:06
3013
1
原创 如何完成一次快速的查询 - 从MySQL到分库分表到ES和HBASE
哪个男孩不想完成一次快速的查询?1. MySQL 查询慢是什么体验?谢邀,利益相关。大多数互联网应用场景都是读多写少,业务逻辑更多分布在写上。对读的要求大概就是要快。那么都有什么原因会导致我们完成一次出色的慢查询呢?1.1 索引在数据量不是很大时,大多慢查询可以用索引解决,大多慢查询也因为索引不合理而产生。MySQL 索引基于 B+ 树,这句话相信面试都背烂了,接着就可以问最左前缀索引...
2020-04-19 12:05:03
1322
原创 [剑指Offer] - Java完整题解
写在前面本文题目顺序为牛客网剑指 Offer 通过率降序,也算是一种从易到难。牛客网剑指Offer详细题解剑指Offer具体题解发布在个人网站,更新ing1. 二维数组中的查找2. 替换空格3. 从尾到头打印链表4. 两个栈实现队列5. 旋转数组的最小数字6. 斐波那契数列7. 跳台阶8. 变态跳台阶9.二叉树深度10.不使用加减乘除做加法11. 镜像二叉树...
2020-01-12 16:51:46
771
原创 分布式缓存选择
分布式缓存的选择和问题如今,缓存系统的应用非常广泛,能够用来提高并发数、数据吞吐量,提高快速响应能力。那么当数据量达到一定程序,单机环境可能就显得有些力不从心了,就需要一个分布式缓存系统。1. 缓存系统的选择 图1-1如上图所示,首先缓存大致可以分为四大类。CDN缓存:CDN即内容分发网络,CDN边缘节点将数据缓存起来。反向代理缓存:如Nginx...
2019-12-22 16:01:25
705
原创 从MapReduce到Hive
1.计算框架Hadoop 是一个计算框架,目前大型数据计算框架常用的大致有五种:仅批处理框架:Apache hadoop.仅流处理框架:Apache Storm、Apache Samza.混合框架:Apache Spark、Apache Flink.这其中名气最大、使用最广的当属 Hadoop 和 Spark。虽然两者都被称为大数据框架,但实际层级不同。Hadoop 是一个分布式数...
2019-12-05 16:41:56
1380
原创 Swagger-Codegen使用详解
Swagger-Codegen使用1. 是什么swagger 是什么应该不需要介绍。swagger-Codegen是同一团队维护的开源项目,官方介绍如是:Swagger Codegen can simplify your buildx process by generating server stubs and client SDKs for any API, defined with th...
2019-12-05 13:43:46
16913
原创 Swagger 自定义Model、Enum(SpringFox源码分析)
Springfox源码分析-自定义Model、Enum先说一说Springfox和Swagger的关系Swagger 是一种规范。springfox-swagger 是基于 Spring 生态系统的该规范的实现。springfox-swagger-ui 是对 swagger-ui 的封装,使得其可以使用 Spring 的服务。由于工作中遇到需要基于 Swagger Json 做一些处...
2019-12-05 13:38:43
5142
1
原创 Spring事务与JDK/CGLIB动态代理
近日面试问及AOP和动态代理,再之后的事务方面有所生疏,感谢面试官特意给我介绍了下,一个之前的知识盲区。首先Spring事务在开发过程中是通过@Transactional注解来控制。1. Transactional注解的原理对于使用了Transactional注解的方法的类,Spring AOP代理会在运行时生成这个类的代理对象。当这个对象运行这个注解方法时,会读取@Transa...
2019-05-29 21:18:03
3664
2
原创 七牛云申请空间及配置CDN加速
1. 注册七牛云2. 进入控制台-对象存储界面3. 新建存储空间如上图中:test即为Bucket名称http://proirpgeq.bkt.clouddn.com/ 为七牛云CDN域名(路径全称,末尾带/)4. 获取密钥图中AK即为Access Key字段。图中SK即为Secret Key字段。以上四个字段,为相关七牛云API使用中需要的属性,具体结合自身...
2019-05-18 11:19:28
3641
数据库课程设计
2017-02-15
C++公司人事管理课程设计
2017-02-05
C语言课程设计
2017-01-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人