本篇是我和朋友出去面试积累的面试题,希望能帮助到即将出去面试的朋友们(java)
4-20中午 得逸信息电话面试
spring springmvc springboot的区别
spring是一个基础框架,通过ioc容器和aop的代理模式来简化企业级应用的开发
spring mvc 是spring 处理web层请求的一个模块
springboot 常用的基础框架组合起来,避免依赖版本冲突,提供默认的配置,
mysql 一级二级缓存
一级缓存,也称本地缓存,sqlSession级别的缓存。一级缓存是一直开启的;与数据库同一次回话期间查询到的数据会放在本地缓存中
一级缓存失效的四种情况
sqlSession不同
sqlSession相同,查询条件不同
sqlSession相同,在两次相同查询条件中间执行过增删改操作
sqlSession相同,手动清空了一级缓存
二级缓存:全局缓存;基于namespace级别的缓存。一个namespace对应一个二级缓存。
工作机制
一个会话,查询一条数据,这个数据会被放在当前会话的一级缓存中
如果会话被关闭了,一级缓存中的数据会被保存带二级缓存。新的会话查询信息就会参照二级缓存
不同的namespace查出的数据会放在自己对应的缓存中
使用步骤
开启全局缓存配置。<settings><setting name="cacheEnabled" value="true"/></settings>
因为是namespace级别,需要搭配每个xxxMapper.xml中配置二级缓存<cache></cache>
eviction:缓存的回收策略:
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval:缓存刷新间隔。缓存多久清空一次,默认不清空。设置一个毫秒值。
readOnly:是否只读。
true
mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。不安全,速度快。
false
mybatis觉得获取的数据可能被修改。mybatis会利用序列化和反序列化的技术克隆一份新的数据给用户。安全、速度快
size:缓存放多少元素
type:指定自定义缓存全类名,实现cache接口即可
pojo需要实现序列换接口
缓存首先一进来去查二级缓存,二级缓存没有去找一级缓存,一级缓存没有去找数据库。二级缓存----->一级缓存-------->数据库
jpa hibernate mybatis的区别
jpa是一种orm规范
Hibernate是一个完整的ORM框架,常规CRUD我们不需要写一句SQL,性能不好控制
MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写全部SQL,更灵活
Redis持久化机制
持久化流程
客户端向服务端发送写操作---服务端接收写请求---服务端调用write---操作系统将数据转移到磁盘控制器---磁盘控制器将数据保存到硬盘
RBD机制
在指定的时间间隔内将内存中的数据集快照写入磁盘,也是默认的持久化方式,文件名dump.rdb
触发机制
save命令,该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
bgsave,通过子进程,在后台异步进行快照操作,
优势
rdb文件紧凑,全量备份,非常适合备份和灾难恢复
恢复大量数据时速度比aof快
劣势
子进程备份时,父进程修改的数据可能丢失
AOF机制
redis将每一个写命令都追加到文件中
当aof文件过大的时候,redis提供bgrewriteaof命令将内存中的数据以命令的方式保存到临时文件中,fork出一条新进程将文件重写
三种触发机制
always 每次数据变更都会立即记录
everysec 每秒记录,如果一秒内宕机,有数据丢失
no 不同步
优点,数据完整性好,适合做备份紧急恢复
缺点,文件大,相比rbd性能稍差,
通常是结合起来使用
有哪些SQL优化经验
只查需要的数据
尽量减少子查询,使用关联查询(left join,right join,inner join)
尽量避免在where子句中使用!=,<>,导致索引失效
避免在where子句中进行null值判断,导致索引失效
简述一下restful
一种软件架构风格、设计风格,它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次
方便地通过请求方式可以判断对资源的操作,使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作,分别对应 添加、 删除、修改、查询
使用Http头声明序列化格式
使用含义清晰的Http状态码处理错误,201创建成功,401请求需要验证,403没权限拒绝服务等
可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源
无状态的,即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变
4-20 下午,文辉海思
怎么防止消息丢失
生产者丢失
开启rabbitmq的事务,如果没收到就会回滚,发送失败会重试,消耗性能,影响吞吐量
confirm模式,每次消息都会分配一个唯一id,写入rabbitmq回传一个ack消息,如果没有处理这个消息回调nack接口,告诉你消息失败可以重试
也可以在内存里维护每个消息id的状态,如果超过一定的时间没接收到这个消息可以重发
事务是同步的会阻塞,confirm是异步的,
rabbitmq丢失了数据
开启rabbitmq的持久化,创建queue的时候设置为持久化的,发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的
持久化了才会发送ack,rabbitmq挂了重启也会重试,恢复数据
消费端丢失数据
关闭自动ack,每次消费者处理完数据调用api进行ack确认,如果接收数据没有处理就挂了,rabbitmq会把这个消息分配给别的consumer去处理
怎么防止超卖
加悲观锁,修改数据的时候,排斥外部请求
会造成阻塞,导致连接数用尽,系统陷入异常
请求放入队列,先进先出,可能会撑爆内存,可能是系统异常
乐观锁思路
这个数据所有请求都有资格去修改,但是会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败
什么情况下回出现消息的重复消费
一般出在任务超时,或者没有及时返回状态,引起任务重新入队列,重新消费!
在rabbtimq里连接的断开也会触发消息重新入队列。
怎么防止消息重复消费
使用消息队列如何保证幂等性
调用的接口设置成幂等的
或者用一个第三方介质做消息记录,
redis给消息分配一个全局id,消费过消息就以key-value存入redis,消费者消费前先去redis查有没有消费记录
Linux查询端口占用、性能的命令
netstat -tunlp tn显示tcp、udp端口,n显示数字地址,l仅显示监听端口,p显示进程的pid
查看内存 free 查看cpu核心 cat /proc/cpuinfo 查看cpu使用率 top
ps -a | grep 筛选条件 ps命令查看进程 -a显示当前终端下的所有,-e显示系统内的所以,-f使用完整的格式显示
查询需要优化的SQL,怎么分析该条SQL哪里有问题
慢查询日志,然后用Explain查看执行计划
-- type: 访问类型
-- system --> const --> eq_ref --> ref --> range --> index --> all
说一下redis高可用
redis的高可用就是redis的持久化
说一下分布式锁
分布式系统中防止线程相互干扰
redis的set nx命令,只有在key不存在的情况下才能成功
加锁,如果给一个商品加锁,key命名为lock_商品id,value设置成线程id,执行set(lock_商品id,线程id,30,nx),返回1该线程得到锁,其他的线程会执行不成功返回0
解锁当线程操作完,先判断value是不是equals线程id然后执行del(lock_商品id)进行解锁
锁超时
如果一个得到锁的线程释放锁之前挂掉,会造成死锁,setnx的key必须设置一个超时时间,expire(lock_商品id,30)
避免线程执行时间很慢而锁过期,可以开一个守护线程执行expire给锁续航
说一下vue
将视图和数据实现双向绑定,组件化
vue-router 使用 path 属性过程中,使用动态路径参数
v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
v-bind绑定一个value属性
v-on指令给当前元素绑定input事件
vue绑定事件
通过指令 v-on:事件名=“函数名”绑定事件 eg:<button v-on:click="doThis"></button>
通过语法 @事件名=“函数名”绑定事件 eg:<button @click.stop="doThis"></button>
vue的生命周期
它可以总共分为11个阶段:
创建前/后(1.beforeCreate, 2.created),
载入前/后(3.beforeMount, 4.mounted),
更新前/后(5.beforeUpdate, 6.updated),
销毁前/后(7.beforeDestroy,8.destroyed),
激活时/未激活时(9.activated, 10.deactivated),
当捕获一个来自子孙组件的错误时被调用(11.errorCaptured)
幂等是什么
HTTP 幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法
get、delete、put是幂等的,post新建不是幂等
4-21外包顺丰
如何完成权限校验
首先我们有权限管理这个服务,管理用户的各种权限,及可访问路径等
在zuul网关中利用pre过滤器,拦截一切请求,在过滤器中,解析jwt,获取用户身份,查询用户权限,判断用户身份是否可以访问当前路径
微服务地址暴露了,绕过网关直接访问微服务怎么办
微服务都做了严格的服务间鉴权处理,任何对微服务的访问都会被验证是否有授权,如果没有则会被拦截
使用过aop吗,aop的实现原理
面向切面编程,为分散的对象引入公共行为,如记录运行时间,打印日志,事务管理等
spring会自动根据代理对象是否实现了接口来决定使用哪种代理方式,有接口用jdk的代理,没接口用cglib的代理
多个通知和切入点的配置关系称为切面
使用
编写通知类,即增强的功能 在通知类上使用注解@Component装配bean到spring容器,并且使用@Aspect注解标注这是一个通知类
通知类的方法上注解前置/后置/环绕通知,value属性就是切点的AspectJ表达式
可以在通知类上创建空方法,加上@Pointcut注解标注这是一个切点,value属性就是AspectJ表达式,方便同一切点名的复用
mybatis的分页
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页
分页插件工具PageHelper
开启分页PageHelper.startPage(page, rows);
解析分页结果PageInfo<Brand> info = new PageInfo<>(brands);//根据查询结果计算总条数,总页数
返回return new PageResult<>(pageInfo.getTotal(), pageInfo.getPages(), brands)//总条数,总页数,当前页数据
mybatis的一对多,mybatis中的多表查询
一对一
在一方添加对方的实体类型作为属性
需要自定义ResultMap结果集映射多表关系
association用于对一的映射,配置添加的实体类信息
关联查询,都需要显示的开启自动映射autoMapping=true
一对多
在一方添加多方的list属性集合
需要自定义ResultMap结果集映射多表关系
collection用于一对多的映射,javaType为List集合类型,ofType为list集合的泛型
多对多的查询
引入中间关系,转化为一对多,
|
|