文章目录
- Java 基础面试题
- Java 多线程面试题
- 数据库面试题
- spring/springboot 面试题
- 1. springboot 自动配置原理
- 2.什么是 springboot
- 3.springboot 有什么优点
- 4.Spring、SpringMVC和SpringBoot的关系?
- 5.Spring Boot的核心注解是哪些?他主由哪几个注解组成的?
- 6.SpringBoot的核心配置文件有哪几个?他们的区别是什么?
- 7.什么是Spring Boot Starter?有哪些常用的?
- 8.spring-boot-starter-parent有什么作用?
- 9.列举一些重要的Spring模块?
- 10.什么是IOC? 如何实现的?
- 11.什么是AOP? 有哪些AOP的概念?
- 12.AOP 有哪些应用场景?
- 13.spring bean的生命周期
- 14.@Component和@Bean的区别是什么?
- 15.将一个类声明为Spring的bean的注解有哪些?
- 16.Spring事务中的隔离级别有哪几种?
- springmvc 面试题
- Mybatis 面试题
- ElasticSearch搜索引擎常见面试题
- 1.什么是Elasticsearch?什么是elastic stack(ELK)?什么是Lucene?
- 2.什么是倒排索引?什么是正向索引?有什么区别?
- 3.倒排索引是如何工作的?
- 4.什么是 Analyzer
- 5.ES 的主要用途?
- 6.什么是 ES 的分片?
- 7.Elasticsearch 的一些基本概念
- 8.mysql 与 elasticsearch 对比
- 9.ik分词器两种模式?IK分词器如何拓展词条?如何停用词条?
- 10.DSL 语句进行索引库操作有哪些?
- 11.DSL 文档操作有哪些?
- 12、RestClient操作索引库
- 13.RestClient操作文档
- 14.match和multi_match的区别是什么?
- RabbitMQ 面试题
- Springcloud 微服务技术栈面试题
- Redis 面试题
- 前端面试题
- 一、HTML 面试题
- 二、css 面试题
- 三、JavaScript 面试题
- 四、jQuery 面试题
- 五、Vue 面试题
- 1.什么是 Vue
- 2.Vue框架原理
- 3.vue 有哪些指令
- 4. Vue 有哪些属性
- 5.== 和 === 区别
- 6.Vue生命周期
- 7.jQuery和vue的比较
- 8.什么是axios?Axios向后台发送数据的类型?Axios配置请求参数?
- 9.v-if 和 v-show 有什么区别
- 10.v-bind和v-on的区别
- 11.v-on 可以绑定多个方法吗
- 12.v-bind和v-model的区别
- 13.vue.js的两个核心是什么(特性是什么)
- 14.Vue 路由如何使用
- 15.路由的跳转方式(两个网页之间怎么跳转)
- 16.路由的跳转:数据的传递(传参)
- 17.Vue 父子组件传参
- 18.Vue 生命周期哪个调用一次,哪个调用多次?
- 19.v-if 和 v-for 的优先级(v-if 和 v-for 可以同时使用吗)
- 六、ES6 面试题
Java 基础面试题
Java 多线程面试题
1.什么是线程?
- 线程:程序内部的一条执行流程。
- 多线程:从软硬件上实现的多条执行流程的技术。
2.多线程创建的方式有几种?
- 继承
Thread 类
,重写run
方法 - 实现
Runnable
接口 - 实现
Callable
接口,重写call
方法
3.在启动线程的时候,可以使用run方法吗? run()和 start()有什么区别?
不可以。
- run 方法只是一个普通的方法,只能在主线程里面运行,可以运行多次。
- start 方法是用来启动线程只可以执行一次。
4.什么是线程安全?
线程安全,从现实业务角度来说,如果又 100 张火车票,同时开通 3 个窗口售票,售票结束系统内剩 97 张火车票,那么就是线程安全的,否则就是线程不安全。
5.线程和进程的区别?
- 进程:一个程序在执行过程中
分配和管理资源
的基本单位,当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。比如,当我们打开 idea 时,就是开启了一个进程。 - 线程:程序内部的一条执行流程。是进程中的一个执行单元,是CPU调度和分派的基本单位。
6.Runnable 和 Callable 有什么区别?
- Runnable 接口 run 方法没有返回值。
- Callable 接口 call 方法有返回值,是个泛型,和 Future、FutureTask 配合可以用来获取异步执行的结果。
- Callable 接口的()方法允许抛出异常,而 Runnable 接口的 run() 方法的异常只能在内部消化,不能继续上抛。
6.并发和并行的区别
- 如果是在单核CPU上,多个任务交替执行,那么就是并发。
- 如果是在多核CPU上同时执行多个任务,那么就是并行。
7.线程包括哪些状态(线程的生命周期),状态之间是如何变化的?
线程的状态(生命周期)共有6个阶段:
- 新建状态:创建一个线程但未执行start()方法;
- 就绪状态:执行start()方法之后
- 运行状态:获取CPU的调度
- 阻塞状态:运行中线程无法获取锁、执行了wait()方法、执行sleep()方法
- 等待状态:阻塞中的线程获取锁,执行了notify()方法,等待时间过期
- 死亡状态:线程执行完毕
8.notify()和 notifyAlI()有什么区别?
- notifyAll:唤醒所有wait的线程
- notify: 只随机唤醒一个 wait 线程
9.wait和sleep方法的区别?
共同点
wait0,wait(long)和 sleep(long)的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态
。
不同点
- 方法归属不同:sleep(long)是
Thread 的静态方法
;wait(),wait(long)都是Object 的成员方法
,每个对象都有。 - 醒来时机不同:执行 sleep(long)和 wait(long)的线程都会在等待相应毫秒后醒来;wait(long)和 wait0 还可以被 notify 唤醒,wait0 如果不唤醒就一直等下去。
10.线程同步
什么是线程同步?
让多个线程实现先后依次访问共享资源
,这样就解决了安全问题。也就是说,虽然同时卖了3张火车票,但是这3张票其实是一个个依次取访问系统的。
保证线程安全的方法有哪些?
加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来。比如 A、B、C 三个人同时买车票,三个线程同时进来,A 加锁访问买到车票后,然后 B 和 C 依次加锁进入。
具体方法:
- 同步代码块:把业务处理的核心代码给上锁,以此保证线程安全。
synchronized(同步锁) {
// 访问共享资源的核心代码
// 每次只允许一个线程加锁后进入,执行完毕后自动解锁,其他线程才可进来执行。
}
- 同步方法:把业务逻辑的核心方法给上锁,保证线程安全
修饰符 synchronized 返回值类型 方法名(形参列表) {
// 操作共享资源的代码
}
- Lock 锁:Lock 是
接口
,不能直接实例化,可以采用他的实现类ReentrantLock
构建 lock 锁对象
private final Lock lk = new ReentrantLock();
// 小明 小红同时过来
public void drawMoney(double drawMoney) {
// 先弄清楚谁来取钱
String name = Thread.currentThread().getName();
lk.lock(); // 加锁
// 判断余额是否足够
if (this.money >= drawMoney) {
System.out.println(name + "来取钱" + drawMoney + "成功!");
this.money -= drawMoney;
System.out.println(name + "来取钱后,余额剩余:" + this.money);
} else {
System.out.println(name + "来取钱,余额不足");
}
lk.unlock(); // 解锁
}
11、线程池的核心参数有哪些?创建线程池需要注意什么?
数据库面试题
1.数据库的引擎有哪些?有什么区别?
- InnoDB引擎(MySQL 数据库默认的引擎)
- MYISAM引擎
InnoDB与MyISAM差别:
1.事务支持: InnoDB 支持事务,MyISAM 不支持事务。 这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2. InnoDB 支持外键,而 MyISAM 不支持。 对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3. 存储方式:MyISAM使用非聚簇索引,索引文件和数据文件是分开的;而InnoDB使用聚簇索引,将索引和数据一起存储在同一个文件中。
什么是聚簇索引?
聚簇索引(Clustered Index)一般指的是主键索引(如果存在主键索引的话),聚簇索引也被称之为聚集索引。
2.Having 和 where 有什么区别
① WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数
② WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤
③ WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤
④ WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名
⑤ 一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组
3.MySQL 关键字执行的顺序是什么
from
on
join
where
group by
having
select
distinct
union (all)
order by
limit
4.设计表三范式
第一范式:表的字段(列)是不可分割的
第二范式:先满足第一范式。每个表都有主键。每条记录都是唯一的
第三范式:先满足第二范式。不能有传递依赖。(非主键外的所有字段必须互不依赖,例如:学生信息表不能存在学校的信息(学校名字,学校电话,学校地址),即学生表只能存学生信息,学校表只能存学校信息)
5.数据库事务?事务的隔离级别有哪些?
数据库事务:一系列 SQL 语句的操作单元。这些 SQL 语句要么都执行,要么都不执行。
数据库事务隔离级别:
6.数据库索引
(1)什么是索引?索引有什么优缺点?
索引概念
用于提高数据检索性能的排好序的数据结构
。它类似于书籍的目录,将列或多个列的值与它们在数据表中对应的行关联起来
,以加快查询速度。
索引优缺点
优点:
- 提高查询性能
- 唯一性约束
缺点:
- 占用存储空间
- 索引维护的开销
(2)索引有什么分类?
- 主键索引:用于唯一标识每一条记录,主键索引的值不允许重复且不能为空,并且一个表只能有一个主键索引。
- 唯一索引:用于保证索引列的值唯一,允许为空值,但是一个表可以有多个唯一索引。
- 普通索引:没有唯一性限制,允许重复值和空值,是最基本的索引类型。
- 组合索引:在多个字段上创建的索引,可以包含多个列。组合索引可以提高多列查询的性能,但查询条件必须符合最左前缀原则,即查询从左到右使用组合索引中的列。
(3)创建索引需要注意什么(如何创建索引)
①首先应考虑在 where 及 order by ,group by
涉及的列上建立索引
②数据重复度不高
的去建立索引,比如身份证号和名字,要用身份证号去作为索引
③可以尝试创建联合索引
④UPDATE、DELETE 的 WHERE
条件列
(4)如何判断索引是否生效
在select语句前加上explain就可以了:explain select surname,first_name form a,b where a.id=b.id
explain的字段:
EXPLAIN命令在MySQL中返回一组结果集,其中包含有关查询执行计划的详细信息。以下是常见的EXPLAIN结果集中可能出现的字段:
- id: 查询的唯一标识符,用于标识每个查询操作的顺序。
- select_type: 查询的类型,例如简单查询、子查询、联合查询等。
- table: 查询涉及的表名。
- partitions: 查询涉及的分区信息。
- type: 表示连接类型或访问方式,如ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。
- possible_keys: 表示可能使用的索引。
- key: 实际使用的索引。
- key_len: 使用的索引的长度。
- ref: 表示连接条件或常量与索引之间的比较值。
- rows: 估计的结果集行数。
- filtered: 过滤条件所过滤的行的百分比。
- Extra: 额外的信息,如使用临时表、文件排序等。
(5)索引失效的情况有哪些(索引为什么会失效)
- 使用函数或表达式:当查询条件中对索引列应用了函数、数学运算、类型转换等操作时,索引可能无法被使用。因为索引的创建是基于原始列值的,无法直接使用函数计算后的结果进行索引匹配。
- 不满足索引列顺序:如果查询条件中的列顺序与索引列的顺序不一致,索引可能无法被使用。例如,一个联合索引(A, B),如果查询条件只包含了B列而没有A列,那么这个索引就无法被利用。
- 使用了NOT、<>、OR等非优化的逻辑操作符:这些逻辑操作符在查询条件中的使用会导致索引失效,因为它们无法充分利用索引的特性。
7.SQL语句如何优化?(MySQL调优?)
①查询SQL尽量不要使用select *,而是具体字段
②避免使用 is null或者 is not null,容易是索引失效
③避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
④避免在 where 子句中使用 or 来连接条件
⑤避免在where子句中对字段进行函数操作
⑥创建索引
8.mysql 中 in 和 exists 的区别
- 使用 IN 条件时,比较的是指定列的值是否在给定的值列表中。
- 使用 EXISTS 条件时,判断的是子查询是否返回了至少一行结果。
9.如何快速定位慢 SQL
- 使用
EXPLAIN
分析执行计划:对于慢查询的SQL语句,使用EXPLAIN命令来查看其执行计划。通过分析执行计划,确定查询是否有效利用了索引以及是否存在性能瓶颈。 - 检查索引使用情况:确保查询中涉及的列都有适当的索引,并且查询条件能够充分利用索引。可以使用
SHOW INDEX
命令或查询表的索引信息来检查索引情况。 - 分析查询语句:仔细分析查询语句本身,检查是否存在冗余的操作、重复的子查询、不必要的排序、大量的JOIN操作等。
- 启用慢查询日志:在MySQL配置中启用慢查询日志,这样可以记录执行时间超过阈值的查询语句。通过分析慢查询日志,可以找到执行时间较长的SQL语句。
10. MySQL和Oracle的区别
1、主键:MySQL支持主键自增长,指定主键为auto increment,插入时会自动增长。Oracle主键一般使用序列。
2、字符串:MySQL字符串可以使用双引号包起来,而Oracle只可以单引号
3、分页:MySQL分页用limit关键字,而Oracle用到伪列ROWNUM和嵌套查询,而且只能使用小于,不能使用大于。
4、判断真假:MySQL中0、1判断真假,Oracle中true false
5、事务:MySQL中命令默认commit,但是Oracle需要手动提交
6、别名:在MySQL中from 后的表如果是(select…)这种,那么后面必须有别名
7、连接字符串:连接字符串在Oracle中用|| ,MySQL中用concat(‘a’,‘b’,‘c’)
11. 如何查看 SQL 语句执行时间
spring/springboot 面试题
1. springboot 自动配置原理
springboot 的核心注解 @SpringBootApplication, 它是一个复合注解,包含 @Configuration、@EnableAutoConfiguration、@ComponentScan。其中@EnableAutoConfiguration 就是开启自动配置功能。
2.什么是 springboot
SpringBoot 提供了一种快速使用 Spring 的方式
,开发人员不需要去配置大量文件。
3.springboot 有什么优点
1) 自动配置
当应用程序启动时,SpringBoot 会自动考虑 Spring 应该用哪个,不应该用哪个。
2) 起步依赖 (传递依赖)
所谓传递依赖,意思是:原来 spring 要实现某个功能,可能需要 A、B、C、D 四个依赖,但是现在 springboot 会有一个依赖 E,E 是包含了 A、B、C、D 四个依赖的,所以现在只需要引入 E 即可实现功能。
3) 辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。
4.Spring、SpringMVC和SpringBoot的关系?
Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件
;
Spring MVC属于SpringFrameWork的后续产品,是一种web层mvc框架
;
SpringBoot 提供了一种快速使用 Spring 的方式
,开发人员不需要去配置大量文件。
Spring包含了SpringMVC,而SpringBoot是在Spring的基础上做得一个扩展。
5.Spring Boot的核心注解是哪些?他主由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,他也是SpringBoot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置的功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class});
@ComponentScan:Spring组件扫描。
6.SpringBoot的核心配置文件有哪几个?他们的区别是什么?
SpringBoot的核心配置文件是application和bootstrap
配置文件。
application 主要用于Spring Boot项目的自动化配置
。
bootstrap配置文件有以下几个应用场景:
使用Spring Cloud Config配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息一些固定的不能被覆盖的属性;
一些加密/解密的场景;
7.什么是Spring Boot Starter?有哪些常用的?
Spring Boot Starter的目的也是简化配置,springboot 有一个特点就是传递依赖,之前Spring项目需要A、B、C、D四个依赖,现在只需要一个只需要一个配置spring-boot-starter-E
8.spring-boot-starter-parent有什么作用?
- 定义了Java编译版本
- 执行打包操作的配置
- 自动化的资源过滤
- 自动化的插件配置
9.列举一些重要的Spring模块?
- Spring Core:基础,可以说Spring其他所有的功能都依赖于该类库。主要提供IOC和DI功能。
- Spring Aspects:该模块为与AspectJ的集成提供支持。
- Spring AOP:提供面向切面的编程实现。
- Spring JDBC:Java数据库连接。
- Spring JMS:Java消息服务。
- Spring ORM:用于支持Hibernate等ORM工具。
- Spring Web:为创建Web应用程序提供支持。
- Spring Test:提供了对JUnit和TestNG测试的支持。
10.什么是IOC? 如何实现的?
在面向对象的系统中,所有业务逻辑的实现都是通过对象之间的协调合作,最终实现业务逻辑。但是种情况下会出现对象与对象之间耦合度较高的问题,如果其中一个对象出了问题就导致整个系统出了问题。
而 IOC 控制反转提供第三方 IOC 容器来控制协调对象之间的协作,使得对象之间没有了耦合关系,不必互相牵制,提高系统安全稳定性。
11.什么是AOP? 有哪些AOP的概念?
AOP(Aspect-Oriented Programming,面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护性。
AOP包含的几个概念:
- Jointpoint(连接点):具体的切面点点抽象概念,可以是在字段、方法上,Spring中具体表现形式是PointCut(切入点),仅作用在方法上。
- Advice(通知): 在连接点进行的具体操作,如何进行增强处理的,分为前置、后置、异常、最终、环绕五种情况。
- 目标对象:被AOP框架进行增强处理的对象,也被称为被增强的对象。
- AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理。
- Weaving(织入):将增强处理添加到目标对象中,创建一个被增强的对象的过程
12.AOP 有哪些应用场景?
- 记录日志(调用方法后记录日志)
- 监控性能(统计方法运行时间)
- 权限控制(调用方法前校验是否有权限)
- 事务管理(调用方法前开启事务,调用方法后提交关闭事务 )
- 缓存优化(第一次调用查询数据库,将查询结果放入内存对象, 第二次调用,直接从内存对象返回,不需要查询数据库)
13.spring bean的生命周期
- 实例化(Instantiation):在这个阶段,Spring会根据配置或注解创建Bean的实例。这可以通过构造函数实例化、工厂方法或者Bean容器中的其他方式来实现。
- 属性赋值(Population):在实例化后,Spring会通过依赖注入(Dependency Injection)或者属性赋值的方式,将Bean的属性值设置好。这可以通过setter方法注入或者字段注入来实现。
- 初始化(Initialization):在属性赋值完成后,Spring会调用Bean的初始化方法。这个方法可以通过实现InitializingBean接口的afterPropertiesSet()方法,或者在配置文件中通过init-method属性指定。
- 使用(In Use):在初始化完成后,Bean进入可用状态,可以被其他对象引用和使用。
- 销毁(Destruction):当Bean不再被需要时,Spring会调用Bean的销毁方法进行资源释放和清理工作。这个方法可以通过实现DisposableBean接口的destroy()方法,或者在配置文件中通过destroy-method属性指定。
14.@Component和@Bean的区别是什么?
- 作用对象不同。@Component注解作用于类,而@Bean注解作用于方法。
- @Bean注解比@Component注解的自定义性更强,而且很多地方只能通过@Bean注解来注册bean。比如当引用第三方库的类需要装配到Spring容器的时候,就只能通过@Bean注解来实现。
15.将一个类声明为Spring的bean的注解有哪些?
- @Component注解
- @Repository注解
- @Service注解
- @Controller注解
16.Spring事务中的隔离级别有哪几种?
在TransactionDefinition接口中定义了五个表示隔离级别的常量:
- ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。
- ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
springmvc 面试题
1.说说自己对于Spring MVC的了解?
MVC是一种设计模式,Spring MVC是一款MVC框架,帮助我们进行 web 层开发,可以很好的与 spring 继承。Spring MVC下我们一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。
2.Spring MVC的工作原理了解嘛?
- 客户端(浏览器)发送请求,直接请求到DispatcherServlet。
- DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
- .解析到对应的Handler(也就是我们平常说的Controller控制器)。
- HandlerAdapter会根据Handler来调用真正的处理器来处理请求和执行相对应的业务逻辑。
- 处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是逻辑上的View。
- ViewResolver会根据逻辑View去查找实际的View。
- DispatcherServlet把返回的Model传给View(视图渲染)。
- 把View返回给请求者(浏览器)。
Mybatis 面试题
ElasticSearch搜索引擎常见面试题
1.什么是Elasticsearch?什么是elastic stack(ELK)?什么是Lucene?
- Elasticsearch 是基于
Lucene 的 Restful 的分布式搜索引擎
,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。 - ELK:是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
- 是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
2.什么是倒排索引?什么是正向索引?有什么区别?
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条
,是根据文档找词条的过程。
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。比如搜索苹果手机,他会先把这个词分成苹果、手机两个词条,拿着词条找出ID 1、2、3。
区别:
- 正向索引可以给多个字段创建索引,查询速度很快。但是如果涉及到非索引字段,只能够全表扫描。
- 倒排索引做词条或者模糊搜索的时候非常快,但是只能给词条创建索引而不是字段
3.倒排索引是如何工作的?
- 文档需要经过
Analyzer处理
,将其拆分为一系列的词汇单元
(例如单词或短语),这些词汇单元被称为term(词条)
。比如华为手机,会给分成华为和手机两个词条。 - 将这些term作为倒排索引的键,将包含该term的文档编号、词频等信息作为值,存储在倒排列表中。每个term都对应一个倒排列表,存储了包含该term的所有文档的信息。
- 在查询时,用户输入的查询语句也需要经过相同的Analyzer处理,将其拆分为一系列的term。然后根据倒排索引,可以快速找到包含这些term的文档,并返回查询结果。
4.什么是 Analyzer
Analyzer是ElasticSearch中的一个组件,用于将输入的文本转化为索引时使用的文本特征向量。这主要包括将文本分解成一个个的词汇单元(例如单词或短语),并将这些词汇单元转化为特定的文本特征。
5.ES 的主要用途?
- 数据检索:ElasticSearch可以用于互联网应用、电商网站、日志管理、企业级搜索等场景,提供高效的搜索服务。
- 数据分析:ElasticSearch可以用于对大量数据进行实时分析,例如用户行为分析、流量分析、市场调研等。
6.什么是 ES 的分片?
- 分片:ES中所有数据的文件块
假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。
7.Elasticsearch 的一些基本概念
- 索引(Index),就是相同类型的文档的集合。
- type 类型:类型是用来定义数据结构,可以认为是 mysql 中的一张表,type 是 index 中的一个逻辑数据分类
- document 文档:类似于 MySQL 中的一行,不同之处在于 ES 中的每个文档可以有不同的字段,但是对于通用字段应该具有相同的数据类型,文档是es中的最小数据单元,可以认为一个文档就是一条记录。
- Field 字段:Field是Elasticsearch的最小单位,一个document里面有多个field
- shard 分片:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
- replica 副本:任何服务器随时可能故障或宕机,此时 shard 可能会丢失,通过创建 replica 副本,可以在 shard 故障时提供备用服务,保证数据不丢失,另外 replica 还可以提升搜索操作的吞吐量。
shard 分片数量在建立索引时设置,设置后不能修改,默认5个;replica 副本数量默认1个,可随时修改数量;
8.mysql 与 elasticsearch 对比
9.ik分词器两种模式?IK分词器如何拓展词条?如何停用词条?
分词器两种模式:
- ik_smart:最少切分,粗粒度
- ik_max_word:最细切分,细粒度
拓展词条:利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
10.DSL 语句进行索引库操作有哪些?
- 创建索引库:PUT /索引库名
- 查询索引库:GET /索引库名
- 删除索引库:DELETE /索引库名
- 添加字段:PUT /索引库名/_mapping
11.DSL 文档操作有哪些?
- 创建文档:POST /索引库名/_doc/文档id { json文档 }
- 查询文档:GET /索引库名/_doc/文档id
- 删除文档:DELETE /索引库名/_doc/文档id
- 修改文档:
– 全量修改:PUT /索引库名/_doc/文档id { json文档 }
–增量修改:POST /索引库名/_update/文档id { “doc”: {字段}}
12、RestClient操作索引库
- 初始化RestHighLevelClient:
初始化的代码如下:
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.150.101:9200")
));
- 创建XxxIndexRequest。XXX是Create、Get、Delete
- 发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
13.RestClient操作文档
- 初始化RestHighLevelClient
- 创建XxxRequest。XXX是Index、Get、Update、Delete
- 准备参数(Index和Update时需要)
- 发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete
- 解析结果(Get时需要)
14.match和multi_match的区别是什么?
- match:根据一个字段查询
- multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
RabbitMQ 面试题
1.什么是 RabbitMQ ?包含哪些角色?
RabbitMQ 是一个开源的消息中间件
,存放消息的队列。也就是事件驱动架构中的Broker。支持 AMQP 协议。
RabbitMQ中的一些角色:
- publisher:生产者
- consumer:消费者
- exchange:交换机,负责消息路由
- queue:队列,存储消息
- virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离
2.RabbitMQ 的核心组件有哪些?
- Broker:RabbitMQ服务器,负责接收和分发消息的应用。
- Virtual Host:虚拟主机,是RabbitMQ中的逻辑容器,用于隔离不同环境或不同应用程序的信息流。每个虚拟主机都有自己的队列、交换机等设置,可以理解为一个独立的RabbitMQ服务。
- Connection 连接:管理和维护与RabbitMQ服务器的TCP连接,生产者、消费者通过这个连接和 Broker 建立物理网络连接。
- Channel通道:是在Connection 内创建的轻量级通信通道,用于进行消息的传输和交互。应用程序通过Channel进行消息的发送和接收。通常一个 Connection 可以建立多个 Channel。
- Exchange交换机:交换机是消息的中转站,负责接收来自生产者的消息,并将其路由到一个或多个队列中。RabbitMQ 提供了多种不同类型的交换机,每种类型的交换机都有不同的消息路由规则。
- Queue队列:队列是消息的存储位置。每个队列都有一个唯一的名称。消息从交换机路由到队列,然后等待消费者来获取和处理。
- Binding绑定关系: Binding 是 Exchange 和 Queue 之间的关联规则,定义了消息如何从交换机路由到特定的队列。
3.交换机都有哪些?
○ 直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。
○ 主题交换机(Topic Exchange): 根据通配符匹配路由键,将消息路由到一个或多个队列。
○ 扇出交换机(Fanout Exchange): 将消息广播到所有与交换机绑定的队列,忽略路由键。
○ 头部交换机(Headers Exchange): 根据消息头中的属性进行匹配,将消息路由到与消息头匹配的队列。
4.RabbitMQ 支持哪些消息模式?
● workQueue 工作序列机制: Producer 将消息发送到 queue,多个 Consumer 同时消费Queue 上的消息。消息会均匀的分配给多个 Consumer 处理。
● Publish/Subscribe 订阅发布机制: Producer 只负责将消息发送到exchange交换机上。Exchange 将消息转发到所有订阅的 Queue,并由对应的 Consumer 去进行消费
● Routing 基于内容路由机制:在订阅发布机制的基础上,增加一个routingKey,并根据routingKey判断 Exchange 将消息转发到哪些Queue 上。
● Topic 基于话题路由机制:在基于内容路由的基础上,对routingKey增加了模糊匹配的功能。
Springcloud 微服务技术栈面试题
1.什么是微服务
微服务:一种良好的分布式架构方案.。比如传统的项目中有 A、B、C、D 四个模块,这四个模块都在同一个项目中,这样的话模块之间的耦合度就会很高,互相之间也会影响。
而微服务会把四个模块进行单一职责的划分,把4个模块隔离开,耦合度降低。
2.SpringCloud由什么组成
- Spring Cloud Eureka: 服务注册与发现。
- Spring Cloud Feign: 服务接口调用。
- Spring Cloud Ribbon: 客户端负载均衡。
- Spring Cloud Hystrix: 断路器。
- Spring Cloud gateway: 服务网关。
- Spring Cloud Config: 分布式统一配置管理。
3.Spring Cloud Eureka
(1)Eureka包含几个组件
- Eurake Client(客户端): 负责将这个服务的信息注册到Eureka Server中。
- Eureka Server(服务端): 注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号。
(2)Eureka的工作原理
系统中的服务通过 Eureka 的客户端连接到其服务端,保持心跳,来监控微服务的运行是不是正常的。
(3)说一下什么是Eureka的自我保护机制
如果 Eureka 服务端在一定时间内没有接收到某个微服务的心跳(默认90s),会进入自我保护模式,在该模式下Eureka 服务端会保护服务注册表中的信息
,不在删除注册表中的数据,当网络故障恢复后,Eureka服务端节点会自动退出自我保护模式。
(4)什么是CAP原则
CAP原则: 又称CAP定理,指的是在一个分布式系统中,强一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
- 强一致性(Consistency): 访问所有的节点,得到的数据结果都是一样的。
- 可用性(Availability): 保证每个请求不管成功或者失败都有响应。
- 分区容错性(Partiton tolerance): 系统中任意信息的丢失或失败不会影响系统的继续运作。
4.Spring Cloud Ribbon
(1)什么是 Ribbon(@LoadBalanced注解)
Ribbon是Netflix发布的负载均衡器
,有助于控制客户端行为
。配置Ribbon服务提供者地址后,Ribbon就可以基于某种负载均衡算法
,自动地去帮助服务者请求。默认使用轮询算法
。
(2)负载均衡原理
基本流程如下:
- 拦截我们的RestTemplate请求http://userservice/user/1
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
- DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
- eureka返回列表,localhost:8081、localhost:8082
- IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
- RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
(3)Ribbon和nginx的区别
nginx: 反向代理实现负载均衡,相当于从nginx服务器进行请求转发。
Ribbon: 客户端负载均衡,全程都是客户端操作。
Redis 面试题
1.说说你对缓存双写不一致的理解
缓存双写不一致是指在使用缓存的架构中,当数据更新时,由于缓存和数据库的写操作没有同步进行,导致数据在缓存和数据库之间出现不一致的情况。
以下是对缓存双写不一致的一般理解:
- 更新顺序问题:当应用程序更新了数据库中的数据,但在更新缓存之前发生了错误或异常,导致缓存中的数据仍然是旧值。这种情况下,数据库中的数据已经被修改,但缓存中的数据仍然是旧的,导致缓存和数据库之间存在不一致。
- 缓存失效问题:当数据库中的数据发生变化,并成功更新后,缓存中的数据却没有及时更新或失效了。这可能是由于缓存的过期策略、缓存维护、网络延迟等原因导致的。此时,从缓存读取的数据将是旧值,与数据库中的新值不一致。
- 并发更新问题:当多个应用程序同时更新相同的数据时,缓存和数据库的更新操作可能不是原子性的。如果两个更新操作同时进行,可能会导致缓存和数据库在更新时发生冲突,导致不一致的结果。
为了解决缓存双写不一致的问题,可以考虑以下方法:
- 缓存更新策略:在更新数据库的同时,立即更新缓存,确保缓存中的数据与数据库中的数据保持一致。可以使用同步或异步方式进行。
- 数据库与缓存的事务性操作:通过数据库事务和缓存的原子性操作来保证更新的一致性。
- 更新通知机制:通过发布-订阅(Pub/Sub)模式,或使用消息队列等机制来通知缓存节点更新数据,确保缓存的实时性。
- 使用强一致性缓存:如 Redis 的事务和 pipeline 特性,可以确保对缓存的多个操作按顺序执行,减少不一致的概率。
- 定期刷新缓存:通过定期刷新缓存,保证缓存中的数据不会过期太久,降低不一致性发生的概率。
前端面试题
一、HTML 面试题
1.使用过哪些 HTML 标签
- 网页标题标签:
<title></title>
- 标题标签:
<h1></h1>
- 表单标签:
<form></form>
- 选择标签:
<select></select>
- 表格标签:
<table><table>
二、css 面试题
1.CSS 的盒子模型
盒子模型的基础样式由内向外:①内容、②内边距、③边框、④外边距
2.CSS样式表的分类
- 内联式样式表
- 内部样式表
- 外部样式表
3.css 选择器的分类
- html选择器
- id选择器
- class选择器(类选择器)
三、JavaScript 面试题
1. JavaScript数据类型
- 字符串
- 数字
- 布尔
- 数组
- null空
- undefined未定义
2.js 闭包
什么是闭包:闭包是嵌套的内部函数,即定义在一个函数内部的函数
。
闭包作用:使用函数内部的变量在函数执行完毕后,仍然存活在内存中(延长了局部变量的生命周期);让函数外部可以操作(读写)到函数内部的数据(变量/函数)。
四、jQuery 面试题
1.什么是 jQuery?
jQuery库封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
2.jQuery选择器
- id选择器
- 标签选择器
- 类选择器
五、Vue 面试题
1.什么是 Vue
Vue 是一套用于构建用户界面的渐进式 JavaScript 框架
。
2.Vue框架原理
M-V-VM原理
M-Model-模型-JSON数据(所谓模型,就是后端发往前端的json数据)
V-View-视图-HTML页面
VM-ViewModel-视图模型-Vue实例/对象(能让json和标签结合在一起)
3.vue 有哪些指令
- v-text指令:显示纯文本
- v-html指令:显示超文本
- v-model指令:双向绑定(通常表单在一块儿)
- v-show指令:显示隐藏
- v-if、v-else:分支(要么单用v-if,要么两个连用)
- v-for指令
- v-on指令:绑定事件
- v-bind:绑定属性
4. Vue 有哪些属性
- Vue实例el属性:绑定视图
- Vue实例data属性:绑定模型
- Vue实例methods属性:绑定方法
5.== 和 === 区别
"=="只是比较值是否相等;
"==="既要值相等,也要类型相等
6.Vue生命周期
7.jQuery和vue的比较
jQuery是使用选择器($)选取DOM对象,对其进行【赋值、取值、事件绑定】等操作,其实和原生的 HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。简单来说,jQuery就是对原生 js进行的一个简单的封装。
vue是一个精简的 MVVM。Vue.js 【专注于 MVVM 模型的 ViewModel 层】。它通过双向数据绑定把 View 层和 Model 层连接了起来,通过对数据的操作就可以完成对页面视图的渲染。
8.什么是axios?Axios向后台发送数据的类型?Axios配置请求参数?
axios是基于promise的http库。用于和后台进行交互,把前台数据发送给后台,并接受后台返回来的数据。
Axios向后台发送数据的类型:get和delete发送的是键值对形式;post和put发送的是json对象
调用axios方法,put和post的参数需要用params,
9.v-if 和 v-show 有什么区别
相同点:v-if与v-show都可以动态控制dom元素显示隐藏
不同点:v-if显示隐藏是将dom元素整个添加或删除
,而v-show隐藏则是为该元素添加css--display:none,dom元素还在
。
10.v-bind和v-on的区别
v-bind指令用于设置HTML属性:v-bind:href 缩写为 :href
v-on 指令用于绑定HTML事件 :v-on:click 缩写为 @click
11.v-on 可以绑定多个方法吗
①v-on绑定多个方法:
<p v-on="{click:dbClick,mousemove:MouseClick}"></p>
②一个事件绑定多个函数:
<p @click="one(),two()">点击</p>
12.v-bind和v-model的区别
v-bind是一个单向数据绑定,映射关系:Model->View,我们不需要进行额外的DOM操作,只需要进行Model的操作就可以实现视图的联动更新。
v-model是一个双向数据绑定,映射关系:View接受的数据,传给model,model的数据再传给view。把Model绑定到View的同时也将View绑定到Model上,这样就既可以通过更新Model来实现View的自动更新,也可以通过更新View来实现Model数据的更新。用来监听文本。
13.vue.js的两个核心是什么(特性是什么)
数据驱动、组件系统
**数据驱动:**ViewModel,保证数据和视图的一致性。
**组件系统:**应用类UI可以看作全部是由组件树构成的
14.Vue 路由如何使用
在vue实例中使用路由:Vue.use(Router);
在 APP.vue中使用路由:
(1)router-view:显示页面
(2)router-link:跳转路径标签,里面有跳转属性to
15.路由的跳转方式(两个网页之间怎么跳转)
①根据路由名字跳转
②根据路由路径跳转
//根据路由名字跳转
//this表示当前vue的实例
this.$router.push({name:'B'})
//根据路由路径跳转
//this表示当前vue的实例
this.$router.push({path:'/B'})
16.路由的跳转:数据的传递(传参)
(1)根据路由名字跳转传参:params
this.$router.push({name:'B',params:{a:1,b:2}})
this.$route.params.a
this.$route.params.b
(2)根据路由路径跳转传参:query
this.$router.push({path:'/B',query:{c:3,d:4}})
this.$route.query.c,//拿到c的数据
this.$route.query.d//拿到d的数据
17.Vue 父子组件传参
- 父组件向子组件传参(传递数据):通过【自定义属性:props】传参
- 子组件向父组件传递参数:通过【自定义事件:$emit】传
18.Vue 生命周期哪个调用一次,哪个调用多次?
- beforeUpdate 和 updated 可以执行多次
- 其余生命周期只执行一次
19.v-if 和 v-for 的优先级(v-if 和 v-for 可以同时使用吗)
当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级,这意味着 v-if 将分别重复运行于每个 v-for 循环中。所以,不推荐 v-if 和 v-for 同时使用。
如果 v-if 和 v-for 一起用的话,vue中的的会自动提示v-if应该放到外层去。
六、ES6 面试题
1.var、let、const 有什么区别
- let说明:定义变量在所在的代码块内有效(作用域在所在的代码块内)
- const说明:只读的常量、一旦声明就不能更改