面试题50道

本文详细探讨了Spring框架的基础知识、SpringBoot自动配置、事务管理、SpringCloud组件、Redis高级特性和数据一致性、MySQL的char和varchar区别、事务处理、并发问题、索引策略、数据库存储引擎、数据库锁与日志、SQL优化、MyBatis和RabbitMQ使用、并发编程、JVM垃圾回收、版本控制和运维工具等内容。
摘要由CSDN通过智能技术生成

1. 谈谈你对Spring的理解
2. Spring的常用注解有哪些
3. Spring中的bean线程安全吗
4. Spring中的设计模式有哪些
5. Spring事务传播行为有几种
6. Spring是怎么解决循环依赖的
7. SpringBoot自动配置原理
8. SpringBoot配置文件类型以及加载顺序
9. SpringCloud的常用组件有哪些
10. 说一说Feign的工作原理
11. 说一说Nacos的工作原理
12. 说一说Ribbon的工作原理和常用负载均衡策略
13. Hystrix的作用是什么?断路器的工作原理
14. 解释一下服务雪崩、服务熔断、服务降级
15. 拦截器和过滤器的区别是什么
16. Redis的数据类型和使用场景有哪些
17. Redis为什么这么快
18. Redis的集群有哪些
19. Redis的持久化方式有哪些
20. 了解过Redis的事务吗

Redis中本身是没有事务的概念的,但是他有几个命令组合起来能实现类似于事务的效果。也就是说,Redis事务的本质是一组命令的集合。

这里用到的命令主要有5个,分别是:

MULTI:用来组装一个事务
EXEC:执行一个事物
DISCARD:取消一个事务
WATCH:用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行
UNWATCH:取消 WATCH 命令对所有key的监视
总结说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Reids中,单条命令式原子性执行的,但事务不保证原子性,且没有回滚。
21. Redis实现分布式锁的原理是什么


22. 如何保存Redis数据与DB数据的一致性

保证Redis和MySQL数据一致性的方案有很多,最常见的有三种

同步双写,即在程序更新完MySQL之后后立即同步更新redis
异步监听,即通过Canal监听MySQL的binlog日志变化,然后再通过程序将变化的数据更新数据到 Redis
MQ异步,即程序在更新完MySQL后,发送一条消息到MQ中,然后在通过一个程序监听MQ,获取到消息,然后更新Redis


23. Redis过期删除策略和内存淘汰策略有哪些

Redis的过期删除策略指的是当Redis中的key过期之后在什么时候进行删除的处理方案,常用的删除策略就两个:

惰性删除:只会在取出 key 的时候才对数据进行过期检查,过期了就删除
定期删除:每隔一段时间抽取一批 key执行删除过期 key 操作
两者相比,定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是定期删除+惰性/懒汉式删除。

Redis的内存淘汰策略指的是当Redis的内存已经存满,又有新的数据需要保存时的处理方案,官方提供了8种淘汰策略:

no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
allkeys-lru:在所有的数据集中选择最近最少使用的数据淘汰
allkeys-random:在所有的数据集中任意选择数据淘汰
allkeys-lfu:在所有的数据集中选择最不经常使用的数据淘汰
 

24. Redis常见的缓存问题和对应的解决方案

常见问题有缓存穿透,缓存击穿,缓存雪崩这几种,解决方案如下:

缓存穿透:常用的解决方案有两个:

  1. 查询返回的数据为空,仍把这个空结果进行缓存,但过期时间尽量设置稍短一些

  2. 使用布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询

缓存击穿:常用的解决方案有两个:

使用互斥锁:当缓存失效时,不立即去数据库查询,而是先去获取一把全局锁,那个线程获取到了,就去数据库查询,获取不到的就等待重试查询缓存

修改设置key有效期的逻辑,大体如下:

在设置key的时候,不给它设置过期时间,而是单独设置一个过期时间字段一块存入缓存中

当查询的时候,从redis取出数据后判断时间是否过期,如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据.

缓存雪崩:设置key的过期时间的时候,尽量加一些随机值,这样缓存过期时间的重复率就会降低


25. MySQL中char和varchar的区别

