面试题整理

1、 平时研发都用哪些框架
SpringBoot SpringMVC Mybatis
2、 根据上题解释框架的运行原理(举例说明一个请求如何在框架内流转)
同步12
3、 Redis的hash类型操作命令?能存储哪些数据类型?能否存储对象?对象不序列化是否能存储?为什么?
操作命令:hset /hget /hmset /hmget /hgetall /hkeys /hvals /hexists/hset
基本类型:String、List、Hash、Set、ZSet
Redis可以存储对象
Redis不能存储对象不序列化
为了对象可以跨平台存储,和进行网络传输
本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。
4、 Nginx的一些命令,正反向代理及适用场景
启动nginx
start nginx
关闭nginx,完整有序的停止nginx,保存相关信息
nginx -s quit
关闭nginx,快速停止nginx,可能并不保存相关信息
nginx -s stop
重新载入nginx,当配置信息修改需要重新加载配置是使用
nginx -s reload
正向代理: 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
场景:
a.访问原来无法访问的资源,如google
b.可以做缓存,加速访问资源
c.对客户端访问授权,上网进行认证
d.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理:实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
场景:a.负载均衡;b.保证内网安全;
5、 消息中间件,RocketMq、RabbitMq、kafka有什么区别,优缺点都是什么,举例说明在哪种场景下应该使用哪种消息中间件,为什么使用此消息中间件合适
特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic 数量对吞吐量的影响 topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多,如果要支撑大规模的 topic,需要增加更多的机器资源
时效性 ms 级 微秒级,这是 RabbitMQ 的一大特点,延迟最低 ms 级 延迟在 ms 级以内
可用性 高,基于主从架构实现高可用 同 ActiveMQ 非常高,分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用
消息可靠性 有较低的概率丢失数据 基本不丢 经过参数优化配置,可以做到 0 丢失 同 RocketMQ
功能支持 MQ 领域的功能极其完备 基于 erlang 开发,并发能力很强,性能极好,延时很低 MQ 功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用
Kafka适合产生大量数据的互联网服务的数据收集业务;
RabbitMQ更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景;
RocketMQ应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
6、 ArrayList和LinkedList有什么区别,底层原理是什么,根据负载因子扩容机制是什么,有什么不同,两者比较的优缺点各是什么,适用于哪种场景
ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。
LinkedList使用了循环双向链表数据结构。与基于数组 的 ArrayList 相比
ArrayList初始大小为10,扩容后的大小= 原始大小+原始大小/2 + 1。在进行插入等操作的时候,如果判断出大小不够,会依据此方法进行扩容。
LinkedList双向链表实现的,没有初始化大小,也没有扩容的机制
7、 Mysql的执行计划,怎么根据执行计划确定一条sql的运行状态,如果一条SQL执行较慢该怎么优化,索引相关的问题,SQL具体怎么进行优化(举例说明)
explain在SQL语句前加一个"EXPLAIN"即可

a. 在FROM子句中包含儿个表的情况下,记 录少的放在右边,如果是三个以上的表,交叉表放在右边;
b. 可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾;
c. SELECT子句中避免使用*;
d. 减少访问数据库的次数,尽量sql一次读取数据,避免多次读取;
e. 使用DECODE减少处理时间;
f. 用Where子句替换HAVING子句;
g. 含有子查询的SQL语句中,要特别注意减少对表的查询;
h. 使用表的别名(Alias);
8、 你认为怎样做能够进行代码的性能优化?(举例说明如何在生产环境对代码进行优化以提高性能)
1.不用new关键词创建类的实例2.慎用异常3.不要重复初始化变量4.尽量指定类的final修饰符5.尽量使用局部变量6、 保证过期对象的及时回收7、 尽量减少对变量的重复计算8、不要在循环中使用: Try { } catch() { } 应把其放置在最外层
9、 如果在分布式项目中请求返回结果出现乱码,此问题可能会出现在哪个环节,应该怎么解决
项目配置问题,在接收请求后相应时乱码问题,说明在构建相应时的字符集有问题,maven项目我这边没遇到过(不一定其他猿类没有遇到过)

maven运行环境问题,我的项目就是运行环境上的问题,主要原因是使用了spring boot的maven插件,以spring:run运行的项目,需要在插件中添加运行的编码配置

10、 Springboot常用组件及注解的作用(举例说几个)
@SpringBootApplication 启动类
@controller标注controller
@restController = @controller+@responseBody
@autowired自动依赖注入
@qualifier自动注入指定依赖bean名称
@component配置bean
@scope作用域(单例,多例)
@resource依赖注入
@service
@PostConstruct 和 @PreDestroy。
@requestParam获取请求参数值
@requestMapping用来处理请求地址映射
@RequestHeader获得请求头数据
@CookieValue注解只能修饰方法形参,能够把 Cookie的值绑定到形参供方法处理请求使用
@ModelAttribute 接受请求的参数 Controller的所有方法调用之前,先执行此@ ModelAttribute的方法,通常和@SessionAttributes一起使用
@SessionAttributes 实现会话数据共享 只能用在类上@requestMapping 用于请求 url 映射。
@pathvariable路径变量
@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户
11、 @autowired注解为什么能够进行依赖注入,原理是什么
AutowiredAnnotationBeanPostProcessor
Spring容器启动时,AutowiredAnnotationBeanPostProcessor被注册到容器;
扫描代码,如果带有@Autowired注解,则将依赖注入信息封装到InjectionMetadata中(见扫描过程);
创建bean时(实例化对象和初始化),会调用各种BeanPostProcessor对bean初始化,AutowiredAnnotationBeanPostProcessor负责将相关的依赖注入进来;
12、 SpringMvc的运行流程,过滤器和拦截器的区别
运行流程:客户端请求提交到DispatcherServlet(前端控制器)
由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
DispatcherServlet将请求提交到Controller(也称为Handler)
Controller调用业务逻辑处理后,返回ModelAndView
DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
视图负责将结果显示到客户端
过滤器、拦截器主要区别:
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器可以获取IOC容器中的各个bean(基于FactoryBean接口 ),而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑。
过滤器、拦截器本质区别:
从灵活性上说拦截器功能更强大些,Filter能做的事情它都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类)

