文章目录
软测面试题附答案<三>
软测面试题附答案<一>,主要涉及常规软测相关面试题
软测面试题附答案<二>,主要涉及接口、自动化、安全相关面试题
一、测开面试题
1、Http状态码里面的1xx/2xx/3xx/4xx/5xx主要应用场景是?
浏览器向服务器请求时,服务端响应的消息头里面有状态码,表示请求结果的状态分类
- 1XX: 收到请求,需要请求者继续执行操作,比较少用
- 2XX: 请求成功,常用的 200
- 3XX: 重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取;
好处:网站改版、域名迁移等,多个域名指向同个主站导流- 必须记住
- 301:永久性跳转,比如域名过期,换个域名
- 302:临时性跳转
- 必须记住
- 4XX: 客服端出错,请求包含语法错误或者无法完成请求
- 必须记住:
- 400: 请求出错,比如语法协议
- 403: 没权限访问
- 404: 找不到这个路径对应的接口或者文件
- 405: 不允许此方法进行提交,Method not allowed,比如接口一定要POST方式,而你是用了GET
- 必须记住:
- 5XX: 服务端出错,服务器在处理请求的过程中发生了错误
- 必须记住:
- 500: 服务器内部报错了,完成不了这次请求
- 503: 服务器宕机
2、缓存淘汰策略你知道有哪些
-
有没看过缓存框架的源码,缓存空间不够怎么办?
- 一般会使用淘汰策略
- 常见的淘汰策略有 FIFO、LRU、LFU
-
能分别说下FIFO、LRU、LFU这些策略不
-
先进先出FIFO:First In,First Out
- 新访问的数据插入FIFO队列尾部,数据在FIFO队列中顺序移动,淘汰FIFO队列头部的数据
-
最近最少使用LRU: Least recently used
-
根据数据的历史访问记录来进行数据淘汰,如果数据最近被访问过,那么将来被访问的几率也更高
-
新数据插入到链表头部,每当缓存数据被访问,则将数据移到链表头部,当链表满的时候,将链表尾部的数据丢弃。
-
-
最近不经常使用 Least Frequently Used
- 根据数据的历史访问频率来淘汰数据,如果数据过去被访问多次,那么将来被访问的频率也更高
- 把数据加入到链表中,按频次排序,一个数据被访问过,把它的频次+1,发生淘汰的时候,把频次低的淘汰掉
-
3、解释下什么是进程、线程、协程;他么之间的关系是怎样的?
- 进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位
- 线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制。
- 协程: 又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换,协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程就叫协程,一个线程可以多个协程,线程进程都是同步机制,而协程则是异步;Java的原生语法中并没有实现协程,目前python、Lua和GO等语言支持
- 关系:一个进程可以有多个线程,它允许计算机同时运行两个或多个程序。线程是进程的最小执行单位,CPU的调度切换的是进程和线程,进程和线程多了之后调度会消耗大量的CPU,CPU上真正运行的是线程,线程可以对应多个协程
4、协程对于多线程有什么优缺点?
- 优点:
- 非常快速的上下文切换,不用系统内核的上下文切换,减小开销
- 单线程即可实现高并发,单核CPU可以支持上万的协程
- 由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁
- 缺点:
- 协程无法利用多核资源,本质也是个单线程
- 协程需要和进程配合才能运行在多CPU上
- 目前java没成熟的第三方库,存在风险
- 调试debug存在难度,不利于发现问题
5、缓存击穿,缓存穿透,缓存雪崩的区别?
-
缓存击穿 (某个热点key缓存失效了)
- 缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力增大。
- 和缓存雪崩的区别在于这里针对某一key缓存,后者则是很多key。
- 预防:设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁
-
缓存穿透(查询不存在数据)
- 查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起为id为“-1”不存在的数据
- 如果从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。存在大量查询不存在的数据,可能DB就挂掉了,这也是黑客利用不存在的key频繁攻击应用的一种方式。
- 预防:接口层增加校验,数据合理性校验,缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,设置短点的过期时间,防止同个key被一直攻击
-
缓存雪崩 (多个热点key都过期)
- 大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩
- 预防:存数据的过期时间设置随机,防止同一时间大量数据过期现象发生,设置热点数据永远不过期,定时任务定时更新
6、什么是浏览器同源策略
1、同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。是由Netscape在1995年提出的一个著名的安全策略。
2、当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面;当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。3、同源的意思大致指的是协议相同、域名相同、端口相同
4、如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收
7、说下分布式缓存和本地缓存的区别,如何选择?
-
什么是缓存
- 程序经常要调用的对象存在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能。
- DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存。
-
分布式缓存
- 与应用分离的缓存组件或服务,与本地应用隔离一个独立的应用,多个应用可直接的共享缓存
- 常见的分布式缓存 Redis、Memcached等
-
本地缓存
- 和业务程序一起的缓存,例如myabtis的一级或者二级缓存,本地缓存自然是最快的,但是不能在多个节点共享
- 常见的本地缓存:ssm基础课程myabtis 一级缓存、mybatis二级缓存;框架本身的缓存;redis本地单机服务;ehchche;guava cache、Caffeine等
-
选择本地缓存和分布式缓存
- 和业务数据结合去选择
- 高并发项目里面一般都是有本地缓存和分布式缓存共同存在的
8、针对线上的数据库,你会做哪些监控,业务性能+数据安全角度分析
大厂一般都有数据库监控后台,里面指标很多,但是开发人员也必须知道
业务性能
- 应用上线前会审查业务新增的sql,和分析sql执行计划;比如是否存在 select * ,索引建立是否合理
- 开启慢查询日志,定期分析慢查询日志
- 监控CPU/内存利用率,读写、网关IO、流量带宽 随着时间的变化统计图
- 吞吐量QPS/TPS,一天内读写随着时间的变化统计图
数据安全
- 短期增量备份,比如一周一次。 定期全量备份,比如一月一次
- 检查是否有非授权用户,是否存在弱口令,网络防火墙检查
- 导出数据是否进行脱敏,防止数据泄露或者黑产利用
- 数据库 全量操作日志审计,防止数据泄露
- 数据库账号密码 业务独立,权限独立控制,防止多库共用同个账号密码
- 高可用 主从架构,多机房部署