char和varchar是MySQL中的字符串类型,区别在于下面几方面:

最大长度:char最大长度是255字符,varchar最大长度是65535个字节
占用长度:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的
空间使用:char会浪费空间,varchar会更加节省空间
查找效率:char查找效率会很高,varchar查找效率会更低
因此我们如果存储固定长度的列,例如身份证号、手机号建议使用char
26. 事务的四大特性是什么

事务的四大特性指的是原子性、一致性、隔离性、持久性

原子性:事务是最小的执行单位,不允许分割,同一个事务中的所有命令要么全部执行,要么全部不执行
一致性:事务执行前后,数据的状态要保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的
隔离性:并发访问数据库时,一个事务不被其他事务所干扰,各并发事务是独立执行的
持久性:一个事务一旦提交,对数据库的改变应该是永久的,即使系统发生故障也不能丢失
27. 并发事务会带哪些问题

并发事务下,可能会产生如下的问题:

  • 脏读:一个事务读取到了另外一个事务没有提交的数据
  • 不可重复读:一个事务读取到了另外一个事务修改的数据
  • 幻读(虚读):一个事务读取到了另外一个事务新增的数据

28. 事务隔离级别有哪些
事务隔离级别是用来解决并发事务问题的方案,不同的隔离级别可以解决的事务问题不一样

读未提交: 允许读取尚未提交的数据,可能会导致脏读、幻读或不可重复读
读已提交: 允许读取并发事务已提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
可重复读: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
可串行化: 所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,该级别可以防止脏读、不可重复读以及幻读。
上面的这些事务隔离级别效率依次降低,安全性依次升高,如果不单独设置,MySQL默认的隔离级别是可重复读

29. 索引的创建原则

索引可以大幅度提高查询的效率,但不是所有的字段都要加,也不是加的越多越好,因为索引会占据磁盘空间,也会影响增删改的效率

我们在建立索引的时候应该遵循下面这些原则:

1.主键字段、外键字段应该添加索引
2.经常作为查询条件、排序条件或分组条件的字段需要建立索引
3.经常使用聚合函数进行统计的列可以建立索引
4.经常使用多个条件查询时建议使用组合索引代替多个单列索引
除此之外,下面这些情况,不应该建立索引

1.数据量小的表不建议添加索引
2.数据类型的字段是TEXT、BLOB、BIT等数据类型的字段不建议建索引
3.不要在区分度低的字段建立索引,比如性别字段、年龄字段等

30. 索引失效的情况

索引失效指的是虽然在查询的列上添加了索引,但是某些情况下,查询的时候依旧没有用到索引,常见的情况有

1.使用like关键字时,模糊匹配使用%开头将导致索引失效
2.使用连接条件时,如果条件中存在没有索引的列会导致索引失效
3.在索引列上进行计算、函数运算、类型转换将导致索引失效
4.使用 !=、not in、is null、is not null时会导致索引失效
5.使用联合索引时,没有遵循最左匹配原则会导致索引失效
31. 如何知道索引是否失效

MySQL中自带了一个关键字叫explain,它可以加在一个sql的前面来查看这条sql的执行计划

在执行计划中,我们主要观察两列的结果,一列是type,一列是extra

第一个type是重要的列,显示本次查询使用了何种类型,常见的值从坏到好依次为:all、index、range、ref、eq_ref 、const、system

all表示全表扫描数据文件返回符合要求的记录
index表示全表扫描索引文件返回符合要求的记录
range表示检索指定范围的行,常见于使用>,<,between,in,like等运算符的查询中
ref表示两表查询时,驱动表可能返回多行数据,也就是查询条件在主表中是加了一个普通索引
eq_ref表示两表查询时,驱动表只返回一行数据,也就是查询条件在主表中是唯一的
const表示索引一次就能得到结果,一般是使用唯一索引或者主键作为查询条件
system表示表中仅有一行数据,很少见到
我们在优化的时候尽量优化到range级别以上

除了type之外我们需要关注一下extra列,它表示执行状态说明

要保证此列不要出现using filesort、using temporary等使用临时表或外部文件的情况

