【面试】三、MQ、MySQL、Redis(更新中)

MySQL

Mysql索引优化查询原理

Mysql索引失效的条件

数据库范式

第一范式:列不可再分

第二范式:表中必须存在主键且非主键必须依赖于主键

第三范式:表中非主键的列必须完全直接依赖于主键,不可以传递依赖

BC范式:消除主属性对于码部分的依赖

SQL语句执行过程

  1. 通过数据库驱动与数据库建立连接,建立完成后发送SQL语句

另:缓存中的数据格式:

​ Key(SQL语句)------Value(数据值)

  1. 解析器:对SQL语句进行语法分析,得到抽象语法树,判断表是否存在,要查询的字段是否在表中存在。
  2. 优化器:通过一系列运算得到一个执行计划,包括使用的索引
  3. 执行器:根据执行计划调用存储引擎的接口,完成SQL的执行

Innodb在底层的操作:

1. 根据执行计划进行查询
2. 在Buffer Pool中进行查询,若没有则会从磁盘中进行查找,查找到之后会把数据放在Buffer Pool中

消息队列(MQ)

什么是消息队列

消息队列是一个用于通信的组件,本质上是一个转发器,其中包含

生产者发送消息 -> 队列存储消息 -> 消费者接收消息三个环节

常见的消息中间件有:RabbitMQ、RocketMQ、Kafka

使用消息队列的原因

应用解耦

可以令消息队列作为中间环节,服务提供者模块将自己的功能写入消息队列,而消费者模块将其获取到并进行后续操作(订阅)

流量削峰(消息挤压怎么处理?)

控制请求不要在同一时间全部发送到数据端,让数据平稳且高效的传给数据端进行处理,以降低请求高峰期的数据压力

异步处理

将请求进行业务拆分,令可以异步处理的业务传入消息队列,再对信息进行异步处理,这样不会影响到其他业务的性能,也可以使得业务可以顺利进行。

消息通讯

远程调用

解决消息丢失问题

生产者端不丢失信息

  • 同步发送

    在发送消息时,send会在接收成功时返回成功信息,若没有返回或返回失败会进行重发

  • 事务消息

    事务消息会对队列信中信息进行判断,若判断不正常的话会进行回滚

队列端不丢失信息

刷盘机制,只有将信息持久化到磁盘上之后,会返回一个ACK进行确认。

消费者端不丢失信息

在业务逻辑执行结束之后再反馈成功信息

消息队列保证执行顺序

使用有序消息技术,只有当前一个消息执行成功且返回成功的ACK后,才会执行下一条消息。

一般进行Hash计算,设置一个参数,将相同参数的消息放到同一个分区,实现消息局部有序(提高性能)。

重复消息的处理

建立本地表进行唯一业务标记,在消息执行之前优先进行校验。

消息积压

  • 增加消费端实例
  • 通过配置增加消费者数量以及每次从队列中获得的消息数量
  • 紧急上线专门用于记录消息的队列,将消息记录到数据库中再进行后续处理

MQ的选型

  • RabbitMQ:erlang语言写成,环境完备,管理界面丰富,使用主从架构、并发能力较低,erlang语言也不利于拓展。
  • RocketMQ:Java语言写成,由阿里进行维护,使用分布式架构,并发能力非常高,功能完善拓展性高
  • Kafka:Scala开发,只支持主要的MQ功能,为大数据环境做准备,使用分布式架构,并发能力高,在日志采集方面有独特优势。

如何实现消息一致性

使用事务消息实现消息一致性:

RocketMQ:

  1. 生产者先向MQ发送一个half事务,
  2. 若half事务消息发送成功则MQ返回一个成功消息给生产者,
  3. 此时生产者执行生产端的业务逻辑并提交事务commit或rollback,如果commit则MQ会将消息写入磁盘(若长时间没有接收到消息则会调用生产者的接口来判断业务执行结果,若成功则将消息写入,若失败则将消息删除。)
  4. 消费者消费消息

Redis

你可能感兴趣的:(面试,面试,mysql,redis)