一、Redis篇
1、缓存穿透
查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求
都查询数据库
解决方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存
解决方案二:布隆过滤器
2、缓存击穿
给某个key设置了过期时间,某个时间段过期,恰好这时间点对这个key有大量的并发请求,
这样会压垮DB
方案一:互斥锁
方案二:逻辑过期
3、缓存雪崩
缓存雪崩是指在同一时段大量的缓存 key同时 失效或者 Redis 服 务 宕机 , 导致大量请求
到达数据库,造成雪崩
4、redis做缓存,保证双写一致性
当修改了数据库的数据也要同时更新缓存的数据, 缓存和数据库的数据要保持一致
(mysql跟redis缓存数据一样)
5、redis做持久化
RDB,AOF
RDB:redis数据快照,把内存的所有数据都记录到磁盘,当redis实例故障重启后,从磁盘
读取快照文件,恢复数据
RDB执行原理:
AOF:追加文件,redis每次处理一次写操作都会记录在AOF文件
一般使用everysec配置项
6、redis数据删除策略
(1)、惰性删除
设置的过期时间,当需要该key时,如果过期了就删除掉它。
(2)、定期删除
每隔一段时间,对key进行检查,删除里面过期的key(从一定数量的数据库中取出来进行检查)
Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用
8、数据淘汰策略
数据淘汰策略 - 使用 建议
1. 优 先 使用 allkeys-lru 策略。 充 分 利 用 LRU 算 法 的优 势 , 把最近最 常访 问的数据 留 在缓存中。 如果业务有 明显 的 冷 热数据 区 分, 建 议 使用。
2. 如果业务中数据 访 问 频 率 差 别 不大, 没有 明显冷 热数据 区 分, 建 议 使用 allkeys-random , 随机选择 淘汰。
3 . 如果业务中有置 顶 的 需 求, 可以使用 volatile-lru 策略, 同时置 顶 数据不设置过期时间, 这些数据就一直不 被删 除 , 会淘汰其他设置过期时间的数据。
4 . 如果业务中有 短 时高 频访 问的数据, 可以使用 allkeys-lfu 或 volatile-lfu 策略。
9、redis分布式锁
redisson实现的分布式锁——可重入
就是能够获取多次
redisson实现的分布式锁——主从一致性
10、redis集群高可用,高并发面试
(1)、主从复制
单 节 点 Redis 的并发能 力 是有上 限 的, 要 进一步 提 高 Redis 的并发能 力 , 就 需要 搭 建 主从集群, 实现读写分离
主从数据同步原理:
Replication Id:简称replid,是数据集得标记,id一致则说明是同一数据集,每一个master
都有唯一的replid,slave则会继承master节点的replid
offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时会记录当前
同步的offset。如果slave的offset小于master的offset,说明slave落后于master
主从全量同步:
主从增量同步(slave重启或后期数据变化)
(2)、哨兵模式
redis集群(哨兵模式)脑裂
解决方案:
(3)、分片集群结构
主从和哨兵可以解决高可用、 高并发读的问题。但是 依 然 有 两 个问题没有解决:
海量数据存储问题 、高并发写的问题
分片集群结构——数据读写
11、redis其他面试
(1)、用户空间和内核空间
(2)、阻塞IO
(3)、非阻塞IO
(4)、IO多路复用
IO多路复用:是利用单个线程来同时监听多个Socket,并在某个Socket可读,可写时得到通知,
从而避免无效的等待,充分利用CPU资源。
(5)、redis网络模型
二、数据库篇
1、如何定位慢查询
MySQL 自带慢日志
2、SQL执行计划(找到慢的原因)
可以采用 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息
type 这条 sql 的连接的类型, 性能由好到差为 NULL、 system、const、eq_ref、ref、
range、index、all
system:查询系统中的表
const:根据主键查询
eq_ref:主键索引查询或唯一索引查询
ref:索引查询
range:范围查询
index:索引树扫描
all:全盘扫描
3、mysql支持的存储引擎
存储引擎就是存储数据、 建 立 索引、 更 新 / 查询数据 等技术 的实现方 式 。
存储引擎是 基于 表的, 而 不是 基于 库 的, 所以存储引擎 也 可 被称 为表类型。
(1)、MySQL 体系结构
(2)、存储引擎特点
4、什么是索引
索引是帮助mysql高效获取数据的数据结构(有序),数据库系统还维护着满足特定查找算法
的数据结构(B+树)。这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引
mysql默认是使用索引底层数据结构是B+树
(1)、聚簇索引
回表查询
(2)、覆盖索引
覆盖索引是指查询使用了索引, 并且需要返回的列, 在该索引中已经全部能够找到
5、Mysql超大分页处理
优化思路 : 一 般 分页查询时, 通过创建 覆盖索引 能 够比较 好 地提高 性能,
可以通过 覆盖索引加子查询 形式 进行优化
6、索引创建原则
7、什么时候索引失效
1)、违反 最 左 前 缀 法则
如果索引了多列, 要 遵守 最 左 前 缀 法则。 指的是查询从索引的最 左 前列开 始 , 并且 不 跳 过索引中的列。 匹 配最 左 前 缀 法则, 走 索引:
2)、范围查询 右边 的列, 不能使用索引
3)、 不要在索引列上进行运 算操作 , 索引 将 失效。
4)、字 符串 不加单引 号 , 造成 索引失效。
5)、以 % 开 头 的 Like 模糊 查询, 索引失效。 如果 仅仅 是 尾部模糊匹 配, 索引不会失效。 如果是 头部模糊匹 配, 索引失效。
8、sql的优化
9、Mysql其他面试题
(1)、事务特性 ACID
(2)、并发事务问题
1、脏读:一个事务读到另外一个事务还没有提交的数据
2、不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
3、幻读:一个事务 按照 条件查询数据时, 没 有 对 应的数据行, 但是在 插 入 数据时, 又 发 现这行数据 已 经存在, 好 像 出现 了 ” 幻 影 ”
解决方案:对事务进行隔离
(3)、undo log 和 redo log的区别
1、redo log
2、undo log
(4)、MVCC 多版本并发控制
(5)、Mysql主从同步原理
MySQL 主从复 制 的 核心 就是二进 制 日志
(6)、分库分表
条件:
拆分策略:
垂直拆分:垂直分库、垂直分表
水平拆分:水平分库、水平分表
垂直分库
垂直分表
水平分库
水平分表
三、框架篇
1、Spring
(1)、Spring框架中的单例bean是线程安全的吗
(2)、什么是AOP
记录操作日志思路
Spring中的事务是如何实现的
其本质是通过 AOP 功能, 对方法前后进行拦截, 在执行方法之前开 启 事务, 在执行完目标方法之后根据执行情况提 交或者回滚事务。
(3)、Spring中事务失效的场景有哪些
情况一: 异 常 捕 获处理
情况二: 抛出检查异 常
情况 三 : 非 public 方法 导致 的事务失效
(4)、Spring的bean的生命周期
BeanDefinition
Spring 容器在进行实例 化 时, 会 将 xml 配置的 <bean> 的 信息 封装成一个 BeanDefinition 对象, Spring 根据 BeanDefinition 来 创 建 Bean 对象, 里 面有很多的 属 性用来 描述 Bean
(5)、Spring 中的循环引用
2、SpringMVC
(1)、SpringMVC的执行流程
视图阶 段( JSP )
前后端分离阶段( 接口开发 ,异步请求)
3、SpringBoot
(1)、SpringBoot自动配置原理
4、Spring 的常见注解有哪些?
5、SpringMVC 常见的注解有哪些?
6、Springboot 常见注解有哪些?
7、Mybatis
(1)、mybatis的执行流程
(2)、Mybatis 是否支持延迟加载?
在 Mybatis 配置 文件 中, 可以配置是 否启 用延迟加载 lazyLoadingEnabled=true|false , 默认是关 闭 的
延迟加载的原理
(3)、Mybatis的一级、二级缓存
四、微服务篇
1、SpringCloud
1、SpringCloud的五大组件
2、服务注册和发现什么意思?SpringCloud如何实现服务注册发现?
3、负载均衡如何实现的
Ribbon 负载均衡策略有哪些 ?
自定义负载均衡策略如何实现 ?
4、什么是服务雪崩,怎么解决这个问题?
雪崩:一个服务失败,导致整条链路服务都失败的情形
(1)、服务降级
在远程调用中设置好兜底方法
(2)、服务熔断
5、微服务监控
2、业务相关
1、限流的实现
Nginx限流
控制速率 ( 突发流量 )漏桶算法
网关限流
yml配置文件中,微服务由设置添加全局过滤器RequestRateLimiter 令牌桶算法
2、CAP和BASE
CA CP AP
Consistency (一 致性 ) : 用户 访 问分布式系 统 中的任意 节 点, 得 到的 数据 必须一致
Availability ( 可 用 性 ) : 用户 访 问集群中的任意健康 节 点, 必须能 得 到 响应 , 而 不是 超 时 或拒绝
Partition (分区) : 因为网 络故障或其它 原因 导致 分布式系 统 中的 部 分 节 点与 其它节 点 失去连 接, 形成独 立 分区 。
Tolerance (容错) : 在集群 出 现分区时, 整 个系 统 也要持续 对外 提供服务
3、分布式事务
seata架构
TC相当于班主任,TM相当于团支书,RM相当于同学
seata的XA模式原理
seata的AT模式原理
seata的TCC模式原理
MQ分布式事务
4、分布式服务的接口幂等性如何设计?
幂等 : 多次调用方法者接口不会改变业务状态, 可以保证重复调用的结果和单次调用的结果一 致
5、分布式任务调度
如果有大 数据量 的任务同时都需要 执 行 , 怎 么解决?
五、java集合篇
1、时间复杂度分析
时间复杂度分析: 来评估代码的执行耗时的
只要代码的执行时间不随着 n 的增大而增大, 这样的代码复杂度都是 O(1)
2、List 相关面试题
数组( Array ) 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。
为什么数组索引从 0 开始呢?假如从 1 开始不行吗?
(1)、ArrayList 底层的实现原理是什么
(2)、ArrayList list=new ArrayList(10) 中的 list 扩容几 次
该语句 只是 声明 和实 例 了一个 ArrayList , 指 定 了容量为 10 , 未 扩容