如果出现using index最好了,它表示列数据仅仅使用了索引中的信息而没有回表查询
32. 常见的数据库存储引擎有哪些

MyISAM和InnoDB是目前MySQL中最为流行的两种存储引擎,它们的区别有这几方面:

MyISAM不支持事务,每次操作都是原子的;InnoDB支持事务,支持事务的四种隔离级别
MyISAM不支持外键,InnoDB支持外键
MyISAM仅仅支持表级锁,即每次操作是对整个表加锁;InnoDB支持行级锁,因此可以支持写并发
MyISAM属于非聚集性索引,它的数据和索引不在同一个文件中;InnoDB属于聚集性索引,它的数据和索引在同一个文件中
MyISAM中主键和非主键索引的数据部分都是存储的文件的指针;InnoDB主键索引的数据部分存储的是表记录,非主键索引的数据部分存储的是主键值
33. 索引的数据结构是什么

在MySQL中索引使用的数据结构是B+Tree,B+树是基于B树的变种,它具有B树的平衡性,而且树的高度更低

B+树非叶子节点不存在数据只存索引,因此其内部节点相对B树更小,树的高度更小,查询产生的I/O更少
B+树查询效率更高,B+树使用双向链表串连所有叶子节点,区间查询效率更高
B+树查询效率更稳定,B+树每次都必须查询到叶子节点才能找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定
34. 数据库中的锁有哪些
35. 数据库的日志类型有哪些
36. 谈一谈你对SQL优化的经验
37. MyBatis中#{}和${}的区别是什么
38. 使用RabbitMQ如何保证消息不丢失
39. 如何解决消息的重复消费问题和消息堆积问题
40. 什么是倒排索引
41. ES中的查询关键字有哪些
42. HashMap的底层结构和扩容机制
43. ConcurrentHashMap的底层结构
44. 线程池重要参数有哪些,任务队列有哪些,拒绝策略有哪些
45. 说一说线程池工作流程
46. synchronized和lock的区别
47. JVM的垃圾回收算法有哪些
48. 你们工作中是如何是git的
49. 说几个常用的运维命令
50. 说几个常见的vue指令

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一些适用于有3年经验的前端开发人员的面试题,供参考: 1. 解释一下什么是盒模型,并且说说标准盒模型和IE盒模型的区别。 2. 请解释一下CSS选择器的优先级是如何计算的。 3. 请解释一下CSS中的BFC(块级格式化上下文)是什么,并举一个例子。 4. 请解释一下什么是响应式设计,以及你是如何实现响应式设计的。 5. 请解释一下什么是CSS预处理器,以及你在项目中使用过哪些预处理器。 6. 请解释一下什么是闭包,并举一个闭包的使用场景。 7. 请解释一下什么是事件委托(事件代理),以及你在项目中如何使用事件委托来提高性能。 8. 请解释一下什么是虚拟DOM(Virtual DOM),以及它与真实DOM的区别。 9. 请解释一下什么是跨域,以及你在项目中如何解决跨域问题。 10. 请解释一下什么是模块化开发,以及你在项目中如何使用模块化开发。 11. 请解释一下什么是SPA(单页应用),以及你在项目中如何实现SPA。 12. 请解释一下什么是SEO优化,以及你在项目中如何进行SEO优化。 13. 请解释一下什么是性能优化,以及你在项目中如何进行性能优化。 14. 请解释一下什么是前端路由,以及你在项目中如何实现前端路由。 15. 请解释一下什么是Web组件,以及你在项目中如何使用Web组件。 16. 请解释一下什么是浏览器的同源策略(Same-Origin Policy),以及如何绕过同源策略。 17. 请解释一下什么是AJAX,以及你在项目中如何使用AJAX进行数据交互。 18. 请解释一下什么是优雅降级和渐进增强,以及你在项目中如何实现这两个概念。 19. 请解释一下什么是前端安全,以及你在项目中如何防止常见的前端安全问题。 20. 请解释一下什么是前端性能监控,以及你在项目中如何进行前端性能监控。 这些问题涵盖了前端开发中的各个方面,包括HTML、CSS、JavaScript、性能优化、安全等。希望对你的面试准备有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值