三、框架
1、看你在项目中使用过Spring,你对AOP了解多吗?(问spring必问aop)
AOP,即面向切面编程,动态的为核心功能添加扩展功能,多用于事务和日志,在spring中配置。
2、Spring MVC的执行流程
客户端发起请求,前端控制器dispatcherservlet处理请求,拦截器Interceptors去判断是否放行,映射处理器 HandlerMapping根据url匹配对应的controller,然后执行controller->service->dao的操作,再次经过dispatcherservlet,将返回的数据交给映射器ViewResolver处理,返回给客户端。
3、DispatcherServlet你知道吧?它用来干嘛的
前端控制器DispatcherServlet是springmvc处理请求的入口,是springmvc的核心,这个控制器一般需要在服务器启动时即初始化,即设置<load-on-startup>。
4、拦截器和过滤器的区别?
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对controller请求起作用。
Interceptor可以访问controller的上下文,值栈里的对象,而Filter不能。
在controller的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
4、画一画dubbo的架构图,dubbo节点之间的长链接有哪些,dubbo协议了解吗?
5、当zookeeper宕机后(不考虑集群)消费者系统还能运行吗?
可以,每台服务器都会缓存一份服务调用列表的,zk起到的是同步服务的作用。问题在于如果生产者有节点宕机,消费者是不知道的,所以还会一直给这台宕机的服务器发送请求,知道请求超时。
6、Nginx的负载均衡策略中hash策略有哪些优缺点?
优点:能够保存用户信息,保证访问服务器一直是同一台;
缺点:如果客户端发起大量请求,则这些请求会在同一时刻访问同一台服务器,导致该台服务器宕机,跟着再访问第二台服务器,结果同理。最终导致所有服务器宕机。
6、Mybatis中#{}和${}传参的区别
在获取DAO接口中的参数信息时,${ }创建的不是预编译的SQL,而是字符串的拼接,有可能会导致SQL注入问题。
#{ }底层会创建预编译的SQL,性能会相对较好。
7、Mybatis的作用域(Scope)
SqlSessionFactoryBuildeSqlSessionFactoryBuilder、SqlSessionFactory、SqlSession
8、zookeeper的选主过程了解吗
构建 Zookeeper 集群的时候,使用的服务器最好是奇数台。在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任务数据写成功。
①如果有3个Server,则最多允许1个Server 挂掉。
②如果有4个Server,则同样最多允许1个Server挂掉。
既然3个或者4个Server,同样最多允许1个Server挂掉,那么它们的可靠性是一样的,所以选择奇数个ZooKeeper Server即可,这里选择3个Server。
9、是否动手实现过分布式锁?
redis实现,命令为set(key,value,NX,EX,expiretime);
10、redis和memcache的区别;
1、性能对比:由于redis只使用单核,而memcached可以使用多核,所以平均每一个核上redis在存储小数据时比memcached性能更高。而在100k以上的数据中,memcached性能要高于redis,虽然redis最近也在存储大数据的性能上进行优化,但是比起memcached,还是稍有逊色。
2、内存使用效率对比:使用简单的key-value存储的话,memcached的内存利用率更高,而如果redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memcached。另外,memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 redis更适合作为存储而不是cache。
3、redis支持服务器端的数据操作:redis相比memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么redis会是不错的选择。
Redis优势:
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多
(3) redis可以持久化其数据
(4)Redis支持数据的备份,即master-slave模式的数据备份。
(5)、使用底层模型不同
它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
(6)value大小:redis最大可以达到1GB,而memcache只有1MB
9、redis是如何持久化的:rdb和aof。它们各有什么特点?(京东)
rdb可丢失数据,但效率高;Redis默认持久化方式
aof不丢失数据
10、redis有哪些数据类型?
五种
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
11、redis为什么设计成单线程模型?
官方回答:因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
1、编程简单。相比较与多线程的实现方式,单线程实现较为简单;
2、并发帮助。采用并发操作实现类似多线程的效果;
3、计算量小。Redis主要用于存储数据,CPU不是瓶颈,网络通常是瓶颈。如果应用程序设计正确,能够避免IO阻塞,线程将是最后需要担心的问题。
4、部署简单。由于Redis是单线程,故能部署在低端单核单CPU机器上
redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。
单线程的好处:
1、代码更清晰,处理逻辑更简单
2、不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
3、不存在多进程或者多线程导致的切换而消耗CPU
因为是单一线程,所以同一时刻只有一个操作在进行,所以,耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。而单一线程也只能用到一个CPU核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成master-master或者master-slave的形式,耗时的读命令可以完全在slave进行。
12、Redis快的原因?
1. 完全基于内存
Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。
连接数为10000时,QPS(每秒内查询次数可达90000)
2. 数据结构简单,对数据操作也简单
3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而
消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性
能消耗;
4. 使用多路 I/O 复用模型,非阻塞IO。(避免了使用锁)
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时
候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会
轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的
流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单
个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的
速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈。
主要由以上几点造就了Redis 具有很高的吞吐量。
13、mybatis是如何管理session和cache的?
14、maven的jar版本冲突如何解决
在配置文件pom.xml中添加dependencyManagement标签,声明要使用哪个版本的相应jar包,声明后其他版本的jar包一律不依赖。
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
15、 消费者访问生产者需要经过zk吗?
不需要,消费者只需要向注册中心请求配置信息和服务地址即可,再根据这些信息去访问对应的服务器(生产者)
16、zk可以被哪些替换?
Zookeeper是基于CP设计的,为了保证一致性,类似的还有Consul,Redis也可以作为注册中心;
基于AP设计的有Eureka,Eureka不会有类似于ZooKeeper的选举leader的过程,客户端请求会自动切换到新的Eureka节点;当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中;
Eureka分为客户端程序与服务器端程序两个部分,客户端程序负责向外提供注册与发现服务接口;
CAP理论中可以理解为在发生分区容忍性(P)时,应用对一致性(C)和可用性(A)之间的一种抉择;
Zookpper需要实现集群,防止只有一台直接宕掉;