摘要: 程序运行在内存以及IO的体现 首先普及一下常识,如图所示: 1、在整个内存空间中,跑着各种各样的程序,有Java程序、C程序,他们共用一块内存空间。 2、对于Java程序,JVM会申请一块堆空间,通过Xmx可以设置,其余空间是堆外空间,其中每个线程有自己的线程栈,保证线程内存隔离,堆空间使用完以后, 阅读全文
posted @ 2021-07-31 19:30 IT6889 阅读(145) 评论(0) 推荐(0)
摘要: 一、七层网络模型 OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,它是一个七层的、抽象的模型体。 1、物理层 并不是物理媒体本身,它只是开放系统中利用物理媒体实现物理连接的功能描述和 阅读全文
posted @ 2021-07-31 19:29 IT6889 阅读(129) 评论(0) 推荐(0)
摘要: 一、BIO简介 BIO是java1.4之前唯一的IO逻辑,在客户端通过socket向服务端传输数据,服务端监听端口。由于传统IO读数据的时候如果数据没有传达,IO会一直等待输入传入,所以当有请求过来的时候,新起一条线程对数据进行等待、处理,导致每一个链接都对应着服务器的一个线程。 BIO是同步阻塞的 阅读全文
posted @ 2021-07-31 19:28 IT6889 阅读(157) 评论(0) 推荐(0)
摘要: 一、AIO简介 AIO是java中IO模型的一种,作为NIO的改进和增强随JDK1.7版本更新被集成在JDK的nio包中,因此AIO也被称作是NIO2.0。区别于传统的BIO(Blocking IO,同步阻塞式模型,JDK1.4之前就存在于JDK中,NIO于JDK1.4版本发布更新)的阻塞式读写,A 阅读全文
posted @ 2021-07-31 19:26 IT6889 阅读(363) 评论(0) 推荐(0)
摘要: 一、简介 NIO我们一般认为是New I/O(也是官方的叫法),因为它是相对于老的I/O类库新增的( JDK 1.4中的java.nio.*包中引入新的Java I/O库)。但现在都称之为Non-blocking I/O,即非阻塞I/O,因为这样叫,更能体现它的特点。而下文中的NIO,不是指整个新的 阅读全文
posted @ 2021-07-31 19:21 IT6889 阅读(181) 评论(0) 推荐(0)
摘要: 说到WebSocket技术,其实源于服务器推送技术,在现实中很多时候需要的数据是不断变化的,比如股市数据、聊天软件,因此就需要一种客户端想要在不刷新页面的情况下实时获取到服务器端最新数据的技术,而以往的数据获取都是基于客户端主动请求,服务端返回对应数据。因此就有了服务器推送技术。 服务器推送技术主要 阅读全文
posted @ 2021-07-31 19:19 IT6889 阅读(296) 评论(0) 推荐(0)
摘要: ChannelPipeline 提供了ChannelHandler 链的容器,并定义了用于在该链上传播入站和出站事件流的API。ChannelPipeline不是单独存在,它肯定会和Channel、ChannelHandler、ChannelHandlerContext关联在一起。 一、Channe 阅读全文
posted @ 2021-07-31 19:18 IT6889 阅读(147) 评论(0) 推荐(0)
摘要: Netty提供的ByteBuf不同于JDK中NIO的ByteBuffer,ByteBuf是netty中数据传输的容器,是Netty自己实现的,作为NIO ByteBuffer的替代品,提供了更好的API供开发者使用。相较于NIO的ByteBuffer更具有卓越的功能性和灵活性。具体NIO的ByteB 阅读全文
posted @ 2021-07-31 19:16 IT6889 阅读(336) 评论(0) 推荐(0)
摘要: RPC的实现方式是本地通过远程代理对象调用远程服务。在互联网应用场景中,单体服务极度缺乏弹性伸缩能力,在大规模开发团队中也不便于开发管理。所以往往会把服务根据模块进行垂直拆分,也就是我们说的SOA服务化。服务拆分后系统跟系统直接的业务交互往往依赖于RPC框架进行通讯。 通常RPC的服务端会提供对应的 阅读全文
posted @ 2021-07-31 19:14 IT6889 阅读(158) 评论(0) 推荐(0)
摘要: 一、什么是Reactor模型 Reactor设计模式是event-driven architecture(事件驱动)的一种实现方式。Reactor会解耦并发请求的服务并分发给对应的事件处理器来处理。 目前,许多流行的开源框架都用到了Reactor模型。如:netty、node.js等,包括java的 阅读全文
posted @ 2021-07-31 19:12 IT6889 阅读(282) 评论(0) 推荐(0)
摘要: 如下所示,我们写一个简单的Netty Demo,实现客户端与服务端进行通讯。 1、Netty 服务端启动类 /** * (1)、 初始化用于Acceptor的主"线程池"以及用于I/O工作的从"线程池"; * (2)、 初始化ServerBootstrap实例, 此实例是netty服务端应用开发的入 阅读全文
posted @ 2021-07-31 19:10 IT6889 阅读(286) 评论(0) 推荐(0)
摘要: Redis属于常见的NoSQL数据库或者说非关系数据库:Redis不使用表,她的数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。 常见数据库对比: 和高性能键值缓存服务器memcached对比: Redis和mencached都可用于存储键值映射,彼此性能也相差无几,但是①. 阅读全文
posted @ 2021-07-31 19:08 IT6889 阅读(659) 评论(0) 推荐(0)
摘要: redis是一个key-value储存系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型) redis字符串:在redis-Client中执行以下命令: 阅读全文
posted @ 2021-07-31 19:07 IT6889 阅读(241) 评论(0) 推荐(0)
摘要: maven依赖注入: <!--dependency for redis--> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency 阅读全文
posted @ 2021-07-31 19:05 IT6889 阅读(2722) 评论(0) 推荐(0)
摘要: Spring-data-redis,是spring-data框架中,比较常用的,基于key-value键值对的数据持久层框架。Spring-data-redis,是一个基于Template模板开发的数据访问层框架。都是基于配置+template方法调用,实现redis数据CRUD操作的。 没有Spr 阅读全文
posted @ 2021-07-31 19:03 IT6889 阅读(402) 评论(0) 推荐(0)
摘要: Redis可以存储可以存储键与5种不同数据结构类型之间的映射。五种数据类型为:STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)、ZSET(有序集合)。 一、字符串类型String 1、类型定义 String 数据结构是简单的 key-value 类型,使用string时,r 阅读全文
posted @ 2021-07-31 19:01 IT6889 阅读(350) 评论(0) 推荐(0)
摘要: 一、什么是泛型 Java从1.5之后支持泛型,泛型的本质是类型参数,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 若不支持泛型,则表现为支持Object,不是特定的泛型。泛型是对 Java 语言的类型系统的一种扩展,以支持 阅读全文
posted @ 2021-07-31 18:57 IT6889 阅读(784) 评论(0) 推荐(0)
摘要: 在Redis的使用过程中,大多数人都是使用现成的客户端,如Jedis,Redisson,Lettuce。因此本文研究用BIO的方式手写Redis客户端尝试,对遇到的问题进行探究及总结。 如何从架构角度思考架构分层? Redis通讯协议RESP是怎么回事? 如何基于BIO实现Redis客户端? Red 阅读全文
posted @ 2021-07-31 18:56 IT6889 阅读(139) 评论(0) 推荐(0)
摘要: 一、Redis使用有哪些常见问题 在我们已经有了Jedis客户端、集群模式支持后,Redis基本使用已经没有大的问题了。 但是这样依旧有很多缺陷,比如: 动态扩容不方便,扩容需要重启才能生效 对于集群配置,有客户端代码侵入 集群中没有业务进行隔离,单业务冲高可能影响其余业务运行 没有监控,无法提前预 阅读全文
posted @ 2021-07-31 18:53 IT6889 阅读(516) 评论(0) 推荐(0)
摘要: 一、Redis介绍 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合 阅读全文
posted @ 2021-07-31 18:49 IT6889 阅读(155) 评论(0) 推荐(0)
摘要: Redis在日常部署的时候,可以有多种部署模式:单机、主从、哨兵、集群(分区分片),因此本例将对上面这四种模式进行详细的讲解,特别是集群模式将进行最细致的讲解(现行普遍使用的方式)。 一、单机部署 单机部署很简单,直接下载Redis进行安装即可,此处不作详细讲解,具体Redis的安装请参考:Mac下 阅读全文
posted @ 2021-07-31 18:48 IT6889 阅读(540) 评论(0) 推荐(0)
摘要: Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 我们在进行Java项目开发的时候,如果要使用Redis数据库,那么常常是通过Redis的Java客户端来简化Redis的使用,例如Redisso 阅读全文
posted @ 2021-07-31 18:43 IT6889 阅读(107) 评论(0) 推荐(0)
摘要: 我们以汽车分类管理程序为例来介绍合成复用原则的应用。 分析:汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。如果同时考虑这两种分类,其组合就很多。如图所示是用继淨:关系实现的汽车分类的类图。 从图中可以看出用继承关系实现会产生很多子类,而且增加新的 阅读全文
posted @ 2021-07-31 18:36 IT6889 阅读(155) 评论(0) 推荐(0)
摘要: 如一个明星与经纪人的关系实例。明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图所示。 程序代码如下: public class LoDtest { public 阅读全文
posted @ 2021-07-31 18:35 IT6889 阅读(244) 评论(0) 推荐(0)
摘要: 以一个关于课程的例子展示开闭原则: /** * 定义课程接口 */ public interface ICourse { String getName(); // 获取课程名称 Double getPrice(); // 获取课程价格 Integer getType(); // 获取课程类型 } / 阅读全文
posted @ 2021-07-31 18:33 IT6889 阅读(376) 评论(0) 推荐(0)
摘要: 里氏替换原则强调的是设计和实现要依赖于抽象而非具体;子类只能去扩展基类,而不是隐藏或者覆盖基类,它包含4层含义. 一、里氏替换4原则 1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法,父类中凡是已经实现好的方法(相对于抽象方法而言), 阅读全文
posted @ 2021-07-31 18:32 IT6889 阅读(229) 评论(0) 推荐(0)
摘要: 我们来写一个关于司机开车的示例,假设我们现在有个司机,可以开车,然后有一辆奔驰,于是就可以让车跑起来。 public class Driver { // 司机职责就是驾驶汽车 public void drive(Benz benz) { benz.run(); } } public class Be 阅读全文
posted @ 2021-07-31 18:31 IT6889 阅读(210) 评论(0) 推荐(0)
摘要: 如本例学生成绩管理程序,学生成绩管理程序一般包含插入成绩、删除成绩、修改成绩、计算总分、计算均分、打印成绩信息、査询成绩信息等功能,如果将这些功能全部放到一个接口中显然不太合理,正确的做法是将它们分别放在输入模块、统计模块和打印模块等 3 个模块中,其类图如图所示: 源码如下: public cla 阅读全文
posted @ 2021-07-31 18:30 IT6889 阅读(114) 评论(0) 推荐(0)
摘要: 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据一些原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 我们常见有 7 条原则,设计模式之禅这本书中概括为6原则,我们本博客就以7原则来进行说明: 开闭原则 单一职责原则 里氏替换原则 依 阅读全文
posted @ 2021-07-31 18:28 IT6889 阅读(130) 评论(0) 推荐(0)
摘要: 一、建造者模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。建造者模式属于创建型设计模式,它是将一个复杂的对象分解为多个简单的对象,使用多个简单的对象一步一步构建成一个复杂的对象。它将变与不 阅读全文
posted @ 2021-07-31 18:21 IT6889 阅读(230) 评论(0) 推荐(0)
摘要: 一、代理模式的定义 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介,代理模式也叫做委托模式。 二、为什么使用代理模式 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对 阅读全文
posted @ 2021-07-31 18:19 IT6889 阅读(241) 评论(0) 推荐(0)
摘要: 一、适配器模式的定义 适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式分为类结构型模式和对象结构型模式两种:在类适配器模式中,适配器与适配者之间是继承(或实现)关系;在对象适配器模式中,适配器与适 阅读全文
posted @ 2021-07-31 18:18 IT6889 阅读(412) 评论(0) 推荐(0)
摘要: 一、装饰模式的定义 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 二、装饰模式优缺点 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个 阅读全文
posted @ 2021-07-31 18:16 IT6889 阅读(1131) 评论(0) 推荐(0)
摘要: 一、享元模式的定义 享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量,避免大量相似类的开销,从而提高系统资源的利用率。 String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重 阅读全文
posted @ 2021-07-31 18:14 IT6889 阅读(141) 评论(0) 推荐(0)
摘要: 一、模板方法模式的定义与特点 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 二、模板方法模式优缺点 该模式的主要优点如下。 它封装了不变部分, 阅读全文
posted @ 2021-07-31 18:11 IT6889 阅读(180) 评论(0) 推荐(0)
摘要: 一、策略模式的定义 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 二、策略模式优缺 阅读全文
posted @ 2021-07-31 18:10 IT6889 阅读(555) 评论(0) 推荐(0)
摘要: 一、模式的定义与特点 观察者(Observer)模式的定义:观察者模式又被称为发布-订阅/模型-视图模式,属于行为型设计模式的一种,是一个在项目中经常使用的模式。指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 二、观察者模式优缺点 观察者模式 阅读全文
posted @ 2021-07-31 18:08 IT6889 阅读(176) 评论(0) 推荐(0)
摘要: 一、模式的定义与特点 迭代器(Iterator)模式的定义:迭代器模式是一种对象行为型模式,提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 二、迭代器模式优缺点 其主要优点如下: 访问一个聚合对象的内容而无须暴露它的内部表示。 遍历任务交由迭代器完成,这简化了聚合类。 它 阅读全文
posted @ 2021-07-31 18:06 IT6889 阅读(115) 评论(0) 推荐(0)
摘要: 一、命令模式的定义 命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 二、命令模式优缺点 命令模式的主要优点如下: 降低系统的耦合度。命令模式能将调用操作的对 阅读全文
posted @ 2021-07-31 18:04 IT6889 阅读(653) 评论(0) 推荐(0)
摘要: 一、中介者模式的定义与特点 中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 二、中介者模式优缺点 中介者模式是一种对象行为型模式,其主要优点如下: 降低了对 阅读全文
posted @ 2021-07-31 18:03 IT6889 阅读(130) 评论(0) 推荐(0)
摘要: 一、访问者模式的定义与特点 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。 二、 阅读全文
posted @ 2021-07-31 18:02 IT6889 阅读(597) 评论(0) 推荐(0)
摘要: 一、备忘录模式的定义与特点 备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。 备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。 阅读全文
posted @ 2021-07-31 17:57 IT6889 阅读(198) 评论(0) 推荐(0)
摘要: 什么是Nginx ? Nginx(发音为“ engine x”)是由俄罗斯软件工程师Igor Sysoev编写的免费开源Web服务器。是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处 阅读全文
posted @ 2021-07-31 17:53 IT6889 阅读(247) 评论(0) 推荐(0)
摘要: 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组虽然也可以存储对象,但长度是固定的;集合长度是可变的,数组中可以存储基本数据类型,集合只能存储对象。 集合类的特点:集合只用于存储对象,集合长度是可变的,集合可以存储不同 阅读全文
posted @ 2021-07-31 17:30 IT6889 阅读(245) 评论(0) 推荐(0)
摘要: Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。 声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一 阅读全文
posted @ 2021-07-31 17:27 IT6889 阅读(1308) 评论(0) 推荐(0)
摘要: 首先,先看SpringBoot的主配置类: @SpringBootApplication public class StartEurekaApplication { public static void main(String[] args) { SpringApplication.run(Star 阅读全文
posted @ 2021-07-31 17:22 IT6889 阅读(503) 评论(0) 推荐(0)
摘要: 本篇章讲解RabbitMQ的用途、原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装 一、MQ用途 1、同步变异步消息 场景:用户下单完成后,发送邮件和短信通知。 运用消息队列之后,用户下单完之后,下单信息写入数据库,再写入消息队列,发送邮件和发送短信各自去消息队 阅读全文
posted @ 2021-07-31 17:17 IT6889 阅读(311) 评论(0) 推荐(0)
摘要: HashMap实现原理及源码分析 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对 阅读全文
posted @ 2021-07-31 17:00 IT6889 阅读(26) 评论(0) 推荐(0)
摘要: 提到集合之前,先说说数组Array和集合的区别: (1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) (2)JAVA集合可以存储和操作数目不固定的一组数据。 (3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。 F 阅读全文
posted @ 2021-07-31 16:56 IT6889 阅读(334) 评论(0) 推荐(0)
摘要: 大致流程 URL 解析 DNS 查询 TCP 连接 处理请求 接受响应 渲染页面 一、URL 解析 地址解析: 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。 HSTS 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问 阅读全文
posted @ 2021-07-31 16:42 IT6889 阅读(557) 评论(0) 推荐(0)