巨为科技 JAVA 岗面试题

这是本人在公司面试时遇到的面试题,十分具备表明性,但愿可以给与各位一些借鉴,在学习的路上少走弯路。。。html

1. java 中 sleep 方法和 wait 方法的区别?前端

首先sleep方法来自Thread类,线程进入sleep方法后不会释放自身的锁,sleep能够在任何地方使用,并且必需要捕获异常,因为sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待必定的时间以后,自动醒来进入到可运行状态,不会立刻进入运行状态,由于线程调度机制恢复线程的运行也是须要时间的。java

wait是object类中的方法,线程进入wait方法后会释放自身的锁,使得其余线程能够使用同步控制块或者方法,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,并且wait,notify和notifyAll不须要捕获异常 ,wait属于Object的成员方法,一旦一个对象调用了wait方法,必需要采用notify()和notifyAll()方法唤醒该进程;若是线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的全部同步资源,而不限于这个被调用了wait()方法的对象。 mysql

2.Java Object 类中有哪些方法?linux

 1.clone方法web

保护方法,实现对象的浅复制,只有实现了Cloneable接口才能够调用该方法,不然抛出CloneNotSupportedException异常。面试

2.getClass方法

final方法,得到运行时类型。redis

3.toString方法

该方法用得比较多,通常子类都有覆盖。算法

4.finalize方法

该方法用于释放资源。由于没法肯定该方法何时被调用,不多使用。spring

5.equals方法

该方法是很是重要的一个方法。通常equals和==是不同的,可是在Object中二者是同样的。子类通常都要重写这个方法。

6.hashCode方法

该方法用于哈希查找,重写了equals方法通常都要重写hashCode方法。这个方法在一些具备哈希功能的Collection中用到。

通常必须知足obj1.equals(obj2)==true。能够推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不过为了提升效率,应该尽可能使上面两个条件接近等价。

7.wait方法

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具备该对象的锁。wait()方法一直等待,直到得到锁或者被中断。wait(longtimeout)设定一个超时间隔,若是在规定时间内没有得到锁就返回。

调用该方法后当前线程进入睡眠状态,直到如下事件发生。

(1)其余线程调用了该对象的notify方法。

(2)其余线程调用了该对象的notifyAll方法。

(3)其余线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就能够被调度了,若是是被中断的话就抛出一个InterruptedException异常。

8.notify方法

该方法唤醒在该对象上等待的某个线程。

9.notifyAll方法

该方法唤醒在该对象上等待的全部线程。

3.Java char 类型占几个字节?能存储一个汉字?

,java中的一个char的确是2个字节。java采用unicode,2个字节来表示一个字符

一个数字英文汉字都是一个字符,只不过数字和英文时,存储的2个字节的第一个字节都为0,就是浪费了点空间。存汉字就占满了2个字节。

4.B 继承 A,C 继承 B,咱们能 B 转换为 C 么?如 C=(C)B;

能够,这属于强制类型转换,若是被转换的B实例不是C类型,会有异常

5. 你经常使用的设计模式都有哪些?

1、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
2、Abstract Factory,抽象工厂:提供一个建立一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
3、Factory Method,工厂方法:定义一个用于建立对象的接口,让子类决定实例化哪个类,Factory Method使一个类的实例化延迟到了子类。
4、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得一样的构建过程能够建立不一样的表示。
5、Prototype,原型模式:用原型实例指定建立对象的种类,而且经过拷贝这些原型来建立新的对象。
行为型有:
6、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不须要暴露该对象的内部表示。
7、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都获得通知自动更新。
8、Template Method,模板方法:定义一个操做中的算法骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类能够不改变一个算法的结构便可以重定义该算法得某些特定步骤。
9、Command,命令模式:将一个请求封装为一个对象,从而使你能够用不一样的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操做。
10、State,状态模式:容许对象在其内部状态改变时改变他的行为。对象看起来彷佛改变了他的类。
11、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们能够互相替换,本模式使得算法能够独立于使用它们的客户。
12、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十3、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十4、Visitor,访问者模式:表示一个做用于某对象结构中的各元素的操做,它使你能够在不改变各元素类的前提下定义做用于这个元素的新操做。
十5、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十6、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。
结构型有:
十7、Composite,组合模式:将对象组合成树形结构以表示部分总体的关系,Composite使得用户对单个对象和组合对象的使用具备一致性
十8、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十9、Proxy,代理模式:为其余对象提供一种代理以控制对这个对象的访问
二10、Adapter,适配器模式:将一类的接口转换成客户但愿的另一个接口,Adapter模式使得本来因为接口不兼容而不能一块儿工做那些类能够一块儿工做。
二11、Decrator,装饰模式:动态地给一个对象增长一些额外的职责,就增长的功能来讲,Decorator模式相比生成子类更加灵活。
二12、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们能够独立的变化。
二十3、Flyweight,享元模式

