2018面试宝典
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有哪些内置对象,作用是什么?
![](https://img.haomeiwen.com/i14252602/eb63744f7da7f74b.png)
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)、发布/订阅