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常见的缓存问题和对应的解决方案
常见问题有缓存穿透,缓存击穿,缓存雪崩这几种,解决方案如下:
缓存穿透:常用的解决方案有两个:
-
查询返回的数据为空,仍把这个空结果进行缓存,但过期时间尽量设置稍短一些
-
使用布隆过滤器:将所有可能存在的数据哈希到一个足够大的 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指令