6. 你对分布式的理解?

分布式架构下系统间交互的5种通讯模式

request/response模式(同步模式):客户端发起请求一直阻塞到服务端返回请求为止。

Callback(异步模式):客户端发送一个RPC请求给服务器,服务端处理后再发送一个消息给消息发送端提供的callback端点,此类状况很是合适如下场景:A组件发送RPC请求给B,B处理完成后,须要通知A组件作后续处理。

Future模式:客户端发送完请求后,继续作本身的事情,返回一个包含消息结果的Future对象。客户端须要使用返回结果时,使用Future对象的.get(),若是此时没有结果返回的话,会一直阻塞到有结果返回为止。

Oneway模式:客户端调用完继续执行,无论接收端是否成功。

Reliable模式:为保证通讯可靠,将借助于消息中心来实现消息的可靠送达,请求将作持久化存储,在接收方在线时作送达,并由消息中心保证异常重试。

分布式系统(distributed system)是创建在网络之上的软件系统。正是由于软件特性,因此分布式系统具备高度的内聚性和透明性。所以,网络和分布式系统之间的区别更多的在于高层软件(特别是操做系统),而不是硬件。内聚性是指每个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每个数据库分布节点对用户的应用来讲都是透明的,看不出是本地仍是远程。在分布式数据库系统中,用户感受不到数据是分布的,即用户不须知道关系是否分割、有无复本、数据存于哪一个站点以及事务在哪一个站点上执行等。

故名思义,分布式系统就是将系统的应用层数据层或其它部分构架成分布(物理和逻辑上的均可以)状(一般是网状)。分布式系统一般是为了加强系统的可扩展性稳定性和执行效率。好比在线游戏一般就是分布系统,里面所谓的“区”就是分布系统里子例程。而分布式数据库其实也能够称做分布式系统,数据持久化层是分布的(数据存在不一样的数据库中,可交互,有一套综管系统来维护数据的完整性和准确性)。
因此说分布式系统更准确地说是一种系统构架概念,不是一种技术。

7.Servlet 都有哪些方法

HttpServlet 类包含 init() 、 destroy() 、 service() 等方法。其中 init() 和 destroy() 方法是继承的。

8. 描述 List,Set,Map 和 Queue 的线程安全性
Set集合:
1) HashSet的性能老是比TreeSet好(特别是最经常使用的添加、查询元素等操做),由于TreeSet须要额外的红黑树算法来维护集合元素的次序。只有当须要一个保持排序的Set时,才应该使用TreeSet,不然都应该使用HashSet
2) 对于普通的插入、删除操做,LinkedHashSet比HashSet要略慢一点,这是由维护链表所带来的开销形成的。不过,由于有了链表的存在,遍历LinkedHashSet会更快
3) EnumSet是全部Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值做为集合元素
4) HashSet、TreeSet、EnumSet都是"线程不安全"的,一般能够经过Collections工具类的synchronizedSortedSet方法来"包装"该Set集合。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
List集合:
1. java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现
2. Queue表明了队列,Deque表明了双端队列(既能够做为队列使用、也能够做为栈使用)
3. 由于数组以一块连续内存来保存全部的数组元素,因此数组在随机访问时性能最好。因此的内部以数组做为底层实现的集合在随机访问时性能最好。
4. 内部以链表做为底层实现的集合在执行插入、删除操做时有很好的性能
5. 进行迭代操做时,以链表做为底层实现的集合比以数组做为底层实现的集合性能好
Map集合:
1) HashMap和Hashtable的效率大体相同,由于它们的实现机制几乎彻底同样。但HashMap一般比Hashtable要快一点,由于Hashtable须要额外的线程同步控制
2) TreeMap一般比HashMap、Hashtable要慢(尤为是在插入、删除key-value对时更慢),由于TreeMap底层采用红黑树来管理key-value对
3) 使用TreeMap的一个好处就是: TreeMap中的key-value对老是处于有序状态,无须专门进行排序操做

