摘要: 责任链模式是一种行为型设计模式。在这种模式中,会为请求创建一条由多个Handler组成的链路。每一个进入的请求,都会经过这条链路。这条链路上的Handler可以选择如下操作: 处理请求或跳过处理 决定是否将请求传给这条链路上的下一个Handler 下面是责任链模式的用例图: 关于责任链模式的用途最好 阅读全文
posted @ 2021-09-25 20:32 robin·张 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 这次介绍最后一个创建型模式——对象池模式。顾名思义,对象池模式就是预先初始化创建好多个对象,并将之保存在一个池子里。当需要的时候,客户端就可以从池子里申请一个对象使用,使用完以后再将之放回到池子里。池子里的对象在应用运行期间永远不会被破坏或回收。 适用场景: 当需要的对象的创建成本比较高,且该类型的 阅读全文
posted @ 2021-09-12 19:25 robin·张 阅读(110) 评论(0) 推荐(1) 编辑
摘要: 原型模式也是一种创建型模式,它可以帮助我们优雅地创建对象的拷贝。在这种设计模式里面,将克隆某个对象的职责交给了要被克隆的这个对象。被克隆的对象需要提供一个clone()方法。通过这个方法可以返回该对象的拷贝。 原型模式的使用场景: 创建新对象的操作比较耗资源(如数据库操作)或代价比较高时。比较起从头 阅读全文
posted @ 2021-09-11 21:52 robin·张 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 单例模式恐怕是最为人熟知的一种设计模式了。它同样也是创建型模式的一种。当某个struct只允许有一个实例的时候,我们会用到这种设计模式。这个struct的唯一的实例被称为单例对象。下面是需要创建单例对象的一些场景: 数据库实例:一般在开发中,对于一个应用,我们通常只需要一个数据库对象实例 日志实例: 阅读全文
posted @ 2021-09-10 22:12 robin·张 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 之前我们介绍了工厂设计模式,现在我们再看一下抽象工厂设计模式。抽象工程模式顾名思义就是对工厂模式的一层抽象,也是创建型模式的一种,通常用来创建一组存在相关性的对象。 UML类图大致如下: 类图比较复杂,最好用个例子来说明。比方说,国内有两家生产运动服的工厂:nike和adidas 。现在我们想购买一 阅读全文
posted @ 2021-09-07 07:05 robin·张 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 工厂模式是一种创建型模式,也是最常用的设计模式之一。调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑。 在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象。工厂负责和相应的struct交互,并返回需要的对象。 如下是工厂模式的UML类图: 接下来是一个工厂模式的 阅读全文
posted @ 2021-09-05 22:44 robin·张 阅读(125) 评论(0) 推荐(1) 编辑
摘要: 建造者模式是一种创建型模式,主要用来创建比较复杂的对象。 建造者模式的使用场景: 建造者模式通常适用于有多个构造器参数或者需要较多构建步骤的场景。使用建造者模式可以精简构造器参数的数量,让构建过程更有条理。 可以为同一个产品提供两个不同的实现。比如,在下面的代码中,为house类型创建了两个不同的实 阅读全文
posted @ 2021-09-05 10:48 robin·张 阅读(139) 评论(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·张 阅读(744) 评论(0) 推荐(0) 编辑
摘要: HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低... 阅读全文
posted @ 2019-03-07 23:05 robin·张 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 1、HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。 2、如何理解HTTP协议是无状态的 HTTP协议... 阅读全文
posted @ 2019-03-06 22:51 robin·张 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 一、前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有... 阅读全文
posted @ 2019-03-05 23:20 robin·张 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 hash 算法 来了一个 key,首先计算 hash 值,然后对节点数取模。然后打在不同的 master 节点上。一旦某一个 master 节点宕机,所有请求过来,都会基于最新的剩余 master 节点数去取模,尝试去取数据... 阅读全文
posted @ 2019-03-05 23:18 robin·张 阅读(1355) 评论(0) 推荐(0) 编辑
摘要: redis cluster,主要是针对海量数据+高并发+高可用的场景。redis cluster 支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node。这样整个 redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点,每个 master 节点就能存放更多的数据了。 redis cluster... 阅读全文
posted @ 2019-03-05 23:13 robin·张 阅读(212) 评论(0) 推荐(0) 编辑
摘要: Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。 redis的多路复用选择器 Redis... 阅读全文
posted @ 2019-03-05 22:57 robin·张 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 一、同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector、HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchornized。 另一个是Collections类中提供的静态工厂方法创建的同步包装类。 同步容器都是线程安全的。但是对于复合操作(迭代、缺少即加入、导航:根据一... 阅读全文
posted @ 2019-03-04 23:12 robin·张 阅读(179) 评论(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·张 阅读(143) 评论(0) 推荐(0) 编辑
摘要: Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。 由于网络开销延迟,就算redis server端有很强的处理能力,也会由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须将部分请求放到队列中(使用内存),执行完毕后一次性发送结果... 阅读全文
posted @ 2019-03-03 22:42 robin·张 阅读(932) 评论(0) 推荐(0) 编辑
摘要: 事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况。 redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间。multi代表事务开始,exec代码事务结束。 eg: 可以看到sadd命令一开始返回的结果是QUEUED,代表命令并没有真正执行,只是暂时存在redis中,只有当exec执行了,这组命令才算是完成。 如果事务中的命令出... 阅读全文
posted @ 2019-03-02 22:52 robin·张 阅读(809) 评论(0) 推荐(0) 编辑
摘要: MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 在一个Redis事务中,Redis要... 阅读全文
posted @ 2019-03-02 22:44 robin·张 阅读(112) 评论(0) 推荐(0) 编辑
摘要: redis主要是一个内存数据库。很多时候是被作为缓存来使用。redis的优势主要体现在和其他缓存方案进行比较,redis的不足主要是和其他数据库进行比较时体现的。 优点: 读写性能优异 支持数据持久化,支持AOF和RDB两种持久化方式 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sorted... 阅读全文
posted @ 2019-03-01 22:37 robin·张 阅读(677) 评论(0) 推荐(1) 编辑
摘要: redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。 为了解决这个问题,redis提供了持久化功能:RDB和AOF。 全量写入:RDB rdb是redis的一种数据持久化策略,redis将某一时间点的数据全部打包生成一个.rdb的文件,保存在磁盘中,当我们重启redis服务... 阅读全文
posted @ 2019-02-28 23:30 robin·张 阅读(148) 评论(0) 推荐(0) 编辑
摘要: Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值。 阅读全文
posted @ 2019-02-28 23:09 robin·张 阅读(2721) 评论(0) 推荐(0) 编辑
摘要: redis采用的是定期删除+惰性删除策略。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略. 定期删除+惰性删除是如何工作的呢? 定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redi... 阅读全文
posted @ 2019-02-27 23:09 robin·张 阅读(462) 评论(0) 推荐(0) 编辑
摘要: CMS收集器 CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下: 初始标记 并发标记 重新标记 并发清除 初始标记、从新标记这两个步骤仍然需要“stop the world”,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,熟读很快,并发标记阶段就是进行GC Roots Tracing,而重新标记阶段则是为了修正并发标记期间因用户程... 阅读全文
posted @ 2019-02-26 23:18 robin·张 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 在Java中,类加载器把一个类加载进Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成验证、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 加载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 验证:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间... 阅读全文
posted @ 2019-02-25 23:20 robin·张 阅读(582) 评论(0) 推荐(0) 编辑
摘要: Spring Cloud Eureka Eureka负责服务的注册于发现,Eureka的角色和 Zookeeper差不多,都是服务的注册和发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。 上图中描述了(图片来源于网络): 两台Eureka服务注册中心构成的服务注册中心的主从复制集群; 然后服务提供者向注册中心进行注册、续约、下线服务等; 服务消费者向Eureka注册中... 阅读全文
posted @ 2019-02-24 23:03 robin·张 阅读(640) 评论(0) 推荐(0) 编辑
摘要: Minor GC触发条件:当Eden区满时,触发Minor GC。 Full GC触发条件: 调用System.gc时,系统建议执行Full GC,但是不必然执行 老年代空间不足 方法去空间不足 通过Minor GC后进入老年代的平均大小大于老年代的可用内存 由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可... 阅读全文
posted @ 2019-02-23 22:58 robin·张 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 封装 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。 封装的优点: 便于使用者正确、方便的使用系统,防止使用者错误修改系统属性; 有助于建立各个系统之间的松耦合关系;提高软件的可重用性; 降低了大型系统的风险,即便整个系统不成功,个别独立的子系统有可能还有价值。 封装的原则又是什么呢,现在我... 阅读全文
posted @ 2019-02-22 23:07 robin·张 阅读(295) 评论(0) 推荐(0) 编辑
摘要: http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。 https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。 阅读全文
posted @ 2019-02-22 22:58 robin·张 阅读(88) 评论(0) 推荐(0) 编辑
摘要: Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。 比如:同时有多个子系统去set一个key。这个时候要注意什么呢? 举一个例子:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4;但是... 阅读全文
posted @ 2019-02-21 23:30 robin·张 阅读(655) 评论(0) 推荐(0) 编辑
摘要: 概述 为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性:在任意时刻,只有一个客户端能持有锁。 不会发生死锁:即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 容错性:只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 一致性:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 首先我们要通过Maven... 阅读全文
posted @ 2019-02-21 23:24 robin·张 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 概述 对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。Spring中每个Bean的生命周期如下: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进... 阅读全文
posted @ 2019-02-20 23:25 robin·张 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。 场景描述 假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊... 阅读全文
posted @ 2019-02-19 22:57 robin·张 阅读(190) 评论(0) 推荐(0) 编辑
摘要: MVC 在SpringMVC中,MVC三部分的作用如下: 执行流程 具体到执行流程上,SpringMVC主要依赖了HandlerMapping 处理器映射器、HandlerAdapter 处理器适配器以及 ViewReslover 视图解析器三个组件。 SpringMVC执行流程示意图如下: 图中将SpringMVC的执行流程分成了11个步骤: 用户发送请求至前端控制器 Dispatcher... 阅读全文
posted @ 2019-02-18 22:56 robin·张 阅读(2238) 评论(0) 推荐(0) 编辑
摘要: IOC初始化流程 Resource定位;指对BeanDefinition的资源定位过程。Bean 可能定义在XML中,或者是一个注解,或者是其他形式。这些都被用Resource来定位, 读取Resource获取BeanDefinition 并注册到 Bean定义注册表中。 BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是... 阅读全文
posted @ 2019-02-17 23:12 robin·张 阅读(972) 评论(0) 推荐(0) 编辑
摘要: IOC的核心理念即是控制反转。将对依赖的控制从具体业务对象手中转交到平台或框架中,需要的时候再由平台或框架注入到具体业务对象中。可以说依赖注入是控制反转的实现方式。 IOC的优点: 降低代码耦合度 减少重复代码和冗余对象 提升可测试性 IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。 在Spring IoC容器的设计中,有两个主要的容器系列,一个是实现了Bean... 阅读全文
posted @ 2019-02-17 22:55 robin·张 阅读(332) 评论(0) 推荐(0) 编辑
摘要: ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应... 阅读全文
posted @ 2019-02-16 22:05 robin·张 阅读(739) 评论(0) 推荐(0) 编辑
摘要: 容器初始化 容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。 1、Resource定位: 在refresh方法中调用obtainFreshBeanFactory方法告诉子类刷新beanfacto... 阅读全文
posted @ 2019-02-16 22:01 robin·张 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 概述 在业务量不大时,单库单表即可支撑。 当数据量过大存储不下、或者并发量过大负荷不起时,就要考虑分库分表。 相关术语 读写分离: 不同的数据库,同步相同的数据,分别只负责数据的读和写; 分区: 指定分区列表达式,把记录拆分到不同的区域中(必须是同一服务器,可以是不同硬盘),应用看来还是同一张表,没有变化; 分库:一个系统的多张数据表,存储到多个数据库实例中; 分表: 对于一张多行(记录)多列(... 阅读全文
posted @ 2019-02-15 23:31 robin·张 阅读(383) 评论(0) 推荐(0) 编辑
摘要: redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛。 redis集群的几种实现方式如下: 客户端分片:优点简单,客户端sharding不支持动态增删节点;劣势很大,服务端Redis实例群拓扑结构有变化时每个客户端都需要更新调整,连接不能共享,当应用规模增大时,资源浪... 阅读全文
posted @ 2019-02-15 00:35 robin·张 阅读(277) 评论(0) 推荐(0) 编辑