摘要: 四次挥手 TIME_WAIT和CLOSE_WAIT主要发生在四次挥手期间。 四次挥手过程: 第一次挥手:主机A(可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机B发送一个FIN报文段;此时,主机A进入FIN_WAIT_1状态;这 阅读全文
posted @ 2022-05-30 22:29 robin·张 阅读(34) 评论(0) 推荐(0) 编辑
摘要: 请求过程 HTTP请求大致可以分为如下步骤: 1. URL解析 之前在简述 URL 中说过,当我们在浏览器中输入一段 URL 的时候,会通过一系列规则,匹配到相应的唯一资源,比如说:http://mu-mu.cn/example/index.html,则是告诉浏览器,我们需要通过http协议,在mu 阅读全文
posted @ 2022-05-30 19:11 robin·张 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 什么是 DNS DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于 TCP/IP 网络。 当我们在浏览器输入一个 URL 地址时,浏览器要向这个 URL 的主机名对应的服务器发送请求,就得知道服务器的 IP,对于浏览器来说,DN 阅读全文
posted @ 2022-05-30 11:07 robin·张 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 代理模式是一种结构型设计模式。这种模式建议在访问对象时,添加一个额外的控制层,以便更灵活智能得对访问进行管理。 在这种模式中,会实现主对象的接口创建一个新的代理类。这让我们在执行主对象的逻辑前可以做一些额外的行为。看两个例子吧: 1. 信用卡可以视为是银行账户的代理。它的操作逻辑和银行账户相同,但却 阅读全文
posted @ 2022-03-13 22:20 robin·张 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 享元模式是一种结构型设计模式。当我们需要为一个类创建大量相同的对象时就可能会需要用到这种设计模式。这些对象被称为享元对象并且是不可变的。 我们先来看一个例子。看完这个例子后我想应该就可以对享元模式有一定了解了。 在《反恐精英》这个游戏中,恐怖分子(Terrorist)和反恐精英(Counter-Te 阅读全文
posted @ 2022-03-13 22:04 robin·张 阅读(91) 评论(0) 推荐(0) 编辑
摘要: 门面模式是一种结构型设计模式。这种模式的作用是隐藏系统底层的复杂逻辑,只提供一个简单易用的接口给调用者。通过门面模式,将系统底层所需要的各种接口整理为一个通用的接口以便于调用方使用。换句话说,就是门面模式为一个复杂系统做了更高层次的抽象。 门面这个词的释义为: 指商店房屋及沿街的部分,指店铺外表 以 阅读全文
posted @ 2022-03-13 21:32 robin·张 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 装饰器模式是一种结构型设计模式。通过装饰器模式可以为一个对象添加额外的功能而不需对其作出调整。 还是通过具体的案例来了解装饰器模式:假设我们开了一家披萨店,现在店里主营两款披萨: 素食狂披萨(Veggie Mania Pizza) 活力豆腐披萨(Peppy Tofu pizza) 以上两款披萨有不同 阅读全文
posted @ 2022-03-13 21:19 robin·张 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 定义 组合模式是一种结构型设计模式。 当我们想把一组对象当做一个整体来处理时就可以考虑使用组合模式。 组合模式被视为是接口型设计模式是因为它将一组对象组装为一个树状结构。这个树状结构中的每个独立组件都可以用同样的方式来处理——无论它们是复杂的还是原始的。 以计算机操作系统中的文件系统为例。在文件系统 阅读全文
posted @ 2022-01-23 22:41 robin·张 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 桥接模式是一种结构型设计模式,通过桥接模式可以将抽象部分和它的实现部分分离。这看着有点儿奇怪,接下来会作详细说明。 桥接模式建议将一个较大的类拆分成两中角色。 抽象角色 - 抽象角色是一个接口。它的子类也被称为修正抽象角色。抽象角色包含一个对实现角色的引用。 实现角色 - 实现角色也是一个接口。实现 阅读全文
posted @ 2022-01-09 22:14 robin·张 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 说明 适配器模式是一种结构型设计模式。我们用常用的两种笔记本电脑来说明一下这种设计模式。 我们常用的笔记本无非是这两大类: Macbook Pro Windows Laptop 当前这两类笔记本常见的一个区别大概是USB接口的类型了: Macbook Pro的USB接口现在多为扁圆形的Type-C接 阅读全文
posted @ 2021-12-26 21:34 robin·张 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 说明 访客模式是一种行为型设计模式。通过访客模式可以为struct添加方法而不需要对其做任何调整。 来看一个例子,假如我们需要维护一个对如下形状执行操作的库: 方形(Square) 圆形(Circle) 长方形(Rectangle) 以上图形的struct都继承自一个共同的shape接口。公司内有多 阅读全文
posted @ 2021-12-18 10:24 robin·张 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 模板方法设计模式是一种行为型设计模式。这种模式通过常用于为某种特定的操作定义一个模板或者算法模型。 以一次性密码(OTP:One Time Password)为例。我们常见的一次性密码有两种:短信密码(SMS OTP)或者邮件密码(Email OTP)。不过不管是短信密码还是邮件密码,它们的处理步骤 阅读全文
posted @ 2021-11-21 23:23 robin·张 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 策略模式是一种行为型设计模式。通过策略模式,可以在运行时修改一个对象的行为。 接下来仍然是通过例子来了解策略模式。比如说内存缓存,这是我们在开发中经常使用的东西,大家应该都有一定的了解,接下来就用内存缓存来说明下如何使用策略模式。 向内存里存东西对于GoLang来说算是比较简单的事情,通过Map就可 阅读全文
posted @ 2021-11-14 20:53 robin·张 阅读(301) 评论(1) 推荐(0) 编辑
摘要: 状态模式,顾名思义,是一种基于有限状态机制的设计模式。在这种设计模式中,行为是由相应的状态来决定的。接下来我们会用一个售卖机的例子来说明下状态模式。为了便于说明,我们把场景简化一下,假设有一台售卖机只卖一种商品,且只有如下四种状态: 有商品 无商品 商品请求中 已收款 一台售卖机也应该会有多种功能, 阅读全文
posted @ 2021-11-13 21:36 robin·张 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 观察者模式是一种行为型设计模式。这种模式允许一个实例(可以称为目标对象)发布各种事件(event)给其他实例(观察者)。这些观察者会对目标对象进行订阅,这样每当目标对象发生变化时,观察者就会收到事件(event)通知。 来看个例子:在电商网站经常会有各种商品脱销,假如有顾客已经在关注这些商品,这些商 阅读全文
posted @ 2021-11-07 17:13 robin·张 阅读(583) 评论(0) 推荐(0) 编辑
摘要: 空对象设计模式是一种行为型设计模式,主要用于应对空对象的检查。使用这种设计模式可以避免对空对象进行检查。也就是说,在这种模式下,使用空对象不会造成异常。 空对象模式的组件包括: Entity:接口,定义了子struct需要实现的方法 ConcreteEntity:实现了Entity 的具体struc 阅读全文
posted @ 2021-11-06 19:39 robin·张 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。 下面是备忘录设计模式的主要角色: Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录 阅读全文
posted @ 2021-10-17 11:53 robin·张 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 中介者模式是一种行为型设计模式。在中介者模式中创建了一个中介对象来负责不同类间的通信。因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果。 中介者模式的一个典型案例是老式小火车站。为保证铁路系统稳定运行,两列火车一般不会直接通信,而是听从车站管理员的调度。这里车站管理员就是一 阅读全文
posted @ 2021-10-16 22:37 robin·张 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 迭代器模式是一种行为型模式。在这种模式中,集合结构会提供一个迭代器。通过这个迭代器可以顺序遍历集合中的每个元素而不需要暴露其具体的实现。 下面是迭代器模式的一些具体实现: Iterator 接口: 这个接口会定义一些基础的操作函数,如hasNext()或getNext()等。通过名称就可以看出,这些 阅读全文
posted @ 2021-10-02 22:25 robin·张 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 命令模式是一种行为型模式。它建议将请求封装为一个独立的对象。在这个对象里包含请求相关的全部信息,因此可以将其独立执行。 在命令模式中有如下基础组件: Receiver:唯一包含业务逻辑的类,命令对象会将请求传递给它,请求的最终处理者 Command:组装了一个Receiver成员,并绑定实现了Rec 阅读全文
posted @ 2021-10-02 19:20 robin·张 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 责任链模式是一种行为型设计模式。在这种模式中,会为请求创建一条由多个Handler组成的链路。每一个进入的请求,都会经过这条链路。这条链路上的Handler可以选择如下操作: 处理请求或跳过处理 决定是否将请求传给这条链路上的下一个Handler 下面是责任链模式的用例图: 关于责任链模式的用途最好 阅读全文
posted @ 2021-09-25 20:32 robin·张 阅读(524) 评论(0) 推荐(0) 编辑
摘要: 这次介绍最后一个创建型模式——对象池模式。顾名思义,对象池模式就是预先初始化创建好多个对象,并将之保存在一个池子里。当需要的时候,客户端就可以从池子里申请一个对象使用,使用完以后再将之放回到池子里。池子里的对象在应用运行期间永远不会被破坏或回收。 适用场景: 当需要的对象的创建成本比较高,且该类型的 阅读全文
posted @ 2021-09-12 19:25 robin·张 阅读(386) 评论(0) 推荐(1) 编辑
摘要: 原型模式也是一种创建型模式,它可以帮助我们优雅地创建对象的拷贝。在这种设计模式里面,将克隆某个对象的职责交给了要被克隆的这个对象。被克隆的对象需要提供一个clone()方法。通过这个方法可以返回该对象的拷贝。 原型模式的使用场景: 创建新对象的操作比较耗资源(如数据库操作)或代价比较高时。比较起从头 阅读全文
posted @ 2021-09-11 21:52 robin·张 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 单例模式恐怕是最为人熟知的一种设计模式了。它同样也是创建型模式的一种。当某个struct只允许有一个实例的时候,我们会用到这种设计模式。这个struct的唯一的实例被称为单例对象。下面是需要创建单例对象的一些场景: 数据库实例:一般在开发中,对于一个应用,我们通常只需要一个数据库对象实例 日志实例: 阅读全文
posted @ 2021-09-10 22:12 robin·张 阅读(432) 评论(0) 推荐(0) 编辑
摘要: 之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式。抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象。 UML类图大致如下: 类图比较复杂,最好用个例子来说明。比方说,国内有两家生产运动服的工厂:nike和adidas 。现在我们想购买一 阅读全文
posted @ 2021-09-07 07:05 robin·张 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 工厂模式是一种创建型模式,也是最常用的设计模式之一。调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑。 在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象。工厂负责和相应的struct交互,并返回需要的对象。 如下是工厂模式的UML类图: 接下来是一个工厂模式的 阅读全文
posted @ 2021-09-05 22:44 robin·张 阅读(396) 评论(0) 推荐(1) 编辑
摘要: 建造者模式是一种创建型模式,主要用来创建比较复杂的对象。 建造者模式的使用场景: 建造者模式通常适用于有多个构造器参数或者需要较多构建步骤的场景。使用建造者模式可以精简构造器参数的数量,让构建过程更有条理。 可以为同一个产品提供两个不同的实现。比如,在下面的代码中,为house类型创建了两个不同的实 阅读全文
posted @ 2021-09-05 10:48 robin·张 阅读(590) 评论(0) 推荐(0) 编辑
摘要: HashMap的put方法执行过程可以通过下图来理解,自己有兴趣可以去对比源码更清楚地研究学习。 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③; ③.判table[i]的首个元素是否和key一样,如果相... 阅读全文
posted @ 2019-03-08 23:32 robin·张 阅读(792) 评论(0) 推荐(0) 编辑
摘要: HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此 阅读全文
posted @ 2019-03-07 23:05 robin·张 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 1、HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺 阅读全文
posted @ 2019-03-06 22:51 robin·张 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 一、前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了 阅读全文
posted @ 2019-03-05 23:20 robin·张 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 hash 算法 来了一个 key,首先计算 hash 值,然后对节点数取模。然后打在不同的 master 节点上。一旦某一个 阅读全文
posted @ 2019-03-05 23:18 robin·张 阅读(1505) 评论(0) 推荐(0) 编辑
摘要: redis cluster,主要是针对海量数据+高并发+高可用的场景。redis cluster 支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node。这样整个 redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更 阅读全文
posted @ 2019-03-05 23:13 robin·张 阅读(229) 评论(0) 推荐(0) 编辑
摘要: Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同 阅读全文
posted @ 2019-03-05 22:57 robin·张 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 一、同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector、HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchornized。 另一个是Collections类中提供的静态工厂方法创建的同步包装类。 同步容器都是线程安全的。但是对于复合操作(迭代、缺少即加入、导航:根据一... 阅读全文
posted @ 2019-03-04 23:12 robin·张 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 这份面试题,包含的内容了十九了模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要看后面的框架和 JVM 模块的... 阅读全文
posted @ 2019-03-04 22:13 robin·张 阅读(161) 评论(0) 推荐(0) 编辑
摘要: Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。 由于网络开销延迟,就算redis server端有很强的处理能力,也会由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须将部分请求放到队列中(使用内存),执行完毕后一次性发送结果... 阅读全文
posted @ 2019-03-03 22:42 robin·张 阅读(1127) 评论(0) 推荐(0) 编辑
摘要: 事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况。 redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间。multi代表事务开始,exec代码事务结束。 eg: 可以看到sadd命令一开始返回的结果是QUEUED,代表命令并没有真正执行,只是暂时存在redis中,只有当exec执行了,这组命令才算是完成。 如果事务中的命令出... 阅读全文
posted @ 2019-03-02 22:52 robin·张 阅读(924) 评论(0) 推荐(0) 编辑
摘要: MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 在一个Redis事务中,Redis要... 阅读全文
posted @ 2019-03-02 22:44 robin·张 阅读(126) 评论(0) 推荐(0) 编辑
摘要: redis主要是一个内存数据库。很多时候是被作为缓存来使用。redis的优势主要体现在和其他缓存方案进行比较,redis的不足主要是和其他数据库进行比较时体现的。 优点: 读写性能优异 支持数据持久化,支持AOF和RDB两种持久化方式 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sorted... 阅读全文
posted @ 2019-03-01 22:37 robin·张 阅读(1062) 评论(0) 推荐(1) 编辑