3) Queue

Queue用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操做会返回队列头部的元素,队列不容许随机访问队列中的元素。结合生活中常见的排队就会很好理解这个概念

9.SpringMVC 的工做原理

SpringMVC流程

一、  用户发送请求至前端控制器DispatcherServlet。

二、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

三、  处理器映射器找到具体的处理器(能够根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(若是有则生成)一并返回给DispatcherServlet。

四、  DispatcherServlet调用HandlerAdapter处理器适配器。

五、  HandlerAdapter通过适配调用具体的处理器(Controller,也叫后端控制器)。

六、  Controller执行完成返回ModelAndView。

七、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

八、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

九、  ViewReslover解析后返回具体View。

十、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

十一、 DispatcherServlet响应用户。

10. Spring 事物传播行为都有哪些?并说下每一个传播行为的区别。

spring事物的传播行为

 

1.spring事物的传播行为,主要是用来解决业务层拥有事物的方法,相互调用的问题。

2.声明事物,

在代码执行前,开启事务。代码执行完,提交事务

3.spring并无提供事务具体的处理,而只是调用orm框架的事务,connection的事务。

spring只是对底层事务作了一层封装。

4.spring对事务管理主要用了三个APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。

spring对TransactionManager不一样的orm框架进行了不一样的实现,如hibernate TransactionManager,DatasourceTransactionManager。

 不一样的transactionManager实现。

5.TransactionDefiniton定义了事务具体的定义,如传播状态,隔离级别,和是否只读。

11. Redis 支持的数据类型

一、string(字符串)

二、hash(哈希)

  Redis hash 是一个键值(key=>value)对集合。
  Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

三、list(列表)

  Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素到列表的头部(左边)或者尾部(右边)。

四、set(集合)

  Redis的Set是string类型的无序集合。

五、zset(sorted set:有序集合)

  Redis zset 和 set 同样也是string类型元素的集合,且不容许重复的成员。
  不一样的是每一个元素都会关联一个double类型的分数。redis正是经过分数来为集合中的成员进行从小到大的排序。
  zset的成员是惟一的,但分数(score)却能够重复。

12. Redis 经常使用命令

清空Redis全部key:
flush db # 清除当前数据库的全部keys
flush all # 清除全部数据库的全部keys
查询匹配key:
keys * # 查看全部keys
keys prefix_* # 查看前缀为"prefix_"的全部keys
key基本操做:
exists key # 确认一个key是否存在
set key value # 设置key和value
get key # 获取key的value
del key # 删除一个key
type key # 返回值的类型
keys pattern # 返回知足给定pattern的全部key
random key # 随机返回key空间的一个
key rename oldname newname # 重命名key
db size # 返回当前数据库中key的数目
select index # 选择第0~15中

 
 

什么是应用服务雪崩?

雪崩问题

分布式系统都存在这样一个问题,因为网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的。当网络不稳定的时候,做为服务的提供者,自身可能会被拖死,致使服务调用者阻塞,最终可能引起雪崩连锁效应。

缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(好比DB)带来很大压力,形成数据库后端故障,从而引发应用服务器雪崩。

雪崩效应产生的几种场景

 

流量激增:好比异常流量、用户重试致使系统负载升高;

缓存刷新:假设A为client端,B为Server端,假设A系统请求都流向B系统,请求超出了B系统的承载能力,就会形成B系统崩溃;

程序有Bug:代码循环调用的逻辑问题,资源未释放引发的内存泄漏等问题;

硬件故障:好比宕机,机房断电,光纤被挖断等。

数据库严重瓶颈,好比:长事务、sql超时等。

线程同步等待:系统间常常采用同步服务调用模式,核心服务和非核心服务共用一个线程池和消息队列。若是一个核心业务线程调用非核心线程,这个非核心线程交由第三方系统完成,当第三方系统自己出现问题,致使核心线程阻塞,一直处于等待状态,而进程间的调用是有超时限制的,最终这条线程将断掉,也可能引起雪崩;

缓存雪崩的解决方案

缓存失效的几种状况:

一、缓存服务器挂了

二、高峰期缓存局部失效

三、热点缓存失效

解决方案:

 

一、避免缓存集中失效,不一样的key设置不一样的超时时间

二、增长互斥锁,控制数据库请求,重建缓存。

三、提升缓存的HA,如:redis集群。

雪崩的总体解决方案

通常状况对于服务依赖的保护主要有3种解决方案:

 

(1)熔断模式

这种模式主要是参考电路熔断,若是一条线路电压太高,保险丝会熔断,防止火灾。放到咱们的系统中,若是某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。若是目标服务状况好转则恢复调用。

重点监控的机器性能指标

cpu(Load) cpu使用率/负载

memory 内存

mysql监控长事务(这里与sql查询超时是紧密结合的,须要重点监控)

sql超时

线程数等

总之,除了cpu、内存、线程数外,重点监控数据库端的长事务、sql超时等,绝大多数应用服务器发生的雪崩场景,都是来源于数据库端的性能瓶颈,从而先引发数据库端大量瓶颈,最终拖累应用服务器也发生雪崩,最后就是大面积的雪崩。

(2)隔离模式

这种模式就像对系统请求按类型划分红一个个小岛的同样,当某个小岛被火少光了,不会影响到其余的小岛。

例如能够对不一样类型的请求使用线程池来资源隔离,每种类型的请求互不影响,若是一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,再也不调用后续资源。这种模式使用场景很是多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。

(3)限流模式

上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则能够称为预防模式。限流模式主要是提早对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,再也不调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统总体资源分配问题,由于没有被限流的请求依然有可能形成雪崩效应。

熔断设计

在熔断的设计主要参考了hystrix的作法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警

(1)熔断请求判断机制算法:使用无锁循环队列计数,每一个熔断器默认维护10个bucket,每1秒一个bucket,每一个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。

(2)熔断恢复:对于被熔断的请求,每隔5s容许部分请求经过,若请求都是健康的(RT<250ms)则对请求健康恢复。

(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警。

隔离设计

隔离的方式通常使用两种

(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求做处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式须要为每一个依赖的服务申请线程池,有必定的资源消耗,好处是能够应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操做请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且当即返回模式,没法应对突发流量(流量洪峰来临时,处理的线程超过数量,其余的请求会直接返回,不继续去请求依赖的服务)

超时机制设计

(1)超时分两种,一种是请求的等待超时,一种是请求运行超时。

(2)等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。

(3)运行超时:直接可以使用线程池提供的get方法。

如何提早发现雪崩

就是首先让系统不雪崩,而后经过监控发现请求正在接近或者超过阀值,而后再根据具体状况处理,这个接近或者超过阀值的过程,能够称为 “提早发现雪崩”。

以上就是应用服务雪崩的场景以及技术方案总结。

 
 
 
15. 经常使用的 MYSQL 优化有哪些?
、配置优化
配置的优化其实包含两个方面的:操做系统内核的优化和mysql配置文件的优化
1)系统内核的优化对专用的mysql服务器来讲,无非是内存实用、链接数、超时处理、TCP处理等方面的优化,根据本身的硬件配置来进行优化,这里很少讲;
2)mysql配置的优化,通常来讲包含:IO处理的经常使用参数、最大链接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,若是有主从关系在设置主从同步的相关参数便可,网上的相关配置文件不少,大同小异,经常使用的设置大多修改这些差很少就够用了。
二、 sql语句的优化
一、 尽可能稍做计算
Mysql的做用是用来存取数据的,不是作计算的,作计算的话能够用其余方法去实现,mysql作计算是很耗资源的。

2.尽可能少 join

MySQL 的优点在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,可是因为其 统计信息的量有限,优化器工做过程出现误差的可能性也就更多。对于复杂的多表 Join,一方面因为其优化器受限,再者在 Join 这方面所下的功夫还不够,因此性能表现离 Oracle 等关系型数据库前辈仍是有必定距离。但若是是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

3.尽可能少排序

  排序操做会消耗较多的 CPU 资源,因此减小排序能够在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的 响应时间
  对于MySQL来讲,减小排序有多种办法,好比:
  经过利用索引来排序的方式进行优化
  减小参与排序的记录条数
  非必要不对数据进行排序

4.尽可能避免 select *

  在数据量少而且 访问量不大的状况下,select * 没有什么影响,可是量级达到必定级别的时候,在执行效率和IO资源的使用上,仍是有很大关系的,用什么字段取什么字段,减小没必要要的资源浪费。
以前遇到过由于一个字段存储的数据比较大,并发高的状况下把网络带宽跑满的状况,形成网站打不开或是打开速度极慢的状况。

5.尽可能用 join 代替子查询

  虽然 Join 性能并不佳,可是和 MySQL 的子查询比起来仍是有很是大的性能优点。MySQL 的子查询执行计划一直存在较大的问题,虽然这个问题已经存在多年,可是到目前已经发布的全部稳定版本中都广泛存在,一直没有太大改善。虽然官方也在很早就认可这一问题,而且承诺尽快解决,可是至少到目前为止咱们尚未看到哪个版本较好的解决了这一问题。

6.尽可能少 or

  当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并无很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,形成了其性能比较低下,不少时候使用 union all 或者是union(必要的时候)的方式来代替“or”会获得更好的效果。

7.尽可能用 union all 代替 union

union 和 union all 的差别主要是前者须要将两个(或者多个)结果集合并后再进行惟一性过滤操做,这就会涉及到排序,增长大量的 CPU 运算,加大资源消耗及延迟。因此当咱们能够确认不可能出现重复结果集或者不在意重复结果集的时候,尽可能使用 union all 而不是 union。

8.尽可能早过滤

  这一优化策略其实最多见于索引的优化设计中(将过滤性更好的字段放得更靠前)。

  在 SQL 编写中一样能够使用这一原则来优化一些 Join 的 SQL。好比咱们在多个表进行分页数据查询的时候,咱们最好是可以在一个表上先过滤好数据分好页,而后再用分好页的结果集与另外的表 Join,这样能够尽量多的减小没必要要的 IO 操做,大大节省 IO 操做所消耗的时间。

9.避免类型转换

  这里所说的“类型转换”是指 where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换:
A:人为在column_name 上经过转换函数进行转换
  直接致使 MySQL(实际上其余数据库也会有一样的问题)没法使用索引,若是非要转换,应该在传入的参数上进行转换
B:由数据库本身进行转换
  若是咱们传入的数据类型和字段类型不一致,同时咱们又没有作任何类型转换处理,MySQL 可能会本身对咱们的数据进行类型转换操做,也可能不进行处理而交由 存储引擎去处理,这样一来,就会出现索引没法使用的状况而形成执行计划问题。
以上两种状况在开发者由于某种缘由常常会有,原本能够用到索引的结果类型不对没有用到索引,或是由于类型不对又有越界的状况发生形成没法使用索引的状况,结果形成很严重的事故。

10.优先优化高并发的 SQL,而不是执行频率低某些“大”SQL

  对于破坏性来讲,高并发的 SQL 老是会比低频率的来得大,由于高并发的 SQL 一旦出现问题,甚至不会给咱们任何喘息的机会就会将系统压跨。而对于一些虽然须要消耗大量 IO 并且响应很慢的 SQL,因为频率低,即便遇到,最多就是让整个系统响应慢一点,但至少可能撑一下子,让咱们有缓冲的机会。

11.从全局出发优化,而不是片面调整

SQL 优化不能是单独针对某一个进行,而应充分考虑系统中全部的 SQL,尤为是在经过调整索引优化 SQL 的执行计划的时候,千万不能顾此失彼,因小失大。

12.尽量对每一条运行在数据库中的SQL进行 explain

优化 SQL,须要作到心中有数,知道SQL 的执行计划才能判断是否有优化余地,才能判断是否存在执行计划问题。在对数据库中运行的 SQL 进行了一段时间的优化以后,很明显的问题 SQL 可能已经不多了,大多都须要去发掘,这时候就须要进行大量的 explain 操做收集执行计划,并判断是否须要进行优化。
 

问题一:

什么是Spring Cloud?

Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

 

问题二:

使用Spring Cloud有什么优点?

使用Spring Boot开发分布式微服务时,咱们面临如下问题

  • 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。

  • 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,而后可以查找并链接到该目录中的服务。

  • 冗余-分布式系统中的冗余问题。

  • 负载平衡 --负载平衡改善跨多个计算资源的工做负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。

  • 性能-问题 因为各类运营开销致使的性能问题。

  • 部署复杂性-Devops技能的要求。

问题三:

服务注册和发现是什么意思?Spring Cloud如何实现?

当咱们开始一个项目时,咱们一般在属性文件中进行全部的配置。随着愈来愈多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会降低,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka服务注册和发现能够在这种状况下提供帮助。因为全部服务都在Eureka服务器上注册并经过调用Eureka服务器完成查找,所以无需处理服务地点的任何更改和处理。

 

问题四:

负载平衡的意义什么?

在计算中,负载平衡能够改善跨计算机,计算机集群,网络连接,中央处理单元或磁盘驱动器等多种计算资源的工做负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会经过冗余来提升可靠性和可用性。负载平衡一般涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

 

问题五:

什么是Hystrix?它如何实现容错? 

 Hystrix是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,中止级联故障并在复杂的分布式系统中实现弹性。

一般对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协做。 

思考如下微服务

 

假设若是上图中的微服务9失败了,那么使用传统方法咱们将传播一个异常。但这仍然会致使整个系统崩溃。 

随着微服务数量的增长,这个问题变得更加复杂。微服务的数量能够高达1000.这是hystrix出现的地方 咱们将使用Hystrix在这种状况下的Fallback方法功能。咱们有两个服务employee-consumer使用由employee-consumer公开的服务。 

简化图以下所示 

 

如今假设因为某种缘由,employee-producer公开的服务会抛出异常。咱们在这种状况下使用Hystrix定义了一个回退方法。这种后备方法应该具备与公开服务相同的返回类型。若是暴露服务中出现异常,则回退方法将返回一些值。

 

问题六:

什么是Hystrix断路器?咱们须要它吗? 

因为某些缘由,employee-consumer公开服务会引起异常。在这种状况下使用Hystrix咱们定义了一个回退方法。若是在公开服务中发生异常,则回退方法返回一些默认值。


17. 经常使用的 Liunx 命令






















  1. 1.uptime命令

    在Linux中,uptime命令显示了你的系统运行了多久以及目前登陆的用户有多少,另外还显示了间隔1分钟、5分钟和15分钟的负载平均值。

    # uptime 08:16:26 up 22 min,  1 user,  load average: 0.00, 0.03, 0.22

    检查uptime版本

    除了uptime(正常运行时间)和version(版本)外,uptime命令没有其余选项。若是时间不到1天,它只给出hours:mins这种形式的信息。

    [tecmint@linuxprobe ~]$ uptime -V procps version 3.2.8

  2.  

    2.w命令

    该命令会显示目前登陆的用户及其进程,另外还会显示负载平均值。此外,它还显示了登陆名称、tty名称、远程主机、登陆时间、闲置时间、JCPU、PCPU、命令和进程。

    # w 08:27:44 up 34 min,  1 user,  load average: 0.00, 0.00, 0.08 USER    TTY    FROM     LOGIN@   IDLE   JCPU   PCPU WHAT tecmint  pts/0    192.168.50.1     07:59    0.00s  0.29s  0.09s w 可用的选项 -h:不显示标题。 -s:不显示JCPU和PCPU。 -f:不显示字段信息。 -V:(大写V)-显示版本。

  3.  

    3.users命令

    users命令显示了目前已登陆的用户,除了help(帮助)和version(版本)外,该命令没有其余参数。

    # users Tecmint

  4.  

    4.who命令

    who命令仅仅返回用户名称、日期、时间和主机信息;who命令相似w命令,不像w命令,who并不输出用户执行的操做这一信息,不妨具体看看who和w这两个命令之间的区别。

    # who tecmint  pts/0        2010-09-18 07:59 (192.168.50.1)# w 08:43:58 up 50 min,  1 user,  load average: 0.64, 0.18, 0.06 USER    TTY    FROM    LOGIN@   IDLE   JCPU   PCPU WHAT tecmint  pts/0    192.168.50.1     07:59    0.00s  0.43s  0.10s w who命令的选项 -b:显示上一次系统重启日期和时间。 -r:显示当前的运行级别。 -a,–all:显示累积的全部信息。

  5.  

    5.whoami命令

    whoami命令输出当前用户的姓名;你还能够使用“who am i”命令显示当前用户,若是你以根用户身份使用sudo命令登陆,“whoami”命令返回根用户是当前用户,若是你想知道登陆的用户具体是哪一个,使用“who am i”命令。

    # whoami tecmint

  6.  

    6.ls命令

    ls命令显示了人类可读格式的文件列表。

    # ls -l total 114 dr-xr-xr-x.   2 root root  4096 Sep 18 08:46 bin dr-xr-xr-x.   5 root root  1024 Sep  8 15:49 boot

    按照上一次修改时间排序文件。

    # ls -ltr total 40 -rw-r--r--. 1 root root  6546 Sep 17 18:42 install.log.syslog -rw-r--r--. 1 root root 22435 Sep 17 18:45 install.log -rw-------. 1 root root  1003 Sep 17 18:45 anaconda-ks.cfg

    7.crontab命令

    可以使用crontab命令和-l选项,列出当前用户的计划任务。

    # crontab -l 00 10 * * * /bin/ls >/ls.txt

    能够使用-e选项编辑crontab,在下面例子中,将用VI编辑工具打开计划任务,进行必要的更改,按:wq键退出,这会自动保存设置。

    # crontab -e

    8.less命令

    less命令容许快速查看文件;你能够向上和向下翻页,按“q”便可退出less窗口。

    # less install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch nstalling tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch

    9.more命令

    more命令容许快速查看文件,并以百分比的形式显示详细信息,你能够向上和向下翻页,按“q”便可退出more窗口。

    # more install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch Installing tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch --More--(10%)

    10.cp命令

    将文件历来源拷贝到目的地,保留同一种模式。

    # cp -p fileA fileB

    覆盖文件以前系统会提示你。

    # cp -i fileA fileB

    11.mv命令

    将fileA改名为fileB; -i选项会在覆盖前提示;若是文件已经存在,会要求予以确认。

    # mv -i fileA fileB

    12.cat命令

    cat命令用来同时查看多个文件。

    # cat fileA fileB

    要是某个文件在一个屏幕/页面显示不了,你能够使用cat命令来合并more和less命令,查看文件内容。

    # cat install.log | less      or # cat install.log | more

    13.cd命令(切换目录)

    借助cd命令(切换目录),它会进入到fileA目录。

    # cd /fileA

    14.pwd命令(输出工做目录)

    pwd命令会返回当前的工做目录。

    # pwd /root

    15.sort命令

    以升序排序一行行文本文件,若是使用-r选项,就会以降序排序。

    #sort fileA.txt #sort -r fileA.txt

    16.vi命令

    对大多数相似UNIX的操做系统而言,vi是最流行的文本编辑器,下面例子使用-R选项,打开只读方式的文件,按“:q”便可退出vi窗口。

    # vi -R /etc/shadows

    17.ssh命令(安全外壳)

    ssh命令用来登陆入到远程主机;好比说,下面这个ssh例子会使用用户做为narad,链接到主机(192.168.50.2)。

    # ssh narad@192.168.50.2

    想检查ssh的版本,使用选项-V(大写),便可显示ssh的版本。

    # ssh -V OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 201

相关文章
相关标签/搜索