java面试题(二)孤独杀手不怕冷

这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。

它由三种角色组成:

来用类图来清晰的表示下的它们之间的关系:

抽象工厂模式:

图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。

可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

而且使用抽象工厂模式还要满足一下条件:

来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

1.简介

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2.轻量

从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

3.控制反转

Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

4.面向切面

5.容器

Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

6.框架

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-OrientedPrograming,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

IOC是InversionofControl的缩写,多数书籍翻译成“控制反转”。

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

图IOC解耦过程

大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

图拿掉IOC容器后的系统

我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:

软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

更多信息:howtodoinjava.com/java-spring-framework-tutorials/

Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:

Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:

其中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会新建一个Bean实例,然后返回给程序。在这种情况下,Spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器不在跟踪实例,也不会维护Bean实例的状态。

如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。

Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系。作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起。

spring中bean装配有两种方式:

当然这些方式也可以配合使用。

事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:

SpringMVC运行流程图:

Spring运行流程描述:

\1.用户向服务器发送请求,请求被Spring前端控制ServeltDispatcherServlet捕获;

\3.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

\4.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

\5.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;

\6.根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;

\7.ViewResolver结合Model和View,来渲染视图;

\8.将渲染结果返回给客户端。

SpringMVC的核心组件:

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

在Spring框架这个大家族中,产生了很多衍生框架,比如Spring、SpringMvc框架等,Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建,依赖注入即为由spring容器为应用程序的某个对象提供资源,比如引用对象、常量数据等。

SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件,所以SpringBoot是一个服务于框架的框架,服务范围是简化配置文件。

SpringBoot提供了两种常用的配置文件:

SpringBoot提供了两种常用的配置文件,分别是properties文件和yml文件。相对于properties文件而言,yml文件更年轻,也有很多的坑。可谓成也萧何败萧何,yml通过空格来确定层级关系,使配置文件结构跟清晰,但也会因为微不足道的空格而破坏了层级关系。

SpringBoot热部署实现有两种方式:

①.使用springloaded

在项目中添加如下代码:

org.springframework.bootspring-boot-maven-pluginorg.springframeworkspringloaded1.2.6.RELEASE添加完毕后需要使用mvn指令运行:

首先找到IDEA中的Editconfigurations,然后进行如下操作:(点击左上角的"+",然后选择maven将出现右侧面板,在红色划线部位输入如图所示指令,你可以为该指令命名(此处命名为MvnSpringBootRun))

点击保存将会在IDEA项目运行部位出现,点击绿色箭头运行即可

②.使用spring-boot-devtools

在项目的pom文件中添加依赖:

org.springframework.bootspring-boot-devtools然后:使用shift+ctrl+alt+"/"(IDEA中的快捷键)选择"Registry"然后勾选compiler.automake.allow.when.app.running

从字面理解,SpringCloud就是致力于分布式系统、云服务的框架。

SpringCloud是整个Spring家族中新的成员,是最近云服务火爆的必然产物。

SpringCloud为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如:

使用SpringCloud开发人员可以开箱即用的实现这些模式的服务和应用程序。这些服务可以任何环境下运行,包括分布式环境,也包括开发人员自己的笔记本电脑以及各种托管平台。

在SpringCloud中使用了Hystrix来实现断路器的功能,断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费CPU周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决,如果问题似乎已经得到纠正,应用程序可以尝试调用操作。

①.服务发现——NetflixEureka

一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

②.客服端负载均衡——NetflixRibbon

Ribbon,主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。

③.断路器——NetflixHystrix

断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费CPU周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。

④.服务网关——NetflixZuul

类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。

⑤.分布式配置——SpringCloudConfig

这个还是静态的,得配合SpringCloudBus实现动态的配置更新。

113.为什么要使用hibernate?

114.什么是ORM框架?

