1.说一下Lucene和ES,他们的区别,ES的特点
Lucene是一套信息检索工具包,它包含了索引结构、读写索引工具、相关性工具、排序等功能,而solr和elasticsearch都是基于该工具包做的一些封装。
solr利用zookpper进行分布式管理,而elasticsearch自身带有分布式协调管理功能;
solr比elasticsearch实现更加全面,solr官方提供的功能更多,而elasticsearch本身更注 重于核心功能,高级功能多由第三方插件提供;
solr在传统的搜索应用中表现好于elasticsearch,而elasticsearch在实时搜索应用方面比solr表现好!
最后有必要说明一下传统搜索和实时搜索:
传统搜索是从静态数据库中筛选出符合条件的结果,这种结果往往是不可变得、静态的。而实时搜索则是用户对于搜索的结果是实时变化的。
2.在Mybatis中 # 和 $ 的区别 , 什么时候用#什么时候用$
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号
$将传入的数据直接显示生成在sql中。
#是传参是预编译的处理方式,很大程度上防SQL注入,更安全。
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
一般能用#的就别用$
3.写出线程的两种创建以及启动方式 - 写代码
实现Runnable 或者callable 接口
继承Thread类,覆写run方法 调用start()方法启动
4.SpringMvc的执行流程 - 写步骤
用户请求-->dispatherservlet核心控制器-->调用handlerMapping(处理映射器)--->返回hander对象与映射器给dispatherservlet---->调用处理器适配器handlerAdapter--->调用具体的handler对象----->返回moderAndview给dispatherServlet---->视图解析器viewresover----->返回view给dispatherservlet,调用方法渲染视图view过后,响应给用户
5.数组和链表的区别,他们在修改和查询方面谁快谁慢?
相同点:他们都是Java中存储数据的容器。
区别:
数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
6.讲一下常用的设计模式5个,详细讲一下适配器模式的思想,结合生活中的案例进行举例
单利设计模式: 确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。比如spring容器框架
工厂模式:创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。spring容器创建对象就是用了Bean工厂
代理模式:对一些对象提供代理,以限制那些对象去访问其它对象,代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干。 springAop就是使用了动态代理模式。
装饰者模式:动态给一个对象添加一些额外的职责,现在需要一个汉堡,主体是鸡腿堡,可以选择添加生菜、酱、辣椒等等许多其他的配料
享元模式:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象,数据库连接池,线程池
7.Redis常用的数据类型有哪些 , 每种数据类型举例出4个命令
Spring add set get mset
set sadd sset sget
hash hadd hset hget
list ladd lset lget
shortSet
8.说一下Redis的几种持久化方案
aof
9.ES的原理是什么?或者说ES为什么能加快搜索
ES的原理可以数和redis的缓存差不多,它是将数据从磁盘中读取到索引库中,这样搜索时从索引库中获取,效率比从磁盘中(数据中高很多)
10.说一下Spring与事务的关系?Spring是怎么管理事务的
Spring继承了事务,Spring是通过Aop面向切面的编程思想来管理事务的,Aop是对OOP面向对象编程思想的补充,处理OOP难以处理的问题,面向对象,是一个对象一个对象的处理,自上而下。然而这些对象都需要处理事务,当要面对很多对象的时候,就需要对每个对象都要单独写代码实现事务,这样重复代码就很多,代码可读性差,开发人员写起来也麻烦,所以有了Aop的思想使用横切技术,底层通过动态代理模式,统一处理这一系列问题,实现了代码的解耦,使事务处理起来更简单方便。
11.SpringBoot 的 @SpringBootApplication标签的含义
@SpringBootApplication 是配置类的标志,替代了springMVC时代的xml文件,里面包含更多的标签,开启了自动配置等。
12.SpringBoot的自动配置原理
@EnableAutoConfiguration开启自动配置,就会找到导入选择器的标签,调用importSelects的方法,从spring-boot-autoconfigure的jar中找到factories找到很多配置类,它会找到该类中的配置文件类properties,会根据条件标签conditonal判断是否存在这个Bean,没有的话框架就会自动创建,这样就实现了自动配置
13.SpringBoot如何把配置文件中的配置项读到对象中?说两种方式。
@value标签打在字段上。
@config标签打在类上
14.SpringCloud你用过几个组件-5个?他们的作用分别是什么?
注册和发现中心Eureka,用于统一管理各个服务器的地址。
config配置服务,统一管理各个服务器的配置,
hystrix熔断器,解决因高并发或其他原因导致服务器宕机,是通信中断并发消息回请求服务器,跟电路中的断路器效果类似。
feign:是ribbon的二次封装,实现负载均衡
fastdfs:图片统一管理
zuul:gateWay网关,是访问各个服务器的入口。
15.说一下ZUUL的实现原理
Zuul相当于网络关卡,每一个服务访问时都要经过这里,进行过滤验证。跟车站检票设置的检票口一样的,要对来访者进行响应的检查才给予放行。
16.说一下Linux常用的 8 个命令,和他们的作用
cd exit cls .. ex
17.说一下集群,和分布式的关系?用了分布式就不能用集群了是不是?可以举例
集群:把实现同一个功能的服务,部署到多个不同服务器中,他们运行的代码是一样的。
分布式:是将一个大的项目,拆分成多个小项目,部署到不同的服务器上,他们运行的代码是不一样的。
比如有3个和尚他们都要做挑水、砍柴、做饭,他们各种个的每个人也是做的一样的事情,就是集群。
如果3个和尚一个人负责挑水,一个人负责砍柴,最后一个负责做饭,这就是分布式
分布式和集群是配合使用的。
18.说一下你们的项目技术架构是怎么样的 - hrm
我们使用了springBoot 和 springcloud的架构思想,使用了注册和发现中心Eureka,用于统一管理各个服务器的地址。
config配置服务,统一管理各个服务器的配置,
hystrix熔断器,解决因高并发或其他原因导致服务器宕机,是通信中断并发消息回请求服务器,跟电路中的断路器效果类似。
feign:是ribbon的二次封装,实现负载均衡
fastdfs:图片统一管理
zuul:gateWay网关,是访问各个服务器的入口。
elasticSearch全文搜索来快速查询课程分类信息
redis做了缓存,使数据查询更高效,减轻数据库的压力
19.说一下你对单体应用以及微服务的理解?
单体应用主要是使用在小型项目中,它把项目的所有模块,功能都集成在一个Tomcat中,一个War包,这个代码可读性较差,代码不好维护,项目之间依赖性太强,一个模块一个功能的Bug可能导致整个项目崩溃
微服务是将一个大的项目拆分成多个微小的服务,每个服务实现一个功能,做到责任分离,每个微小服务有自己的数据库,有独立的tomcat,这样服务与服务之间实现了解耦,一个服务的宕机不会影响另一个服务的的崩溃,配合着集群有效的解决了高并发的问题