1、 海外项目所用的技术点 你用过哪些 你没有用过的你了解过吗

2、 海外项目中用的的kafka,深入讲一下

  1. 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
  2. 可扩展性:kafka集群支持热扩展
  3. 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  4. 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  5. 高并发:支持数千个客户端同时读写
    3、 Phoenix是干什么用的 基于什么实现的 Hbase是什么
    Phoenix是构建在HBase之上的SQL引擎
    编译你的SQL查询为原生HBase的scan语句。
    检测scan语句最佳的开始和结束的key。
    精心编排你的scan语句让他们并行执行。
    推送你的WHERE子句的谓词到服务端过滤器处理。
    执行聚合查询通过服务端钩子(称为协同处理器)。
    实现了二级索引来提升非主键字段查询的性能。
    统计相关数据来提高并行化水平,并帮助选择最佳优化方案。
    跳过扫描过滤器来优化IN,LIKE,OR查询。
    优化主键的来均匀分布写压力。
    HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”
    4、 Redis常用类型 hash结构使用时有什么命令 hash最大能存放多少个单位
    Redis是用来做持久化的
    操作命令:hset /hget /hmset /hmget /hgetall /hkeys /hvals /hexists/hset
    基本类型:String、List、Hash、Set、ZSet
    hash最大能存放多少个单位2的32次方-1
    5、 说一下常见的集合 HashMap集合默认初始化长度
    List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set 中存储的数据是无序的,且不允许有重复,但元素在集合中的位置由元素的 hashcode 决定,位置是固定的
    HashMap集合默认初始化长度默认初始化长度为 16
    6、 springMVC常用注解 注解作用 使用@service注解实现原理
    @requestParam获取请求参数值
    @requestMapping用来处理请求地址映射
    @RequestHeader获得请求头数据
    @CookieValue注解只能修饰方法形参,能够把 Cookie的值绑定到形参供方法处理请求使用
    @ModelAttribute 接受请求的参数 Controller的所有方法调用之前,先执行此@ ModelAttribute的方法,通常和@SessionAttributes一起使用
    @SessionAttributes 实现会话数据共享 只能用在类上@requestMapping 用于请求 url 映射。
    @pathvariable路径变量
    @RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
    @ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户
    7、 说说你使用过的数据库;mysql的连接有哪些,区别是什么
    内连接inner join on、组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。
    左连接(左外连接)left join on / left outer join on、左(外)连接,左表(a_table)的记录将会全部表示出来
    右连接(右外连接)right join on / right outer join on、右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
    全连接(全外连接)
    8、 mysql索引使用过么,使用索引是有什么好处,你常用的索引类型是什么
    加快查询效率
    按索引的用途来分有6种:普通索引,唯一索引,主键索引,组合索引,全文索引,空间索引;
    按索引的数据结构来分有2种:B-Tree索引,哈希索引。
    9、 MySQL中创建表时树形表怎么创建

10、 搭建过Nginx吗
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强
11、给你一条sql,你从哪些方面开始优化

  1. 在FROM子句中包含儿个表的情况下,记录少的放在右边,如果是三个以上的表,交叉表放在右边;
  2. 可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾;
  3. SELECT子句中避免使用*;
  4. 减少访问数据库的次数,尽量sql一次读取数据,避免多次读取;
  5. 使用DECODE减少处理时间;
  6. 用Where子句替换HAVING子句;
  7. 含有子查询的SQL语句中,要特别注意减少对表的查询;
  8. 使用表的别名(Alias);

1、 谈谈你最近的项目。
2、 Spring的IOC,Spring常用注解。
@autowired自动依赖注入
@qualifier自动注入指定依赖bean名称
@component配置bean
@scope作用域(单例,多例)
@resource依赖注入
@service
@PostConstruct 和 @PreDestroy。
3、 Redis数据类型,它是用来做什么的。
Redis是用来做持久化的
基本类型:String、List、Hash、Set、ZSet

http协议
HTTP(Hyper Text Transfer Protocol)<超文本传输协议>
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
HTTP允许传输任意类型的数据对象.正在传输的类型由Content-Type加以标记
HTTP协议是无状态协议.无状态是指协议 对于事务处理没有记忆能力.这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须要重传,这样就导致了每次连接传输的数据量增大.好处就是,如果后续的连接不需要之前提供的信息,响应就会比较快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值