Spring 学习

2018面试宝典

2018-09-30  本文已影响45人  你所热爱的

1.抽象类(abstract class)和接口(interface)有什么区别?

       : 相同点:都不能被实例化

                a.一个类只能继承单个类,但是可以实现多个接口

                b.抽象类中可以有构造方法,接口中不能有构造方法

                c.抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

                d.抽象类中可以包含静态方法,接口中不可以

                e.抽象类中可以有普通成员变量,接口中不可以

2.“==”运算符和equals运算有何区别?

      答: “==”运算符表示两个对象引用的地址相等,equals运算符则表示两个对象引用的内容是否相等。

3.& 和 && 的区别?

       答:   &   不管前面的条件是否正确,后面都执行

                && 前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好。

    byte类型如何转为String?

        答:    byte aa = 1;

                String b = Byte.toString(aa);

4.重写和重载的区别?

         答:方法重写(@Override): 方法名相同,返回值相同,参数列表相同,子类写了一个和父类一模一样的方法。重写方法的修饰符不能比父类方法严格,也不能是private。重写是运行时活动

                方法重载(@overlading): 方法名相同、参数不同(类型不同或者顺序不同)、与返回值无关。 重载是编译时活动

5.HashMap和Hashtable的区别?

         答:Hashtable是线程安全,而HashMap则非线程安全;故而HashMap效率更高

                HashMap可以使用null作为key,但不建议这样做;HashTable不允许null作为key

                HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口

                HashMap的初始容量为16,Hashtable初始容量为11

                HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。

                HashMap和Hashtable的底层实现都是数组+链表结构实现

                在HashMap 中用containsKey()方法来判断key是否存在,而HashTable可以用get()方法

6.内部静态类的优点!

        答:    1.如果内部类不会引用到外部类东西的话,强烈建议使用静态内部类,因为这样更节省资源,减少内部类其中的一个指向外部类的引用。

                   2.这个静态内部类,不需要在外部引用,只为当前类提供服务。  封装的完整性。

                   3.还有静态内部类只能访问外部类的静态属性和方法,而且静态内部类还可以有静态数据,静态方法或者又一个静态内部类,这些是非静态内部类所没有的。

7.Java多线程的实现!

        答:1.继承Thread类,重写run方法  2.实现Runnable接口,重写run方法。(建议使用第二种)

8.Java中创建对象的5种方式!

        答:1.使用new关键字

                2.使用Class类的newInstance方法(PS:Employee.class.newInstance())  

                3.使用Constructor类的newInstance方法(ps:Constructor constructor = Employee.class.getConstructor();Employee emp3 = constructor.newInstance();)

                 4.使用clone方法(ps:无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。)

                  5.反序列化

9.String和StringBuilder、StringBuffer的区别?

         答:1.String为不可变的字符串常量

                2.运行速度快慢为:StringBuilder > StringBuffer > String

                3.在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的                  

10.Java支持的基本数据类型有哪些?

         答: int  short  long  byte  double  float  char boolean 

11.什么是控制反转(IOC)?什么是依赖注入?

        答:指程序在运行过程中,如果需要另外一个对象协助完成时,无需在代码中创建被调用者,而是依赖外部的注入获取。

                依赖注入:通常有两种方式:设置注入和构造注入。

         好处:(1).可维护性比较好,(2).开发效率和产品质量必将得到大幅度的提高。(3).可复用性好

12.什么是AOP?

       答:AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等

        AOP 的实现原理:AOP分为静态AOP和动态AOP。静态AOP是指AspectJ实现的AOP,他是将切面代码直接编译到Java类文件中。动态AOP是指将切面代码进行动态织入实现的AOP。Spring的AOP为动态AOP,实现的技术为: JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术) 。尽管实现技术不一样,但 都是基于代理模式 , 都是生成一个代理对象 。