对象-关系映射(Object-RelationalMapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

115.hibernate中如何在控制台查看打印的sql语句?

116.hibernate有几种查询方式?

hql查询,sql查询,条件查询HQL:HibernateQueryLanguage.面向对象的写法:Queryquery=session.createQuery("fromCustomerwherename=");query.setParameter(0,"老师");Query.list();QBC:QueryByCriteria.(条件查询)Criteriacriteria=session.createCriteria(Customer.class);criteria.add(Restrictions.eq("name","花姐"));Listlist=criteria.list();SQL: SQLQueryquery=session.createSQLQuery("select*fromcustomer"); Listlist=query.list(); SQLQueryquery=session.createSQLQuery("select*fromcustomer"); query.addEntity(Customer.class);Listlist=query.list();Hql:具体分类1、属性查询2、参数查询、命名参数查询3、关联查询4、分页查询5、统计函数HQL和SQL的区别HQL是面向对象查询操作的,SQL是结构化查询语言是面向数据库表结构的117.hibernate实体类可以被定义为final吗?

118.在hibernate中使用Integer和int做映射有什么区别?

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

119.hibernate是如何工作的?

hibernate工作原理:

120.get()和load()的区别?

121.说一下hibernate的缓存机制?

Hibernate中的缓存分为一级缓存和二级缓存。

一级缓存就是Session级别的缓存,在事务范围内有效是,内置的不能被卸载。二级缓存是SesionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。

什么样的数据适合存放到第二级缓存中?

扩展:hibernate的二级缓存默认是不支持分布式缓存的。使用memcahe,redis等中央缓存来代替二级缓存。

122.hibernate对象有哪些状态?

hibernate里对象有三种状态:

123.在hibernate中getCurrentSession和openSession的区别是什么?

openSession从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。

getCurrentSession,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession就是:如果有已经使用的,用旧的,如果没有,建新的。

注意:在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了。

124.hibernate实体类必须要有无参构造函数吗?为什么?

必须,因为hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法,这个方法就是通过调用默认构造方法来创建实例对象的。

另外再提醒一点,如果你没有提供任何构造方法,虚拟机会自动提供默认构造方法(无参构造器),但是如果你提供了其他有参数的构造方法的话,虚拟机就不再为你提供默认构造方法,这时必须手动把无参构造器写在代码里,否则newXxxx()是会报错的,所以默认的构造方法不是必须的,只在有多个构造方法时才是必须的,这里“必须”指的是“必须手动写出来”。

125.mybatis中#{}和${}的区别是什么?

126.mybatis有几种分页方式?

128.mybatis逻辑分页和物理分页的区别是什么?

129.mybatis是否支持延迟加载?延迟加载的原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

130.说一下mybatis的一级缓存和二级缓存?

一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Sessionflush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。

二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置;

对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

★131.mybatis和hibernate的区别有哪些?

(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。

(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。

(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

132.mybatis有哪些执行器(Executor)?

133.mybatis分页插件的实现原理是什么?

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

134.mybatis如何编写一个自定义插件?

转自:blog.csdn.net/qq_30051265/article/details/80266434

Mybatis自定义插件针对Mybatis四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)进行拦截,具体拦截方式为:

Mybatis自定义插件必须实现Interceptor接口:

publicinterfaceInterceptor{Objectintercept(Invocationinvocation)throwsThrowable;Objectplugin(Objecttarget);voidsetProperties(Propertiesproperties);}intercept方法:拦截器具体处理逻辑方法

plugin方法:根据签名signatureMap生成动态代理对象

setProperties方法:设置Properties属性

自定义插件demo:

//ExamplePlugin.java@Intercepts({@Signature(type=Executor.class,method="update",args={MappedStatement.class,Object.class})})publicclassExamplePluginimplementsInterceptor{publicObjectintercept(Invocationinvocation)throwsThrowable{Objecttarget=invocation.getTarget();//被代理对象Methodmethod=invocation.getMethod();//代理方法Object[]args=invocation.getArgs();//方法参数//dosomething......方法拦截前执行代码块Objectresult=invocation.proceed();//dosomething.......方法拦截后执行代码块returnresult;}publicObjectplugin(Objecttarget){returnPlugin.wrap(target,this);}publicvoidsetProperties(Propertiesproperties){}}一个@Intercepts可以配置多个@Signature,@Signature中的参数定义如下:

135.rabbitmq的使用场景有哪些?

②.多个应用之间的耦合,由于消息是平台无关和语言无关的,而且语义上也不再是函数调用,因此更适合作为多个应用之间的松耦合的接口。基于消息队列的耦合,不需要发送方和接收方同时在线。在企业应用集成(EAI)中,文件传输,共享数据库,消息队列,远程过程调用都可以作为集成的方法。

③.应用内的同步变异步,比如订单处理,就可以由前端应用将订单信息放到队列,后端应用从队列里依次获得消息处理,高峰时的大量订单可以积压在队列里慢慢处理掉。由于同步通常意味着阻塞,而大量线程的阻塞会降低计算机的性能。

④.消息驱动的架构(EDA),系统分解为消息队列,和消息制造者和消息消费者,一个处理流程可以根据需要拆成多个阶段(Stage),阶段之间用队列连接起来,前一个阶段处理的结果放入队列,后一个阶段从队列中获取消息继续处理。

⑤.应用需要更灵活的耦合方式,如发布订阅,比如可以指定路由规则。

⑥.跨局域网,甚至跨城市的通讯(CDN行业),比如北京机房与广州机房的应用程序的通信。

136.rabbitmq有哪些重要的角色?

RabbitMQ中重要的角色有:生产者、消费者和代理:

137.rabbitmq有哪些重要的组件?

138.rabbitmq中vhost的作用是什么?

vhost可以理解为虚拟broker,即mini-RabbitMQserver。其内部均含有独立的queue、exchange和binding等,但最最重要的是,其拥有独立的权限系统,可以做到vhost范围的用户控制。当然,从RabbitMQ的全局角度,vhost可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的vhost中)。

139.rabbitmq的消息是怎么发送的?

首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,客户端和rabbitserver之间会创建一个tcp连接,一旦tcp打开并通过了认证(认证就是你发送给rabbit服务器的用户名和密码),你的客户端和RabbitMQ就创建了一条amqp信道(channel),信道是创建在“真实”tcp上的虚拟连接,amqp命令都是通过信道发送出去的,每个信道都会有一个唯一的id,不论是发布消息,订阅队列都是通过这个信道完成的。

140.rabbitmq怎么保证消息的稳定性?

141.rabbitmq怎么避免消息丢失?

142.要保证消息持久化成功的条件有哪些?

以上四个条件都满足才能保证消息持久化成功。

143.rabbitmq持久化有什么缺点?

持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储,从而降低了吞吐量。可尽量使用ssd硬盘来缓解吞吐量的问题。

144.rabbitmq有几种广播类型?

145.rabbitmq怎么实现延迟消息队列?

146.rabbitmq集群有什么用?

集群主要有以下两个用途:

147.rabbitmq节点的类型有哪些?

148.rabbitmq集群搭建需要注意哪些问题?

149.rabbitmq每个节点是其他节点的完整拷贝吗?为什么?

不是,原因有以下两个:

150.rabbitmq集群中唯一一个磁盘节点崩溃了会发生什么情况?

如果唯一磁盘的磁盘节点崩溃了,不能进行以下操作:

唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。

151.rabbitmq对集群节点停止顺序有要求吗?

RabbitMQ对集群的停止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。

152.kafka可以脱离zookeeper单独使用吗?为什么?

kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协调kafka的节点服务器。

153.kafka有几种数据保留的策略?

154.kafka同时设置了7天和10G清除数据,到第五天的时候消息达到了10G,这个时候kafka将如何处理?

155.什么情况会导致kafka运行变慢?

156.使用kafka集群需要注意什么?

157.zookeeper是什么?

zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是googlechubby的开源实现,是hadoop和hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

158.zookeeper都有哪些功能?

159.zookeeper有几种部署模式?

zookeeper有三种部署模式:

160.zookeeper怎么保证主从节点的状态同步?

zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。

161.集群中为什么要有主节点?

在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点。

162.集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以使用吗?

可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。

163.说一下zookeeper的通知机制?

客户端端会对某个znode建立一个watcher事件,当该znode发生变化时,这些客户端会收到zookeeper的通知,然后客户端可以根据znode变化来做出业务上的改变。

164.数据库的三范式是什么?

165.一张自增表里面总共有7条数据,删除了最后2条数据,重启mysql数据库,又插入了一条数据,此时id是几?

InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后会导致最大id丢失。

166.如何获取当前数据库版本?

使用selectversion()获取当前MySQL数据库版本。

167.说一下ACID是什么?

168.char和varchar的区别是什么?

char(n):固定长度类型,比如订阅char(10),当你输入"abc"三个字符的时候,它们占的空间还是10个字节,其他7个是空字节。

chat优点:效率高;缺点:占用空间;适用场景:存储密码的md5值,固定长度的,使用char非常合适。

varchar(n):可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。

所以,从空间上考虑varcahr比较合适;从效率上考虑char比较合适,二者使用需要权衡。

169.float和double的区别是什么?

170.mysql的内连接、左连接、右连接有什么区别?

内连接关键字:innerjoin;左连接:leftjoin;右连接:rightjoin。

内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

171.mysql索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。

具体来说MySQL中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。

172.怎么验证mysql的索引是否满足需求?

使用explain查看SQL是如何执行查询语句的,从而分析你的索引是否满足需求。

explain语法:explainselect*fromtablewheretype=1。

173.说一下数据库的事务隔离?

MySQL的事务隔离是在MySQL.ini配置文件里添加的,在文件的最后添加:transaction-isolation=REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

脏读:表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录A,此时该事务还未提交,然后另一个事务尝试读取到了记录A。

不可重复读:是指在一个事务内,多次读同一数据。

幻读:指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

174.说一下mysql常用的引擎?

InnoDB引擎:InnoDB引擎提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行selectcount(*)fromtable指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

MyIASM引擎:MySQL的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和InnoDB不同的是,MyIASM引擎是保存了表的行数,于是当进行selectcount(*)fromtable语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。

175.说一下mysql的行锁和表锁?

MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。

176.说一下乐观锁和悲观锁?

数据库的乐观锁需要自己实现,在表里面添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,自己拥有的version和数据库现在的version是否一致,如果不一致就不修改,这样就实现了乐观锁。

177.mysql问题排查都有哪些手段?

178.如何做mysql的性能优化?

179.redis是什么?都有哪些使用场景?

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis使用场景:

180.redis有哪些功能?

181.redis和memecache有什么区别?

182.redis为什么是单线程的?

因为cpu不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且cpu又不会成为瓶颈,那就顺理成章地采用单线程的方案了。

关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。

183.什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

184.redis支持的数据类型有哪些?

string、list、hash、set、zset。

185.redis支持的java客户端都有哪些?

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

186.jedis和redisson有哪些区别?

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。

187.怎么保证缓存和数据库数据的一致性?

188.redis持久化有几种方式?

Redis的持久化有两种方式,或者说有两种策略:

189.redis怎么实现分布式锁?

Redis分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。

占坑一般使用setnx(setifnotexists)指令,只允许被一个程序占有,使用完调用del释放锁。

190.redis分布式锁有什么缺陷?

191.redis如何做内存优化?

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。

192.redis淘汰策略有哪些?

193.redis常见的性能问题有哪些?该如何解决?

194.说一下jvm的主要组成部分?及其作用?

组件的作用:首先通过类加载器(ClassLoader)会把Java代码转换成字节码,运行时数据区(RuntimeDataArea)再把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(ExecutionEngine),将字节码翻译成底层系统指令,再交由CPU去执行,而这个过程中需要调用其他语言的本地库接口(NativeInterface)来实现整个程序的功能。

195.说一下jvm运行时数据区?

有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户进程的启动和结束而创建和销毁。

196.说一下堆栈的区别?

197.队列和栈是什么?有什么区别?

198.什么是双亲委派模型?

在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在JVM中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将class文件加载到JVM内存,然后再转化为class对象。

类加载器分类:

双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。

199.说一下类加载的执行过程?

类加载分为以下5个步骤:

200.怎么判断对象是否可以被回收?

一般有两种方法来判断:

201.java中都有哪些引用类型?

202.说一下jvm有哪些垃圾回收算法?

203.说一下jvm有哪些垃圾回收器?

204.详细介绍一下CMS垃圾回收器?

CMS使用的是标记-清除的算法实现的,所以在gc的时候回产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现ConcurrentModeFailure,临时CMS会采用SerialOld回收器进行垃圾清除,此时的性能将会被降低。

205.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。

206.简述分代垃圾回收器是怎么工作的?

分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的1/3,老生代的默认占比是2/3。

新生代使用的是复制算法,新生代里有3个分区:Eden、ToSurvivor、FromSurvivor,它们的默认占比是8:1:1,它的执行流程如下:

每次在FromSurvivor到ToSurvivor移动时都存活的对象,年龄就+1,当年龄到达15(默认配置是15)时,升级为老生代。大对象也会直接进入老生代。

老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。

207.说一下jvm调优的工具?

JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是jconsole和jvisualvm这两款视图监控工具。

THE END
1.系统架构笔记2计算机系统基础知识顺序图:描述对象之间的交互,其中循环,选择等复杂交互使用序列片段表示。对象之间的消息类型包括同步消息/异步消息/返回消息/参与者创建消息/参与者销毁消息。 其中交互概览图、定时图、顺序图(序列图)、通信图(协作图)均被称为交互图。除此以外,动态模型还包括状态图和活动图等。 https://blog.csdn.net/HL_LOVE_C/article/details/142323515
2.异步消息传递异步消息通信机制mob64ca13f6bbea的技术博客异步消息传递 异步消息通信机制, 一、同步与异步概念:同步和异步关注的是消息通信机制(synchronouscommunication/asynchronouscommunication)。解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,必须等处理完才直接返回结果,没处理完之前是不https://blog.51cto.com/u_16213577/10541200
3.消息中间件第八讲:消息队列RocketMQ版实战集群及原理同步刷盘:消息被写入内存的PAGECACHE,返回写成功状态,当内存里的消息量积累到一定程度时,统一触发写磁盘操作,快速写入 。吞吐量高,当磁盘损坏时,会丢失消息 异步刷盘:消息写入内存的PAGECACHE后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,给应用返回消息写成功的状态。吞吐量低,但https://developer.aliyun.com/article/1352571
4.UML图详解(七)——交互图(时序图与协作图)对象的行为也称为消息(Message),通常当一个对象调用另一个对象中的行为时,即完成了一次消息传递。 2.表示方式 在生命线间的带有实心箭头表示消息 3.消息命名 信号或消息名(参数:参数类型):返回值 4.简单消息、同步消息、异步消息 消息分为简单消息(Simple Message)、同步消息(Synchronous Message)和异步消息(Asynchhttps://www.360doc.cn/article/9824753_689086442.html
5.下列选项属于消息的类型的是()下列选项属于消息的类型的是( ) A. 同步消息 B. 返回消息 C. 异步消息 D. 简单消息 E. 交互消息 题目标签:消息选项列选如何将EXCEL生成题库手机刷题 如何制作自己的在线小题库 > 手机使用 分享 反馈 收藏 举报 参考答案: A B C D 复制 纠错 举一反三 下列哪些方面属于数据库加密技术的功能https://www.shuashuati.com/ti/bd97b5557b5547b5a61600aa31c9b1a0.html
6.第八届全国职工职业技能大赛(网络和信息安全管理员)山西选拔赛63.“用户信息”可以理解为在用户使用产品或者服务过程中收集的信息构成用户信息,包括() A、IP地址 B、用户名和密码C、上网时间 D、Cookie信息 20 答案:ABCD 64.目前对MD5,对SHA1算法的攻击描述错误的是: A、能够构造出两个不同的消息,这两个消息产生了相同的消息摘要 B、对于一个已知的消息摘要,能够构造出https://max.book118.com/html/2024/0804/8036015104006116.shtm
7.UML答案214、简述顺序图中消息的分类 答:可分为同步消息、异步消息、返回消息三类。 同步消息:调用某个操作和方法。 异步消息:表示通信信号的非嵌套控制流,该信号异步激活操作。 返回消息:表明该消息从某个消息调用返回 ●必要时为每个消息附加上前置条件和后置条件。 ●调整图的布局,尽力减少线的交叉,使图尽可能地直观、https://m.360docs.net/doc/4a0ad13a3968011ca3009141.html
8.消息队列RocketMQ顺序消息消息队列RocketMQ功能特性用户购买商品生成订单为例,此时若以普通消息发送,则下游订单系统可能消息消费顺序混乱,例如订单出库先执行,后生成订单,从而系统数据不正确。顺序消息就能解决此问题,上游系统发送顺序消息,下游订单系统在同一消费组,会依次按顺序消费,执行相应的逻辑。 典型场景二: 数据实时增量同步 https://ecloud.10086.cn/op-help-center/doc/article/67007
9.消息队列(mq)是什么?有新消息写入,两个 follower 分区会同步 master 变更。两个 Consumer 分别从不同的 master 分区获取https://www.zhihu.com/question/54152397/answer/2654914176
10.3分钟白话RocketMQ系列——如何保证消息不丢失普通有序消息:发送普通有序消息,通过指定「消息筛选器selector」,动态决定发送哪个队列。异常默认不重试,可以用户自己重试,并发送到其他队列。 严格有序消息:发送严格有序消息,通过指定队列,保证严格有序,异常默认不重试。 消息发送模式: 同步:调用发送消息方法后,同步阻塞,直到返回SendResult。配置retryTimesWhenSendFaihttps://blog.itpub.net/70024923/viewspace-2983505/
11.计算机网络HTTP(Hyper Text Transfer Protocol)协议: 又称为超文本传输协议,HTTP由一个客户端和一个服务端来实现,运行在不同端系统中的客户端和服务端通过交换HTTP报文进行会话,而HTTP定义了这些报文的结构及进行报文交换时的方式。 HTTP是在TCP协议上运行的,客户端发起HTTP 请求,服务器做出响应处理后,返回HTTP 响应报文。 https://www.nowcoder.com/discuss/435756266465579008
12.大田县政法系统跨部门智慧执法办案管理平台建设项目服务类①价格项(F1×A1)满分为10分。 a.价格分采用低价优先法计算,即满足招标文件要求且投标价格最低的投标报价为评标基准价,其价格分为满分。其他投标人的价格分统一按照下列公式计算:投标报价得分=(评标基准价/投标报价)×100。因落实政府采购政策需进行价格扣除的,以扣除后的价格计算评标基准价和投标报价。 b.价格扣http://zfcg.cz.sm.gov.cn/upload/document/20211105/5f069fc764594cfea5cfa97e5b021347.html