基础题
- 什么是Java的跨平台性?(Java运行在JVM,各平台安装相应的JVM)
- 什么是字节码?好处?(编译后的文件格式,面向虚拟机)
- 最有效的计算2*8?(2<<3)
- Java采用何种编码方式?好处?(Unicode,字符对应唯一数值)
- final有什么用?(修饰类、方法、属性)
- 内部类的优点?
- 内部类的应用场景?
- 对象相等于引用相等的区别?(前者是内存中的内容,后者是引用存放的地址值)
- 值传递与引用传递的区别?(前者传递值得副本,后者传递引用地址)
- interface的默认修饰符?(可通过反射获得方法和属性的对象,直接输出就可以看到)
Java中Interface方法默认访问修饰符为:public abstract
Java中Interface常量的默认访问修饰符为:public static final - 什么是BIO、NIO、AIO(NIO2)?
- ArrayList与LinkedList的区别?
ArrayList底层基于数组实现,LinkedList底层基于双向链表实现;
执行指定位置查找操作时,ArrayList性能优于LinkedList,因为ArrayList直接定位,LinkedList需要移动指针遍历查找;
执行删除或中间插入操作时,LinkedList性能优于ArrayList,因为LinkedList只需要改变指针的指向,ArrayList除了移除元素还需要移动元或者需要扩容;
ArrayList容量有限,超出容量后需要扩容,LinkedList理论上容量无限; - 什么是反射?
- 获取反射的三种方法?(对象.getClass、类.class、Class.forName(路径))
- 反射的应用场景?(JDBC、Spring中XML配置)
- String的不可变性?
- 使用HashMap时用String做key的好处?(String不可变,hashcode会缓存下来,不需要再次计算)
- String、StringBuffer、StringBuilder区别?
String类被final修饰,创建和操作不可变的字符串,存放在字符串常量池中,对String的操作会生成新的字符串,线程安全,适合操作少量字符串的场景;
StringBuffer通过new来创建可变字符串对象,存放在堆中,对字符串的操作就是对对象本身操作,线程安全,所有方法都被synchronized关键字修饰,适合多线程下操作大量字符串;
StringBuilder通过new来创建可变字符串对象,存放在堆中,线程不安全,适合单线程下操作大量字符串; - Error与Exception区别是什么?(前者虚拟机相关错误,发生时程序终止;后者可以处理,使应用程序正常运行);
- 运行时异常与一般异常(受检异常)区别是什么?(前者包括RuntimeException及其子类,在JVM运行期间出现的异常,编译器不会检查;后者是其余异常,编译器会检查;两者的区别:是否要求调用者必须处理;
- JVM如何处理异常?
- Java的深拷贝与浅拷贝?
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。
深拷贝:深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。即深拷贝把要复制的对象所引用的对象都复制了一遍。(可用序列化实现) - 编译性语言与解释性语言的区别?
编译性语言
1)只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可以;因此其执行的效率比较高;
2)编译性语言代表:C、C++、Pascal/Object Pascal(Delphi);
3)程序执行效率比较高,但比较依赖编译器,因此跨平台性差一些;
解释性语言
1)源代码不能直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行;
源代码—>中间代码—>机器语言
2)程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次;
3)解释性语言代表:Python、JavaScript、Shell、Ruby、MATLAB等;
4)运行效率一般相对比较低,依赖解释器,跨平台性好; - 什么是Java中的绑定?分为哪些?
绑定:指一个方法的调用和该方法所属的类相关联,意思是在执行这个方法的时候,JVM知道调用的是哪个类的方法,类和方法相关联;
Java绑定分为静态绑定和动态绑定;
静态绑定:指程序执行前就知道该方法所属的类,即编译前该方法就已经绑定,在Java中静态绑定只有:private、static、final修饰的方法和构造方法;
动态绑定:动态绑定是指程序运行时根据对象类型进行绑定,也叫运行时绑定或者后期绑定;方法沿着继承链的多个类寻找关联,直到找到类中该方法的实现;体现了Java的继承和多态;
Spring
- 什么是Spring?(轻量级、非入侵式、IOC、AOP)
- 什么是轻量级?(Spring给用户提供的服务由用户决定,而不需要全部加载;重量级框架:EJB)
- 什么是IOC和AOP?(控制反转、面向切面编程)
- 为什么使用Spring?(解耦、方便测试、降低API的使用难度、可集成各种优秀框架、声明式事务、可重用组件)
- Spring的缺点?(依赖反射来完成功能,反射影响性能、使用门槛升高)
- 什么是Spring的非入侵式?(允许自由选择和组装Spring框架的各个功能,而不强制要求必须使用某个类或者实现某个接口)
- 非入侵式的设计的目的是什么?(使应用程序代码对框架的依赖最小化、不需要修改核心功能实现代码)
- 如何实现非入侵式?(应用反射机制,通过动态调用的方式提供功能、配合使用Spring框架中的组件类实现对象的创建和属性注入)
- Spring由哪些模块组成?(核心容器,实现IOC和DI、AOP模块、DAO模块、Web、消息、测试)
- Spring中用到哪些设计模式?(工厂、单例、代理、模板、观察者)
- IOC的作用?(管理对象的创建和依赖关系的维护、解耦、托管类的创建过程)
- BeanFactory和AplicationContext的区别?(前者是Spring中最底层的接口,包含各种Bean的定义,读取Bean配置文件,管理Bean的架子啊、实例化,控制Bean的生命周期,维护Bean之间的依赖关系;后者是BeanFactory的派生,除了管理Bean,还提供了其他框架功能:比如支持国际化、统一的资源文件访问方式、在监听器中注册bean事件、同时加载多个配置文件;二者的加载方式也不同:前者采用延迟加载形式zhurubean,只有调用getBean()方法时才对bean进行实例化加载;后者是在容器启动时就一次性加载所有bean,若配置bean较多时程序启动较慢;
- 什么是Spring的依赖注入?怎样实现?(IOC的具体实现;构造器或者setter方法)
- Spring配置元数据有几种方式?(XML、基于注解、基于Java)
- Spring支持哪几种bean的作用域?(singleton、prototype、request、session、global-session)
- Spring中单例bean线程安全吗?(不安全,需要开发者自己保证线程安全,如设置作用域为prototype)
- Spring如何处理线程并发问题?(大多数bean是无状态的,对Bean中非线程安全状态采用ThreadLocal进行处理,ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突,因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了)
- Spring中bean的生命周期?
- 什么是内部bean?(仅被用作另一个bean的属性)
- Spring自动装配的方法有哪些?(默认是no,通过手动设置ref来装配;byName;byType;constristor(根据构造器参数byType装配);autodetect(自动探测,看是否有构造器,没有则byType)
- Autowired注解自动装配的过程?(先通过类型,只有一个则注入,若有多个类型则根据名称,若找不到则抛出异常)
- @Required注解的作用?(表明bean的属性在配置时必须设置)
SpringBoot
- SpringBoot的优点?(容易上手、开箱即用、远离繁琐的配置、提供通用的非业务性功能如内嵌服务器、安全管理等、不需要xml配置、避免大量依赖导入造成的版本冲突)
- SpringBoot核心注解?(@SpringBootApplication,由@SprngBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解构成)
- 什么是JavaConfig?(通过Java来配置Spring容器。减少或消除xml配置)
- SpringBoot自动装配的原理?(@EnableAutoConfiguration给容器导入自动配置类)
- 什么是yml?(可读的数据序列化语言,用于作为配置文件,具有分层配置的特点)
- springboot-boot-starter-parent的作用是什么?(定义Java编译版本、使用UTF-8格式编码、继承springboot-dependencies,里面定义了依赖及版本、自动化资源过滤和插件配置)
- SpringBoot打包成的jar与普通jar包有什么区别?(SpringBoot打包成的jar是可执行的jar,不可用作依赖或使用其中的类)
- SpringBoot与Spring的区别?(SpringBoot内嵌了tomcat、jetty等容器,不需要部署、不用进行繁琐的xml配置、SpringBoot可以直接打包运行)
SpringMVC
- 什么是SpringMVC?(基于Java实现了MVC设计模式的轻量级web框架)
- 什么是MVC?(一种设计模式,模型、视图、控制器)
- MVC的优点?(支持各种视图技术、Spring框架集成、支持请求资源的映射策略、清晰的角色分配、分层设计如处理器映射、处理器适配器、视图解析器)
- 什么是DispatcherServlet?(MVC的核心,处理http请求和响应)
- 什么是SpringMVC的控制器?(控制器提供一个访问应用程序的行为,通过服务接口来实现,控制器解析用户输入并转换为一个由视图呈现给用户的模型)
- SpringMVC的底层工作流程?
- SpringMVC常用注解?
MyBatis
- 什么是MyBatis?(一款持久层框架,半ORM(对象关系映射)框架,支持定制化SQL、存储过程以及高级映射,避免了JDBC代码和手动设置参数、获取结果集,使用简单的xml或者注解来配置和映射原生类型、接口和pojo)
- 什么是ORM?(对象关系映射,是一种解决关系型数据库中数据与java对象映射关系的技术)
- 为什么MyBatis是半自动ORM框架?(MyBatis在查询关联对象时需要手动编写sql完成;全自动ORM框架如Hibernate查询关联对象时可以根据对象关系模型直接获取)
- 传统JDBC有什么不足?MyBatis怎样解决?
JDBC数据库连接的创建、释放频繁造成系统资源浪费从而影响性能;MyBatis使用数据连接池管理数据库连接。
JDBC的sql语句写在Java程序代码中,不易维护,变动时可能需要更改Java代码;MyBatis将sql语句卸载mapper.xml文件中,与Java代码分离。
JDBC的sql语句传参麻烦、结果解析麻烦;MyBatis半自动将Java对象映射至sql语句和结果。 - MyBatis缺点?(Sql语句依赖数据库,不能随意更换数据库)
- MyBatis编程步骤?
创建SqlSessionFactory、通过SqlSessionFactory创建SqlSession、通过SqlSession执行数据库操作、session.commit()提交事务、session.close()关闭会话; - MyBatis的工作原理?
1) 读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接;
2) 加载映射文件,即SQL映射文件,文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件中加载,可以加载多个映射文件,每个文件对应一张表;
3) 构建会话工厂:SqlSessionFactory;
4) 创建会话对象:由会话工厂创建会话对象SqlSessionFactory,里面包含了SQL语句的所有方法;
5) MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存和维护;
6) 在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息;
7) 输入参数的映射;
8) 输出结果的映射; - 为什么需要预编译?(优化SQL语句的执行、预编译对象可以重复利用,把该对象缓存下来可以下次用于同一个SQL)
- MyBatis有哪些Executor执行器?它们的区别是什么?
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完关闭;(默认)
ReuseExecutor:执行update或select时以sql作为key查找Statement对象,存在直接使用,不存在则创建,用完后不关闭而是放入Map<String,Statement>内,重复利用;
BatchExecutor:执行update时,将所有sql都添加到批处理中,等待统一执行,它缓存了多个Statement对象,每个对象都等待逐一执行批处理; - Mapper中如何传入多个参数?(resultMap顺序传参、@Param注解传参、Map传参、实体类传参)
- 当实体类中属性名与表中字段不一样怎么办?(查询语句中定义别名使其与属性名相同、通过resultMap来映射字段名和属性名)
- MyBatis实现一对多、多对一怎样实现?(联合查询、嵌套查询)
- 什么是MyBatis动态SQL?(在xml映射文件中以标签的形式编写,完成逻辑判断和动态拼接的功能)
- MyBatis缓存?(一级缓存、二级缓存)
JVM
- JVM的组成?(程序计数器、虚拟机栈、本地方法栈、堆、方法区)
- Java程序运行机制步骤?
编写Java源代码,生成.java文件、编译器javac命令将源代码编译成字节码文件.class、解释器java命令运行字节码 - 什么是类的加载?(指将类的.class文件中的二进制数据读入到虚拟机内存中,将其放在运行时数据区的方法区内,然后在堆中创建一个java.lang.Class对象,用来封装在方法区内的数据结构;
- JVM中5个区域的作用?
- JVM内存分配方式?(指针碰撞、空闲列表)
- 判断堆是否规整?(垃圾收集器是否带有压缩整理功能)
- JVM怎样处理分配内存的并发安全问题?(堆分配内存的动作进行同步处理、每个线程在堆中先预分配内存,称为本地线程分配缓冲)
- 访问堆中对象时有哪些方式?(指针、句柄)
- JVM存在内存泄漏吗?(内存泄露指不再被使用的对象或者变量一直占据在内存中,理论上JVM有垃圾回收机制,但是当长生命周期对象持有短生命周期对象的引用时,导致短生命周期对象不被回收,可能导致内存泄漏)
- 简述JVM垃圾收集机制?(对象内存的释放由虚拟机自行执行)
- Java中有哪些引用类型?(强引用:gc不回收;软引用:内存溢出前回收;弱引用:下一次gc回收;虚引用:无法或的对象,用途是gc时返回通知)
- JVM有哪些垃圾回收算法?(标记清除、复制、标记整理、分代)
- JVM有哪些垃圾收集器?(Serial、CMS、G1)
- 什么是双亲委派模型?(一个类加载器收到类加载请求时,首先将请求委派给父类加载器完成,直到父类不能完成时才返回给子类)
MySQL
- 什么时SQL?(结构化查询语言,一种数据库查询语言,用于存取数据、查询、更新、管理关系数据库)
- 数据库三大范式?(列不可拆分、列完全依赖主键、列只依赖于主键)
- MySQL有哪些存储引擎?(InnoDB、MyISAM、MEMORY)
- MyISAM与InnoDB的区别?
- InnoDB的特征?(插入缓冲、二次写、自适应哈希索引、预读)
- 存储引擎的选择?(MyISAM以读写插入为主的应用程序;InnoDB以更新、删除操作频率高、需要保证数据的完整性为主的应用程序;并发量高、支持事务和外键)
- 什么是索引?(索引是一种特殊的文件,包含着对数据表里所有记录的引用指针;索引是一种排序数据结构,协助快速查询、更新数据,实现通常是B树及B+树;)
- 索引的优缺点?(加快检索的速度,提高系统性能;创建和维护耗费时间,降低增删改查执行效率、占用物理空间)
- 百万级以上的数据如何删除?(先删除索引、然后删除无用数据、删除完成后再重新创建索引)
- 数据库为什么使用B+树索引?
- 什么是数据库事务?(数据库操作集合)
- 事务的四个特性?(原子性:事务要么全部发生,要么完全不发生、一致性:事务前后数据保持一致、隔离性:并发访问数据库时,一个用户的事务不被其他事务干扰、持久性:事务提交以后对数据库的改变是持久的)
- 什么是脏读、幻读、不可重复读?(脏读:某个事物更新了数据,另一个事务此时读取了同一份数据,但是前一个事务回滚了,则后一个事务读取的数据不正确(读取了还未提交的数据);不可重复读:一次事务中两次查询数据不一致;幻读:在一个事务的两次查询期间执行了另一个事务导致前后读取的数据不同;
- 什么是事务的隔离级别?(隔离级别是为了保证并发操作数据的正确性)
- 事务的隔离级别有哪几个?MySQL默认是什么隔离级别?(读取未提交、读取已提交、可重复读、可串行化;默认是可重复读)
- 分别介绍下四个隔离级别以及解决的问题?
读取未提交:最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读、幻读或不可重复读;
读取已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但是可能导致幻读或不可重复读;
可重复读:一个事务内对同一字段的多次读取结果都是一致的,除非数据是被事务本身自己所修改,可以阻止脏读和不可重复读,但是幻读仍有可能发生;
可串行化:最高的隔离级别,完全服从ACID,所有事务依次逐个执行,事物之间完全不可能产生干扰,可防止脏读、不可重复读和幻读; - 隔离级别与锁的关系?
读取未提交:读取数据不需要加共享锁;
读取已提交:读取数据需要加共享锁,语句执行完以后释放共享锁;
可重复读:读取数据需要加共享锁,事务提交完毕以后释放共享锁;
可串行化:锁定整个范围的键,持有锁直到事务完成; - 按照锁的粒度分数据库锁有哪些?(行级锁(InnoDB引擎默认)、表级锁(MyISAM引擎默认、InnoDB引擎)、和页级锁(BDB引擎)
- 行级锁、表级锁和页级锁对比?
行级锁:粒度最细的锁,表示只针对当前操作的行进行加锁,大大减少数据库操作的冲突,但是开销也最大;分为共享锁和排他锁;
表级锁:粒度最大的锁,表示对整张表加锁,实现简单,开销小,MyISAM和InnoDB都支持;分为共享锁和排他锁;
页级锁:粒度介于行级锁和表级锁,一次锁定相邻的一组数据; - 按照锁的分类有哪些?
共享锁:又叫读锁,当进行数据读取时,对数据加上共享锁,可以加多个;
排他锁:又叫写锁,当进行数据写入时,对数据加上排他锁,只可以加一个,与其他排他锁、共享锁互斥; - InnoDB怎样实现行级锁?(基于索引来完成)
- InnoDB存储引擎锁的算法?
Record Lock:单个行记录上的锁;
Gap Lock:间隙锁,锁定一个范围,不包括记录本身;
Next-Key Lock:Record+Gap锁定一个范围,包含记录本身; - 什么是死锁?(两个或多个事务在统一资源上互相占用,并请求锁定对方的资源,从而导致恶性循环)
- 数据库的乐观锁和悲观锁是什么?怎样实现?
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式进行锁定。实现方式:一般使用版本号机或CAS算法实现;
悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候把事务锁起来,直到提交事务;实现方式:数据库中的锁机制; - SQL约束有哪几种?(NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY 、CHECK)
- SQL有哪些关联查询?(交叉连接、内连接、外连接、联合查询、全连接、交叉连接)
- Float与Double的区别是什么?(Float存储最多8位10进制数并在内存中占4字节;Double存储最多18位十进制数,并在内存中占8字节)
- Delete、Drop、Truncate的区别?(Delete删除部分数据行;Drop删除一张表;Truncate删除表中所有数据但保留表)
- SQL的生命周期?
1)应用服务器与数据库服务器建立一个连接;
2)数据库进程拿到请求的SQL;
3)解析SQL并生成执行计划,执行SQL;
4)读取数据到内存并进行逻辑处理;
5)发送结果到应用;
6)关掉连接,释放资源; - 如何定位及优化SQL语句的性能问题?
对于低性能的SQL语句的定位,最有效的方式是使用执行计划,MySQL提供了explain命令来查看语句的执行计划;
对于查询语句最重要的优化方式是使用索引,而执行计划就是显示数据库引擎对于SQL语句的执行的详细情况,其中就包含了是否使用了索引、使用了什么索引、使用的索引相关信息等; - 怎样优化大型表的数据查询?
1)优化shema(数据库对象的集合)、SQL语句加索引;
2)加缓存;
3)主从复制,读写分离;
4)分布式系统; - 超大分页怎么处理?(减少加载的数据,使用limit、减少请求、加缓存)
- 慢查询怎样优化?
慢查询的原因:
1)加载了不需要的数据——>对语句进行分析及重写;
2)查询条件没有命中索引——>修改语句或修改索引,使得语句尽可能命中索引;
3)数据量太大——>语句无法优化时,可以进行横向或者纵向的分表; - 为什么尽量设置主键?(确保数据行在表的唯一性,更加快速地对表进行读写以及确保数据范围安全)
- MySQL怎样实现主从复制?(将主数据库中的DDL和DML操作通过二进制日志传输到从数据库,然后将这些日志上的数据库操作重新执行,使得从数据库的数据与主数据库保持一致;
- 主从复制的作用?(应对主数据库故障、可以进行数据库的读写分离、数据库日常备份)
Redis
- 什么是Redis?(使用C语言编写的、开源的、高性能非关系型键值对数据库;可以存储键和五种类型的值之间的映射,键只能是String,值支持:字符串、列表、集合、哈希、有序列表;Redis的数据存放在内存,读写速度快,广泛用于内存;
- Redis的优缺点?
优点:读写快、支持持久化、支持事务、数据结构丰富、支持主从复制、可设置哨兵模式;
缺点:数据库容量收到物理容量的限制,不能用作海量数据的存储和读写、不具备自动恢复功能、较难支持在线扩容,需要设置足够大的空间; - 为什么使用Redis作为缓存?(读写快,高性能;分担持久型数据库的请求负担,应对高并发的情况)
- Redis与其他key-value存储的区别?
1)Redis有着更多种类的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
2)Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
3)Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。 - Redis为什么读写快?(完全基于内存运行、数据结构简单、采用单线程而不需要考虑锁的开销、使用多路I/O复用模型,非阻塞IO)
- 什么是Redis的持久化?(将数据从内存写入到磁盘)
- Redis持久化机制是什么?
RDB:Redis默认的持久化方式,按照一定的时间将内存中的数据以快照的形式保存到硬盘中,对应产生的数据文件是dump.rdb。通过配置文件中的save参数定义快照的周期;
AOF:将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据;
两种同时开启时,数据恢复会优先选用AOF; - 两种持久化机制各自的优缺点是什么?
RDB
优点:只有一个dump.rdb文件,方便持久化、性能最大化,通过fork子进程来完成持久化的写入,主程序继续执行处理命令,保证Redis的高性能、比AOF的启动效率更高;
缺点:数据安全性低、若持久化时间之间Redis发生故障则容易丢失数据;
AOF
优点:数据安全,每次Redis命令都记录在日志,保证数据不会缺失;
缺点:文件比RDB大,恢复速度慢、数据庞大时启动效率低; - 如何选择合适的持久化方式?(对数据完整性要求不高、追求性能:RDB;追求数据完整:AOF)
- 什么是Redis的过期策略?(处理过期的缓存数据的方式)
- Redis过期策略有哪些?
定时过期:立即清除过期数据;该策略对内存友好,但会占用CPU取处理过期数据,影响缓存的响应时间和吞吐量;
惰性过期:当访问一个key时才去判断该key是否过期,过期则清除;该策略可以节省CPU资源,但是对内存不友好,可能存在过期的key不再被访问但却占用大量内存的情况;
定期过期:每隔一定时间扫描一定数量数据库中的定时key,并清除其中已经过期的key;
Redis同时使用了惰性过期和定期过期两种策略 - 什么是Redis的内存淘汰策略?(处理内存不足时需要申请额外空间的数据的方式)
- Redis的内存淘汰策略有哪些?
全局的键空间选择性移除(当内存不足以容纳写入数据时)
新的写入操作会报错;
在键空间中移除最少使用的key(最常用);
随机移除某些key;
设置过期时间的键空间选择性移除(当内存不足以容纳写入数据时)
移除最近最少使用的key;
随机移除某个key;
有更早过期时间的key优先移除; - Redis怎样内存优化?(尽量将数据放入紧凑的结构——表中)
- Redis事务的实现?(通过MULTI、EXEC、WATCH等一组命令的集合,将事务中所有命令序列化然后按顺序执行)
- Redis事务保证原子性吗?(单个命令保证,事务不保证,不支持回滚,任意命令执行失败时其余命令仍然执行)
- 什么是哨兵?(用于监控Redis集群的进程是否正常工作、发生故障时发送消息警报、自动切换主Redis库、发送新的master地址的通知)
- 哨兵的作用?(保证Redis集群的高可用性和数据的安全性)
- Redis主从架构的作用?(读写分离,主库写,从库读,支持高并发和提供高可用性)
- 什么是Redlock?(官方提供的实现分布式锁的方式,具有安全、互斥、避免死锁、大部分Redis节点存活就可以提供服务的特性)
- 有哪些缓存异常?(缓存穿透、缓存雪崩、缓存击穿)
- 什么是缓存穿透?怎样解决?
缓存穿透是指请求一个缓存和数据库中都不存在的数据,导致所有对这个数据的请求都会落到数据库中,造成数据库的巨大压力;
解决方案:布隆过滤器、缓存空值; - 什么是缓存雪崩?怎样解决?
缓存雪崩是指同一时间内缓存大面积失效,导致对数据的请求都落到数据库,造成数据库短时间内承受大量请求压力;
解决方案:设置随机的过期时间、加锁、增加缓存标记,失效时更新数据缓存 - 什么是缓存击穿?怎样解决?
缓存击穿是指缓存失效后同一时间内对这一数据的大量请求,导致数据库压力突然增加;
解决方案:热点数据永不过期、加互斥锁、缓存预热; - 什么是缓存降级?作用是什么?
缓存降级是当缓存服务出现问题但仍然需要保证服务可用时,根据一些关键数据进行自动降级或配置开关实现人工降级;
作用:保证核心服务可用,即使有损;
常见做法:Redis出现问题,不去数据库查询,而是直接返回默认值; - Redis与Memcached的区别?
数据类型:Redis支持字符串、列表、哈希、集合、有序集合;Memcached支持文本型和二进制类型;
持久化:Redis支持持久化,Memcached不支持;
IO方式:Redis使用单线程的多路IO复用模型;Memcached支持多线程、非阻塞IO模式;
附加功能:Redis支持发布/订阅、主从架构、序列化;Memcached支持多线程服务; - 怎样保证缓存与数据库的数据一致性?
1.读写请求串行化,但会导致系统吞吐量大幅下降;
2.写请求时先更新数据库,然后删除缓存; - 一个字符串类型的值能存储的最大容量?(512M)
- Redis回收使用什么算法?原理是什么?
LRU算法:最近最久未使用算法;
LRU算法作为内存管理的一种有效算法,其含义是在内存有限的情况下,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间;LRU算法就提供了一种策略,告诉我们选择最近一段时间内,最久未使用的对象将其淘汰;
计算机网络
- 什么是网络协议?(通信双方交换数据前约定好的规则,比如交换数据的格式、流程等,这些规则称为协议)
- 为什么要对网络协议分层?(简化通信难度,各层独立可以分割困难、灵活性好,分层技术变化时其他层不受影响、功能可以被有层次地描述、实现和维护)
- 四层协议、五层协议、七层协议?
TCP/IP四层协议:应用层、传输层、网际层和网络接口层;
五层协议:应用层、传输层、网络层、数据链路层、物理层;
七层协议:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层; - 应用层任务?有哪些协议?(完成应用进程之间的通信和交互;http、dns、smtp)
- 传输层任务?有哪些协议?(负责向两台主机进程之间的通信提供通用的数据传输服务,应用进程通过该服务传送应用层报文;TCP、UDP)
- TCP和UDP的区别?
TCP(传输控制协议)是面向连接的、可靠的传输服务,支持一对一的通信,面向字节流,首部开销较大(20—60字节);
UDP(用户数据协议)是无连接的传输服务,支持一对一、一对多、多对一和多对多的通信,面向报文,首部开销小(8字节); - 运行再TCP上的协议有哪些?(http、https、ftp、pop3、smtp、ssh)
- 运行在UDP上的协议有哪些?(bootp、ntp、dhcp)
- 网络层任务?
- TCP三次握手?四次挥手?