1、Mysql的存储引擎,以及他们之间的区别
1、InnoDB支持事务,MyISAM不支持
2、InnoDB 支持外键,而 MyISAM 不支持
3、InnoDB 支持表、行锁,而 MyISAM 支持表级锁
4、InnoDB 必须有唯一索引(主键)」,如果没有指定的话 InnoDB 会自己生成一个隐藏列Row_id来充当默认主键,MyISAM 可以没有
5、等等包括不限于
2、一条 Sql 语句查询一直慢会是什么原因
1.没有用到索引
比如函数导致的索引失效,或者本身就没有加索引
2.表数据量太大
考虑分库分表吧
3.优化器选错了索引
考虑使用 force index 强制走索引
3、面对一个上百行,多张表关联,编写比较复杂,性能存在问题的sql优化,你的优化思路是什么?
1、先分析sql的执行情况,判断慢的原因,考虑建立合适的索引或是否建立索引
2、业务涉及到多表关联查询,还编写比较复杂,考虑表设计是否合理,是否有有改变表结构的可能,或者建立所需查询的大表,使用大表查询
3、简化sql,判断sql查询是否可以在业务代码中处理,没必要一条sql查出所需数据
4、综合判断所查询的数据更新是否频繁,查询的条件是否比较均一,使用缓存处理
5、引入搜索引擎,比如es,数据查询走搜索引擎能高效查询
6、。。。。。。
4、分布式事务怎么实现
1.本地消息表
2.消息事务
3.二阶段提交
4.三阶段提交
5.TCC
6.最大努力通知
7.LCN框架
8.Seata 框架
可以通过以下七种方案解决方案,根据回答继续问该方案实现的思路
5、Redis 的持久化机制有哪些?优缺点说说
redis 有两种持久化的方式,AOF 和 RDB.
AOF:
redis 每次执行一个命令时,都会把这个「命令原本的语句记录到一个.aod的文件当中,然后通过fsync策略,将命令执行后的数据持久化到磁盘中」(不包括读命令)
RDB:
把某个时间点 redis 内存中的数据以二进制的形式存储的一个.rdb为后缀的文件当中,也就是「周期性的备份redis中的整个数据」,这是redis默认的持久化方式,也就是我们说的快照(snapshot),是采用 fork 子进程的方式来写时同步的。
6、Redis除了用在缓存方面,还有没有用在别的场景,可以说一下
例如:分布式锁、消息队列、地图距离查找(GEO)、分布式限流等等
7、怎么实现分布式锁
实现方案例如:
基于Spring Integration实现分布式锁、基于redisson实现分布式锁
谈谈你是怎么通过redis实现分布式锁的
8、为什么需要限流
限流可以应对:热点业务带来的突发请求;调用方bug导致的突发请求;恶意攻击请求。
9、有没有使用过消息队列(RabbitMq等等)
优点比较核心的有 3 个:解耦、异步、削峰。
缺点有以下几个:
1. 系统可用性降低
系统引入的外部依赖越多,越容易挂掉。
2. 系统复杂度提高
硬生生加个 MQ 进来,如何保证消息的传递及消费成功
3. 一致性问题
A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,这数据就不一致了。
所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉。
如何保证消息的传递和成功消费?
需要考虑:
消息发送确认机制;消费确认机制;消息的重新投递;消费幂等性, 等等
10、什么是IOC和AOP。
IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)
11、有没有使用过微服务
介绍一下常用的微服务组件,以及你自己的项目是怎么拆分服务的
参考图
12、其他问题
- nacos和eureka的区别,还有他们服务注册和发现的机制分别是什么
- 分布式配置中心的实现原理是什么
- 项目里面你是怎么实现鉴权的
- 远程调用时token怎么传递
- 项目的优化有没有做过什么全局处理