13.SpringBean的作用域有几种?

        答:通过@scope注解实现

                 (1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

            (2)Prototype:每次调用新建一个Bean实例。

            (3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

            (4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

            (5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

14.使用Spring框架的好处是什么?

        答: 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦

                2.可以使用容易提供的众多服务,如事务管理,消息服务等

                3.容器提供单例模式支持

                4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能

                5.容器提供了众多的辅助类,能加快应用的开发

                6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等

                7.spring属于低侵入式设计,代码的污染极低

                8.独立于各种应用服务器

                9.spring的DI机制降低了业务对象替换的复杂性

                10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部

15.在 Spring中如何注入一个java集合?

         答: <list>类型用于注入一列值,允许有相同的值。

                 <set> 类型用于注入一组值,不允许有相同的值。

                 <map> 类型用于注入一组键值对,键和值都可以为任意类型。

                 <props>类型用于注入一组键值对,键和值都只能为String类型。

16.Spring的事务有几种方式?

           答:声明式事务:使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

                   编程式事务

    Spring和Springboot区别 ?

            答:一、SpringBoot是能够创建出独立的Spring应用程序的

                    二、简化Spring配置(Spring Boot项目就是为了解决配置繁琐的问题,最大化的实现convention over configuration(约定大于配置))

                    三、嵌入式Tomcat,Jetty容器,无需部署WAR包

spring中自动装配的方式有哪些?

            答:1、 No:即不启用自动装配

                    2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。

                    3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。

                    4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别它不是使用Seter方法注入,而是使用构造子注入。

                    5、 autodetect:在byType和constructor之间自动的选择注入方式

                    6、 default:由上级标签<beans>的default-autowire属性确定。

@Autowired 与@Resource的区别:

               答:1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

                       2、 @Autowired默认按类型装配(这个注解是属业spring的)默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

                        3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

17.Spring 如何实现数据库事务?

           答:  1.把我们用的数据库连接池架上Spring

                     2.写一个Spring事物管理器(bean),记得要把DataSource放上 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>

                     3.Spring的事物是通过注解实现的,某个类或接口上面有一个@Transactiond就会进行事物处理<tx:annotation-driven proxy-target-class="false" transaction-manager="transactionManager"/>

                    4.在具体需要实现事务的方法上加@Transactional   

18.Spring MVC的请求流程:

           答: 1、DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器

                    2、HandlerMapping处理器映射器,根据请求路径找到相应的Controller

                    3、Controller处理一些功能请求,返回一个ModelAndView对象

                    4、ViewResolver视图解析器,先根据ModelAndView中设置的View解析具体视图

                    5、然后再将Model模型中的数据渲染到View上

    spring MVC的五大组件:

            答:DispatherServlet(前端控制器):控制器入口 负责分发请求

                    HandlerMapping:负责根据请求 找到对应的控制器

                    Controller(处理器):真正处理请求的控制器

                    ModelAndView:服务层返回的数据和视图层封装的类

                    ViewResolver (视图解析器):视图处理器 通过处理找到对应的页面

19.Hibernate的工作原理及为什么要用?

         答:1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件           

                2.由hibernate.cfg.xml中的读取并解析映射信息

                3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory

                4.Session session = sf.openSession();//打开Sesssion

                5.Transaction tx = session.beginTransaction();//创建并启动事务Transation

                6.persistent operate操作数据,持久化操作 session.save(XXX).

                7.tx.commit();//提交事务

                8.关闭Session

                9.关闭SesstionFactory

                为什么要用:

                        1.    对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

                        2.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

                        3.hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

20.Hibernate中的二级缓存:

          答: 只需要在hibernate.cfg.xml中配置即可

1.<!--开启二级缓存-->           

                 <property name="hibernate.cache.use_second_level_cache">true</property>

                <!--指定使用的缓存框架-->

                <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>

                <!--开启查询缓存-->

                <property name="hibernate.cache.use_query_cache">true</property>

2.<!--指定哪一些类需要加入二级缓存-->

               <class-cache class="com.juaner.department.Dept" usage="read-only"/>

                <!--集合缓存,集合所属的类型也要放入二级缓存-->

                <collection-cache collection="com.juaner.department.Dept.emps" usage="read-only"/>

3.如果设置了查询缓存,需要手动设置setCacheable(true)。 

                Query query = session.createQuery("from Dept").setCacheable(true);

21.hibernate的get和load区别

          答:  get方法首先查询session缓存,没有的话直接发送sql查询数据库,一定要获取到真实的数据,否则返回null,并不适用二级缓存;

            load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常ObjectNotFoundException

22.hibernate里面的sorted collection 和ordered collection有什么区别

          答:   sorted collection是在内存中通过Java比较器进行排序的            

                    ordered collection是在数据库中通过order by进行排序的

23.什么是SessionFactory,他是线程安全么?

          答:SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.

24.Hibernate的五个核心接口

          答:1.Configuration 接口:配置Hibernate,根据其启动hibernate,创建 SessionFactory 对象;

                 2.SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建 session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存; 

                 3.Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,  避免多个线程共享同一个session,是轻量级、一级缓存;

                 4.Transaction 接口:管理事务; 

                  5.Query 和Criteria 接口:执行数据库的查询。

25.如何优化Hibernate?

          答:Ø 数据库设计调整

                 Ø HQL优化

                 Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API)

                 Ø 主配置参数(日志,查询缓存,fetch_size, batch_size等)

                 Ø 映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)

                 Ø 一级缓存的管理

                 Ø 针对二级缓存,还有许多特有的策略

26.#{}和${}的区别是什么?

           答: #{}是预编译处理,${}是字符串替换。    

                    Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

                    Mybatis在处理${}时,就是把${}替换成变量的值。

                    使用#{}可以有效的防止SQL注入,提高系统安全性。

27.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

            答:1.通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

                    2.通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

                        (<!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> ) 

28.通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

            答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

                    Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

                    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

29.Mybatis是如何进行分页的?分页插件的原理是什么?

           答: Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

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

30.在mapper中如何传递多个参数?

            答:1.Dao层函数(对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。)

                    2.使用 @param 注解:(命名方式)

31.Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

            答:Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。

                    Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。

                    其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

32.一对一、一对多的关联查询 ?

            答:<!--association 一对一关联查询 -->

                    <!--collection 一对多关联查询 -->

33.MyBatis与Hibernate有哪些不同?

            答:Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

                    Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发

                     Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高!

34.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()方法的调用。这就是延迟加载的基本原理。

35.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

            答:不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

36.Mybatis中如何执行批处理?

            答:使用BatchExecutor完成批处理。

37.mybatis 获取insert返回的主键!

            答:  mysql:在xml中insert语句里加入useGeneratedKeys="true" keyProperty="id"即可

                     oracle:<selectKey resultType="INTEGER" order="BEFORE" keyProperty="id">SELECT SEQ_USER.NEXTVAL as id from DUAL</selectKey>

38.讲下MyBatis的缓存

            答:MyBatis的缓存分为一级缓存和二级缓存, 一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的, 使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

39.servlet的生命周期!

            答:Servlet 加载—>实例化—>服务—>销毁。(仅执行一次init()初始化方法,每当一个客户请求一个HttpServlet对象,调用该对象的Service()服务方法,在服务器端停止且卸载Servlet时执行destroy()销毁方法);

40.get提交和post提交有何区别

            答:请求的时候参数的位置有区别,get的参数是拼接在url后面,用户在浏览器地址栏可以看到。post是放在http包的包体中。

                    能提交的数据有区别,get方式能提交的数据只能是文本,且大小不超过1024个字节,而post不仅可以提交文本还有二进制文件。

41.JSP有哪些内置对象,作用是什么?    

42.forward和redirect的区别?

            答:转发与重定向

                    forward地址栏不会改变,而redirect重定向地址栏会指向新的url

                    forward:转发页面和转发到的页面可以共享request里面的数据,redirect:不能共享数据.

                    forward:一般用于用户登陆的时候,根据角色转发到相应的模块,redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

                    forward:效率更高

43.什么是springboot?

            答:用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件;创建独立的spring引用程序 main方法运行,嵌入的Tomcat 无需部署war文件,简化maven配置,自动配置spring添加对应功能starter自动化配置

44.Spring Boot有哪些优点?

            答:减少开发,测试时间。

                    使用JavaConfig有助于避免使用XML。

                    避免大量的Maven导入和各种版本冲突。

                    没有单独的Web服务器需要。

                    更少的配置,只需要@Configuration注释的类,然后添加用@Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理

45.springboot常用的starter有哪些?

            答:spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持

                   spring-boot-starter-data-jpa 数据库支持

                   spring-boot-starter-data-redis redis数据库支持

                    spring-boot-starter-data-solr solr支持

                    mybatis-spring-boot-starter 第三方的mybatis集成starter

46.springboot自动配置的原理?

            答:在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.factories文件  该文件里配置了所有需要被创建spring容器中的bean

47.SpringBoot几个常用的注解?

            答:(1)@RestController和@Controller指定一个类,作为控制器的注解

                   (2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉

                   (3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器

                    (4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。

                    (5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上

                    (6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。

                    (7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean

                    (8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。

48.什么是微服务?

            答:将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终服务

49.SpringCloud五大核心组件

            答:服务注册发现-Netflix Eureka

                    配置中心 - spring cloud config

                    负载均衡-Netflix Ribbon

                    断路器 - Netflix Hystrix

                    路由(网关) - Netflix Zuul

50.Ribbon和Feign的区别:

            答:1.启动类用的注解不同,Ribbon使用的是@RibbonClient,Feign使用的是@EnableFeignClients。

                    2.服务的指定位置不同,Ribbon是在@RibbonClient注解上公告,Feign则是在定义笼统方法的接口中用@FeignClient公告。

                    3.调使用方式不同,Ribbon需要自己构建http请求,模拟http请求而后用RestTemplate发送给其余服务,步骤相当繁琐。Feign则是在Ribbon的基础上进行了一次改进,采使用接口的方式,将需要调使用的其余服务的方法定义成笼统方法就可,不需要自己构建http请求。不过要注意的是笼统方法的注解、方法签名要和提供服务的方法完全一致。

51.Tomcat的优化?

            答:1、优化连接配置

                    2、优化JDK

                    3、禁用DNS查询 

                    4、调整线程数 

52.tomcat容器是如何创建servlet类实例?用到了什么原理?

            答:当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

53.Tomcat有几种部署方式?

            答:1)直接把Web项目放在webapps下,Tomcat会自动将其部署

                    2)在server.xml文件上配置<Context>节点,设置相关的属性即可

                    3)通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。编写XML的方式来进行设置。

54.tomcat 有哪几种Connector 运行模式(优化)?

            答: bio:传统的Java I/O操作,同步且阻塞IO。

                    nio:JDK1.4开始支持,同步阻塞或同步非阻塞IO。(protocol="org.apache.coyote.http11.Http11NioProtocol")

                    apr:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作。

55.Redis有哪些数据结构?

            答:字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

56.使用redis有哪些好处?

            答:(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 

                   (2) 支持丰富数据类型,支持string,list,set,sorted set,hash 

                   (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 

                   (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

57.为什么redis需要把所有数据放到内存中?

            答:Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

58.redis持久化的几种方式?

            答:1、快照(snapshots) 2、AOF  3、虚拟内存方式

59.redis 最适合的场景?

            答:(1)、会话缓存(Session Cache),(2)、全页缓存(FPC),(3)、队列,(4),排行榜/计数器,(5)、发布/订阅

上一篇 下一篇

猜你喜欢

热点阅读