面试题汇总
http://t.csdnimg.cn/jtuir
– Bryan
Redis
Redis 使用场景
缓存:穿透,击穿,雪崩,双写一致,持久化,数据过期,淘汰策略
分布式锁:setnx/redisson
缓存穿透
不存在的数据,反复去数据库中查询
解决方案
- 存空值
- 布隆过滤器:通过算法计算hash,不一定能判断出存在,但是一定可以判断不存在
缓存击穿
设置过期时间,刚失效有大量数据同时请求
解决方案:
- 互斥锁 强一致性
- 逻辑过期,新开线程更新数据 高可用性
缓存雪崩
同一时段内,大量key同时失效
解决方案:
- 给不同key的ttl加上随机值
- 利用Redis集群提高服务的可用性
- 给缓存业务限流降级
- 给业务加上多级缓存
双写一致
保证redis和mysql的数据一致性
读操作:缓存命中,直接返回;缓存未命中,查询数据,写入缓存,设定超时时间
写操作:延迟双删 删除缓存-修改数据- 延时 sleep(100) -删除缓存
双写一致:异步通知保证数据一致
回答:redisson的读写锁方案
持久性
RDB 和AOF
-
RDB redis database file redis数据快照文件
将内存中所有文件保存到磁盘中
自动配置 reids.conf
- AOF append only file 追加文件
默认关闭
记录命令
数据过期策略
- 惰性删除 不会删除,访问时如果过期就删除 对cpu友好对内存不友好
- 定期删除
数据淘汰策略
默认 - 不淘汰任何key 但不允许在新写入
- LRU (least recently used) 最近最少使用 当前时间减去最后一次访问时间 越大跃先淘汰
- LFU(least frequently used) 最少频率使用
分布式锁使用场景
集群情况下的定时任务,抢单,幂等
setnx set if not exists
命令:set lock value NX EX 10 NX 互斥 EX 过期时间
释放:DEL key
- watch dog 续期 releaseTime/3
- 可重入锁(同一线程中)
- 主从一致性
主从复制,主从同步
主从复制 给一个版本号,bgsave生成RDB文件,更新成功 版本号更新
offset 偏移量 版本号 replid数据集标记 master上的唯一值
增量同步 根据offset 同步offset之后的数据
哨兵模式
监控,自动故障恢复,通知
脑裂问题 : 重选master后 旧master恢复了 强制降级为slave 导致数据丢失
解决方案:设置从节点数量,增大同步延时时间
分片
面试题
- redis 单线程快的原因
存内存操作;单线程避免上下文,锁和安全等;使用I/O多路复用模型,非阻塞I/O
- 解释一下I/O多路复用模型
单个线程,同时监听多个socket
mysql
如何定位慢查询
运维工具Skywalking 报告展示哪个sql慢
sql语句慢 怎么分析
聚合查询 - 新增临时表
多表查询 - 优化sql语句
表数据量过大查询 - 添加索引
执行计划 sql 前加Expain/DESC 分析
- key:用到的索引
- key_len 索引所占空间 Extra- 额外优化建议
- type-null/system/const/eq_ref/ref/range/index(索引树扫描)/all
深度分页查询
聚簇索引
聚簇索引:数据与索引放到一块,B+树叶子节点保存了整行数据,有且只有一个
非聚簇索引:数据与索引分开存储,B+树的叶子节点保存主键,可以有多个
回表 通过二级索引找多对应主键值,到聚集索引中查找整行数据的动作
**覆盖索引 **查询使用了索引,并且返回的值能在改索引中全部找到
Mysql超大分页怎么处理 覆盖索引+子查询
索引创建原则
主键索引/唯一索引/联合索引
- 针对数据量比较大,查询频繁的 10w+
- 针对常查寻的字段 where ,order by ,group by
- 选择区分度高的字段
- 字符串类型 尽量使用前缀索引
- 尽量使用联合索引,减少回表
- 控制索引数量,索引越多,成本越高
- 如果索引列不包含null ,在创建时约束字段 not null
索引失效
- 违反最左前缀法则
- 范围查询 右边的列,不能使用索引
- 索引上运算操作
- 字符串不加单引号
- 以%在前的模糊查询
SQL优化经验
- 表设计优化
根据《阿里开发手册》嵩山版;sql优化 避免 select *
- 索引优化
- sql语句优化
- 主从复制,读写分离
- 分库分表
事务的特性
事务相关
- A(原子性)C(一致性)I(隔离性)D(持久性)
事务隔离级别
并发事务问题:脏读,不可重复读,幻读
隔离级别:读未提交,读已提交,可重复读(默认),串行化
undo log和redo log区别
缓冲池 主内存的一个区域 在执行增删改查先操作缓冲池 按一定频率同步磁盘 减少IO次数
数据页 inndb数据页的最小单元 16k
redo log 重做日志,记录事务提交时的物理修改 保证事务持久性
undo log 回滚日志,记录修改前的信息。主要作用 提供回滚和MVCC(多版本并发控制) 保证一致性和原子性
保证隔离性:锁 / MVCC
mvcc 多版本并发控制 保证读写没有冲突
mysql主从同步原理
二进制日志,主库将DDL和DML写到 binlog中 - 从库读取-写入从库Relay log-从库重做中继日志中的事件
分表分库
垂直分库 微服务 高并发下 减少IO 提高效率
框架篇
Spring
Spring框架中单例bean时线程安全的吗?
不是
什么时AOP,在项目中有没有用过AOP?
面向切面编程,找到切点,在切点操作,减少重复代码降低耦合度
-
记录操作日志
-
缓存处理
-
spring 事务处理
在方法之前拦截 开启事务 结束后提交事务 如果报错 回滚事务
适用于大批量插入操作
Spring中事务失效的场景有哪些?
- 异常捕获处理
- 抛出检查异常
- 非public方法
spring bean的生命周期
BeanDefinition 对象-构造函数-依赖注入-Aware接口-BeanPostProcessor#Before-初始化方法-BeanPostProcessor#after-销毁
Spring的循环引用问题
三级缓存解决循环依赖问题
-
一级缓存 单例池 singleton 对象
-
二级缓存 缓存早期的bean对象 半成品对象 一二级解决一般对象的循环依赖
-
三级缓存 缓存ObjectFactory,表示对象工厂,用来创建某个对象的 singletonFactories对象 一二三级解决代理对象循环依赖问题
question 2
A依赖B,B依赖A,用的是构造方法注入
A:bean周期中构造方法时第一个执行,spring框架不能解决依赖注入
使用@Lazy进行懒加载 什么时候需要对象再进行创建
SpringMVC的执行流程
Springboot的自动配置原理
@SpringbootAplication
- SpringbootConfiguartion
- EnableAutoConfiguration
- ComponentScan
其中@EnableAutoConfiguartion是实现自动化配置的核心注解。该注解通过@Import注解导入对应的配置选择器
Spring框架中常见的注解
微服务
Eureka 注册中心
Eureka和Nacos的区别
模块 | Nacos | Eureka | 说明 |
---|---|---|---|
注册中心 | 是 | 是 | 服务治理基本功能,负责服务中心化注册 |
配置中心 | 是 | 否 |
Eureka需要配合Config实现配置中心,且不提供管理界面 |
动态刷新 | 是 | 否 |
Eureka需要配合MQ实现配置动态刷新,Nacos采用Netty保持TCP长连接实时推送 |
可用区AZ | 是 | 是 | 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换 |
分组 | 是 | 否 |
Nacos可用根据业务和环境进行分组管理 |
元数据 | 是 | 是 | 提供服务标签数据,例如环境或服务标识 |
权重 | 是 | 否 |
Nacos默认提供权重设置功能,调整承载流量压力 |
健康检查 | 是 | 是 | Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳 |
负载均衡 | 是 | 是 | 均提供负责均衡策略,Eureka采用Ribion |
管理界面 | 是 | 否 |
Nacos支持对服务在线管理,Eureka只是预览服务状态 |
基本参数
server.port=7001
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:7002/eureka/
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
#禁用 Eureka 的 ReadOnlyMap 缓存 (Eureka 端)