Redis
1.什么是Redis内存击穿
客户端请求的key是热点数据,该数据在数据库中存在,但是在redis中过期了。这时由于并发用户特别多,同时读缓存没有读到数据,然后就去数据库读取数据了,这就导致数据库压力突然增大。
如何解决:
- 设置热点数据永不过期(不推荐)
- 使用互斥锁排队
- 定时更新过期时间(提前预热)
2.什么是Redis内存穿透
客户端请求的数据不存在与redis和数据库中,导致访问数据库压力过大。
如何解决:
- 缓存无效Key
- 布隆过滤器
- 接口限流
3.什么是Redis内存雪崩
redis中的大量key,同时过期,造成访问数据库压力过大的场景
如何解决:
- 随机设置过期时间
- 配置redis集群
- 提前预热
JVM
4.jvm是如何加载对象的
类加载(通过类加载器加载类)、内存分配(在堆上为对象分配内存)、初始化(调用构造方法初始化对象)、返回对象引用(返回指向新对象的引用)。
Spring
5.Spring boot项目启动乱码如何解决
启动时设置编码参数为对应的编码
12.Spring Mvc的工作原理是什么
- 客户端发送请求,DispatchServelet拦截请求进行处理
- DispatchServelet根据请求信息,调用HandleMapping,寻找对应的Handle
- DispatchServelet调用HandleAdapter适配器执行Handle
- Handle完成请求处理后返回ModelAndView
- ViewResolver查找View
- DispatcherServelet将model传递给view渲染
- 把View返回给客户端
13.如何进行全局异常处理
使用@ControllerAdvice
和@ExceptionHandle
自定义异常类,默认情况下,事务只有遇到运行时异常时才会回滚
16.Spring加载Bean流程
- Spring容器初始化,ApplicationContext,BeanFactory
- BeanDefinition加载
- BeanFactoryPostProcessor处理,前处理
- 实例化Bean,Class.newInstance()
- 依赖注入,构造函数注入,setter注入,字段注入
- BeanPostProcessor处理,后处理
- AOP代理增强
- 初始化回调
- Bean进入运行状态
- Bean销毁
Spring IOC
控制反转,将创建Bean的控制权交给Spring处理,将对象之间的依赖关系交给IOC容器处理,并由IOC容器完成依赖注入,可以简化开发流程。
JAVA
6.Collection和Collections的区别
Collection是各个集合类的父类,Collections是一个关于集合的工具类,包含一些处理集合的方法,如排序sort方法等。
7.String中有哪些方法
- valueOf();
- split();
- substring();
MyBatis
8.在Mybatis中,$和#的区别是什么
$不会改变对应参数的格式,#会将参数改为字符串,#的方式可以防止sql注入
业务
9.后台怎么二次校验参数
通过hibernite的validator包,使用@NotNull/@Email等注解校验
10.如何处理重复提交
- 前端处理:设置标志位,提交后修改标志位,使提交按钮隐藏或不可用
- 后端处理:表添加时间戳字段,每次更新修改则修改这个时间戳,如果重复提交更新发现更新时间一致则拒绝
21.如何解决热点行导致的性能(死锁)问题
- 确保业务流程不会出现死锁,优化业务执行流程
- 控制并发量
- 将频繁更新的行拆分成多行
MySQL
MySQL是如何进行查询的
server层:
- 连接
- 分析
- 优化
- 执行
引擎层:
- undo log
- check in memory
- use index
- 是否和内存冲突、读取磁盘数据到内存中
- redo log
- bin log
- commit transaction
- redo log commit preper
- bin log commit perper
- undo log 用来记录回滚数据的SQL,执行SQL时会记录一条相反的SQL语句,保障事务能回滚
- redo log 用来记录修改的数据SQL,定期刷新脏页
- bin log 持久化数据
什么是事务
原子性、一致性、持久性、隔离性
- 未提交读:一个事务可以读取其他事务尚未提交的数据
- 提交读:一个事务可以读取其他事务提交后的数据
- 可重复读:一个事务在读取时,前后视图是一致的
- 串行化
11.Mysql中char与varchar的区别是什么
char是定长的,varchar是不定长的。还有nchar与nvarchar类型,带n表示存储的是Unicode字符,可以存储更复杂的字符
14.Sql的on和where条件能否互换
在内连接的情况下可以互换,使用外连接的情况下不能呼唤。on是对映射表的过滤,影响数据匹配,where是在join之后对数据进行过滤。
15.在多对多的情况下如何进行分页查询
使用子查询,查询C表,内连接A和B表,where过滤C表id前10个数据进行分页查询
18.MySQL中的索引模型有哪
- 哈希表
- 有序数组
- 搜索树
19.MySQL中哪些锁
- 全局锁:整个数据库实例都上锁,适用于逻辑备份
- 表锁:整个表都要上锁,多数出现在引擎不支持行锁的情况下
- 行锁:同时只有一个行可以被修改
读锁之间不互斥,读写锁之间、写锁之间互斥
20.MySQL中如何出现死锁
两个线程互相修改同一条数据,且都未提交事务,导致陷入等待。
如何解决:发起死锁检测,回滚其中一个的事务
索引不适用于哪些场景
- 列频繁更新
- 表很小
索引在哪些情况下会失效
- 在索引列上使用聚合函数
- 使用不等式操作符或NOT操作符
- LIKE语句以
%
或_
开始 - 联合索引,查询条件不满足左前缀原则
MySQL中的Count查询性能怎么样
count(*) = count(1) > count(id) > count(col)
mysql 优化过count(*)
MySQL中的EXISTS
操作符和in的区别
exists中的查询不会返回结果集,而是返回true/false,如果外部查询结果在子查询中,则为true,否则为false
- EXISTS适合子查询结果集较大的情况,因为它只是返回true和false
- IN适合子查询结果集较小的情况,因为它需要将结果集加载到内存中
- IN的子查询中如果包含null,则永远不会为true
DATATIME和TIMESTAMP的区别
- DATATIME占用空间更大,不带有时区
- TIMESTAMP占用空间小,带有时区,需要解决2038年问题
计算机基础
17.什么是TCP黏包、半包
黏包指接收包时,发送方发送的多个包在接收时合并为一个包的现象。半包指发送方发送的一个包,只有部分发送到接收方的现象。
如何解决:在定义协议格式时,规定数据遵循固定的格式,比如有开始符和结束符,或者发送时携带着数据的长度,能在接收时不断循环读取,知道全部接收完成。
22.为什么TCP要进行三次握手
第一次握手客户端确认发送能力,服务端确认接受能力
第二次握手服务端确认自身发送能力,客户端确认接受能力
第三次握手服务端确认客户端接受能力
VUE
父子组件如何传值
父组件->子组件:prop
子组件->父组件:emit事件
其他
布隆过滤器
是一个二进制数组,每个元素被当做0或1存储,用来检测元素在给定的大数据中是否存在,这种数据结构空间占用底并且检查速度快,缺点是存在概率失败和删除困难。添加到集合中的元素约多,误报的可能性越大。
将要加入的元素使用多个Hash函数进行计算,存入对应的下标(1),当第二次存储相同字符串时,因为先前的位置已经为1,所以很容易知道此元素已经存在。