摘要: HashMap的put方法执行过程可以通过下图来理解,自己有兴趣可以去对比源码更清楚地研究学习。 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③; ③.判table[i]的首个元素是否和key一样,如果相...阅读全文
posted @ 2019-03-08 23:32 robin·张 阅读(19) 评论(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·张 阅读(6) 评论(0) 编辑
摘要: 1、HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。 2、如何理解HTTP协议是无状态的 HTTP协议...阅读全文
posted @ 2019-03-06 22:51 robin·张 阅读(5) 评论(0) 编辑
摘要: 一、前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合),丰富的类型是Redis相对于Memcached等的一大优势。在了解Redis的5种对象类型的用法和特点的基础上,进一步了解Redis的内存模型,对Redis的使用有...阅读全文
posted @ 2019-03-05 23:20 robin·张 阅读(9) 评论(0) 编辑
摘要: 分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 hash 算法 来了一个 key,首先计算 hash 值,然后对节点数取模。然后打在不同的 master 节点上。一旦某一个 master 节点宕机,所有请求过来,都会基于最新的剩余 master 节点数去取模,尝试去取数据...阅读全文
posted @ 2019-03-05 23:18 robin·张 阅读(47) 评论(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·张 阅读(4) 评论(0) 编辑
摘要: Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。 redis的多路复用选择器 Redis...阅读全文
posted @ 2019-03-05 22:57 robin·张 阅读(4) 评论(0) 编辑
摘要: 一、同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector、HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并在需要同步的方法上加上关键字synchornized。 另一个是Collections类中提供的静态工厂方法创建的同步包装类。 同步容器都是线程安全的。但是对于复合操作(迭代、缺少即加入、导航:根据一...阅读全文
posted @ 2019-03-04 23:12 robin·张 阅读(5) 评论(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·张 阅读(16) 评论(0) 编辑
摘要: Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。 由于网络开销延迟,就算redis server端有很强的处理能力,也会由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须将部分请求放到队列中(使用内存),执行完毕后一次性发送结果...阅读全文
posted @ 2019-03-03 22:42 robin·张 阅读(11) 评论(0) 编辑
摘要: 事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况。 redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间。multi代表事务开始,exec代码事务结束。 eg: 可以看到sadd命令一开始返回的结果是QUEUED,代表命令并没有真正执行,只是暂时存在redis中,只有当exec执行了,这组命令才算是完成。 如果事务中的命令出...阅读全文
posted @ 2019-03-02 22:52 robin·张 阅读(13) 评论(0) 编辑
摘要: MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 在一个Redis事务中,Redis要...阅读全文
posted @ 2019-03-02 22:44 robin·张 阅读(8) 评论(0) 编辑
摘要: redis主要是一个内存数据库。很多时候是被作为缓存来使用。redis的优势主要体现在和其他缓存方案进行比较,redis的不足主要是和其他数据库进行比较时体现的。 优点: 读写性能优异 支持数据持久化,支持AOF和RDB两种持久化方式 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sorted...阅读全文
posted @ 2019-03-01 22:37 robin·张 阅读(26) 评论(0) 编辑
摘要: redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失。 为了解决这个问题,redis提供了持久化功能:RDB和AOF。 全量写入:RDB rdb是redis的一种数据持久化策略,redis将某一时间点的数据全部打包生成一个.rdb的文件,保存在磁盘中,当我们重启redis服务...阅读全文
posted @ 2019-02-28 23:30 robin·张 阅读(8) 评论(0) 编辑
摘要: Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值。阅读全文
posted @ 2019-02-28 23:09 robin·张 阅读(101) 评论(0) 编辑
摘要: redis采用的是定期删除+惰性删除策略。 为什么不用定时删除策略? 定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略. 定期删除+惰性删除是如何工作的呢? 定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redi...阅读全文
posted @ 2019-02-27 23:09 robin·张 阅读(16) 评论(0) 编辑
摘要: CMS收集器 CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下: 初始标记 并发标记 重新标记 并发清除 初始标记、从新标记这两个步骤仍然需要“stop the world”,初始标记仅仅只是标记一下GC Roots能直接关联到的对象,熟读很快,并发标记阶段就是进行GC Roots Tracing,而重新标记阶段则是为了修正并发标记期间因用户程...阅读全文
posted @ 2019-02-26 23:18 robin·张 阅读(16) 评论(0) 编辑
摘要: 在Java中,类加载器把一个类加载进Java虚拟机中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成验证、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下: 加载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 验证:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间...阅读全文
posted @ 2019-02-25 23:20 robin·张 阅读(19) 评论(0) 编辑
摘要: Spring Cloud Eureka Eureka负责服务的注册于发现,Eureka的角色和 Zookeeper差不多,都是服务的注册和发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。 上图中描述了(图片来源于网络): 两台Eureka服务注册中心构成的服务注册中心的主从复制集群; 然后服务提供者向注册中心进行注册、续约、下线服务等; 服务消费者向Eureka注册中...阅读全文
posted @ 2019-02-24 23:03 robin·张 阅读(13) 评论(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·张 阅读(5) 评论(0) 编辑
摘要: 封装 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。 封装的优点: 便于使用者正确、方便的使用系统,防止使用者错误修改系统属性; 有助于建立各个系统之间的松耦合关系;提高软件的可重用性; 降低了大型系统的风险,即便整个系统不成功,个别独立的子系统有可能还有价值。 封装的原则又是什么呢,现在我...阅读全文
posted @ 2019-02-22 23:07 robin·张 阅读(8) 评论(0) 编辑
摘要: http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。 https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。阅读全文
posted @ 2019-02-22 22:58 robin·张 阅读(3) 评论(0) 编辑
摘要: Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。 比如:同时有多个子系统去set一个key。这个时候要注意什么呢? 举一个例子:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4;但是...阅读全文
posted @ 2019-02-21 23:30 robin·张 阅读(14) 评论(0) 编辑
摘要: 概述 为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性:在任意时刻,只有一个客户端能持有锁。 不会发生死锁:即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 容错性:只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 一致性:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 首先我们要通过Maven...阅读全文
posted @ 2019-02-21 23:24 robin·张 阅读(19) 评论(0) 编辑
摘要: 概述 对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制。Spring中每个Bean的生命周期如下: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进...阅读全文
posted @ 2019-02-20 23:25 robin·张 阅读(19) 评论(0) 编辑
摘要: 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。 场景描述 假设,我们有三台缓存服务器,用于缓存图片,我们为这三台缓存服务器编号为0号、1号、2号,现在,有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊...阅读全文
posted @ 2019-02-19 22:57 robin·张 阅读(14) 评论(0) 编辑
摘要: MVC 在SpringMVC中,MVC三部分的作用如下: 执行流程 具体到执行流程上,SpringMVC主要依赖了HandlerMapping 处理器映射器、HandlerAdapter 处理器适配器以及 ViewReslover 视图解析器三个组件。 SpringMVC执行流程示意图如下: 图中将SpringMVC的执行流程分成了11个步骤: 用户发送请求至前端控制器 Dispatcher...阅读全文
posted @ 2019-02-18 22:56 robin·张 阅读(130) 评论(0) 编辑
摘要: IOC初始化流程 Resource定位;指对BeanDefinition的资源定位过程。Bean 可能定义在XML中,或者是一个注解,或者是其他形式。这些都被用Resource来定位, 读取Resource获取BeanDefinition 并注册到 Bean定义注册表中。 BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是...阅读全文
posted @ 2019-02-17 23:12 robin·张 阅读(28) 评论(0) 编辑
摘要: IOC的核心理念即是控制反转。将对依赖的控制从具体业务对象手中转交到平台或框架中,需要的时候再由平台或框架注入到具体业务对象中。可以说依赖注入是控制反转的实现方式。 IOC的优点: 降低代码耦合度 减少重复代码和冗余对象 提升可测试性 IoC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。 在Spring IoC容器的设计中,有两个主要的容器系列,一个是实现了Bean...阅读全文
posted @ 2019-02-17 22:55 robin·张 阅读(11) 评论(0) 编辑
摘要: ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应...阅读全文
posted @ 2019-02-16 22:05 robin·张 阅读(15) 评论(0) 编辑
摘要: 容器初始化 容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。 1、Resource定位: 在refresh方法中调用obtainFreshBeanFactory方法告诉子类刷新beanfacto...阅读全文
posted @ 2019-02-16 22:01 robin·张 阅读(12) 评论(0) 编辑
摘要: 概述 在业务量不大时,单库单表即可支撑。 当数据量过大存储不下、或者并发量过大负荷不起时,就要考虑分库分表。 相关术语 读写分离: 不同的数据库,同步相同的数据,分别只负责数据的读和写; 分区: 指定分区列表达式,把记录拆分到不同的区域中(必须是同一服务器,可以是不同硬盘),应用看来还是同一张表,没有变化; 分库:一个系统的多张数据表,存储到多个数据库实例中; 分表: 对于一张多行(记录)多列(...阅读全文
posted @ 2019-02-15 23:31 robin·张 阅读(19) 评论(0) 编辑
摘要: redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛。 redis集群的几种实现方式如下: 客户端分片:优点简单,客户端sharding不支持动态增删节点;劣势很大,服务端Redis实例群拓扑结构有变化时每个客户端都需要更新调整,连接不能共享,当应用规模增大时,资源浪...阅读全文
posted @ 2019-02-15 00:35 robin·张 阅读(7) 评论(0) 编辑
摘要: sentinel简介 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)没有实现自动进行主备切换。而Redis-sentinel是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。 它的主要功能有以下几点: ...阅读全文
posted @ 2019-02-15 00:26 robin·张 阅读(8) 评论(0) 编辑
摘要: Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。 Master&Slave的作用主要有两个: 读写分离; 容灾恢复。 redis replication核心机制 redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量 一个maste...阅读全文
posted @ 2019-02-15 00:16 robin·张 阅读(8) 评论(0) 编辑
摘要: Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。 它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps,Hyperloglogs 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、Li...阅读全文
posted @ 2019-02-13 23:49 robin·张 阅读(16) 评论(0) 编辑
摘要: 著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。 Zookeeper保证CP 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功...阅读全文
posted @ 2019-02-12 23:23 robin·张 阅读(15) 评论(0) 编辑
摘要: 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 解决办法: 预校验 在控制层对查询参数先进行校验,不符合则丢弃。 布隆过滤 将所有可能查询的参数添加到BloomFilter中,一定不存在的记录就会被BloomFilter过滤掉,从而避免了对底层存储系统的查询压力。 缓存空...阅读全文
posted @ 2019-02-12 23:15 robin·张 阅读(12) 评论(0) 编辑
摘要: CAP原则 CAP原则又称CAP定理,是一个经典的分布式系统理论。CAP理论告诉我们:一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中两项。 一致性 在分布式环境下,一致性是指数据在多个副本之间能否保持一致的特性。在一致性的需求下,当一个系统在数据一...阅读全文
posted @ 2019-02-12 00:06 robin·张 阅读(10) 评论(0) 编辑
摘要: logs innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位...阅读全文
posted @ 2019-02-10 23:08 robin·张 阅读(11) 评论(0) 编辑