vlambda博客
学习文章列表

阿里健康一面面试题,附答案。MySQL索引相关,jvm内存结构及作用,Redis保证mq消费幂等性,mybatis和jdbc

阅读本文前,请您先点击上面的“蓝色字体”,再点击关注,这样您就可以每天学习一点新知识,每天都有进步了。


1. MySQL索引相关,联合索引,同时查询两个字段怎么建索引?

若要创建多列索引,请将列名放在括号中。

ALTER TABLE tableADD INDEX (cancel, complete);

这相当于

CREATE INDEX table_cancel_complete_ixON table (cancel, complete);

CREATE INDEX要求您为索引指定一个名称,对于ALTER TABLE,这是可选的(它将被分配一个默认名称)。


2. Mysql B+Tree索引和Hash索引的区别?

Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位;

B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访间;


3.jvm内存结构及作用

类加载器

如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个 类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进JVM里面来。

方法区


方法区 是用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等

类加载器将 .class 文件搬过来就是先丢到这一块上



堆 主要放了一些存储的数据,比如对象实例,数组···等,它和方法区都同属于 线程共享区域 。也就是说它们都是 线程不安全 的


栈 这是我们的代码运行空间。我们编写的每一个方法都会放到 栈 里面运行。

我们会听说过 本地方法栈 或者 本地方法接口 这两个名词,不过我们基本不会涉及这两块的内容,它俩底层是使用C来进行工作的,和Java没有太大的关系。


程序计数器

主要就是完成一个加载工作,类似于一个指针一样的,指向下一行我们需要执行的代码。和栈一样,都是 线程独享 的,就是说每一个线程都会有自己对应的一块区域而不会存在并发和多线程的问题。

小总结

  1. Java文件经过编译后变成 .class 字节码文件

  2. 字节码文件通过类加载器被搬运到 JVM虚拟机中

  3. 虚拟机主要的5大块:方法区,堆都为线程共享区域,有线程安全问题,栈和本地方法栈和计数器都是独享区域,不存在线程安全问题,而 JVM 的调优主要就是围绕堆,栈两大块进行


4.在浏览器输入url,显示过程,http和https的区别,https怎么加密,对称加密的秘钥服务端和客户端怎么协商

输入url显示过程

  1. 输入url。

  2. DNS解析域名。

  3. 浏览器向web服务器发送http请求。

  4. 服务器收到请求并响应。

  5. 服务器返回相应文件,浏览器进行页面渲染。


  1. HTTPS  协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

  2. HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

  3. HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  4. HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)


5.mq怎么保证消费的幂等性,用Mysql怎么去重?

幂等性的定义:

多次执行所产生的影响均与一次执行的影响相同。

所以需要从业务逻辑上设计,将消费的业务逻辑设计成幂等性。


利用数据库的唯一约束

在进行消息消费,需要取一个唯一个标识,比如 id 作为唯一约束字段,先添加数据,如果添加失败,后续做错误提示,或者不做后续操作。



Redis 设置全局唯一id

每次生产者发送消息前设置一个全局唯一id放在消息体重,并存放的 redis 里,在消费端接口上先找在redis 查看是否存在全局id,如果存在,调用消费接口并删除全局id,如果不存在,不做后续操作。


多版本(乐观锁)机制

给业务数据添加一个版本号,每次更新数据前,比如当前版本和消息中的版本是否一致,如果一致就更新数据并且版本号+1,如果不一致就不跟新。这有点类似乐观锁处理机制。


总结

设计幂等需要根据具体的业务场景,如果是并发量比较大的系统,数据库一般支撑不了这么大的并发,需要使用 Redis 缓存处理。而并发不大的系统可以选择数据库。


5. mybatis和jdbc的区别

  • 从层次上看,JDBC是较底层的持久层操作方式,而Hibernate和MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。

  • 从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历...

  • 从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要对数据库进行完整性控制的话建议使用Hibernate;如果要灵活使用sql语句的话建议采用MyBatis框架。


6.SpringMVC工作流程

  1. DispatcherServlet接收到这个请求后,再对URL进行解析,得到请求资源标识符(URI)。然后调用相应方法得到的HandlerMapping对象,再根据URI,调用这个对象的相应方法获得Handler对象以及它对应的拦截器。(在这里只是获得了Handler对象,并不会操作它,在SpringMVC中,是通过HandlerAdapter对Handler进行调用、控制的)

  2. DispatcherServlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其实例对象,执行拦截器中的preHandler()方法。

  3. 在拦截器方法中,提取请求中的数据模型,填充Handler入参,所以所有准备工作都已做好,开始执行Handler(我们写的controller代码并不是能被直接执行,需要有刚才那些操作,才能转变为Handler被执行)。

  4. Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。

  5. 这个ModleAndView只是一个逻辑视图,并不是真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。

  6. DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图。将得到的最终视图通过http响应返回客户端。


--- THE END ---