0423-面试-迈为科技
- seata:分布式事务
- sentinel:限流降级
- canal:基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
- Nacos:服务注册中心、配置中心
- 简单介绍下 ThreadLocal
ThreadLocal 在每个线程中都会堆该变量创建一个 副本,在这个线程内的任何地方都可以使用这个对象,线程之间互不影响。
原理:Thread 类中有一个 ThreadLocal.ThreadLocalMap 的成员变量 threadLocals , threadLocals 负责存储 ThreadLocal 泛型的实例,
ThreadLocalMap 的 Entry 继承了
WeakReference<ThreadLocal<?>>
ThreadLocal 造成内存泄露的问题?
线程池不会销毁线程, Thread 对象有一个强引用 ThreadLocalMap 对象 threadLocals。
ThreadLocal 的应用场景
- 每个线程维护一个序列号
- session
- DateFormat 是线程不安全的,可以在每个线程中创建一个
ThreadLocal<DateFormat>
对象
- 线程池的 7 大参数
- 核心线程数
- 总线程数
- 超时时间
- 超时时间的单位
- 创建线程的工厂
- 阻塞队列
- 拒绝策略
- 创建线程的几种方法
- Runnable
- Callable
- Thread
- 线程池
- 堆的结构
- 新生代,老年代 1:2
- Eden、Survivor(from,to) 8:1:1 即 survivor 中的一个区占新生代的 10%
- GC 的过程:新创建的对象放到 Eden 区域,执行 Minor GC 的时候,会把 Eden 存活的对象和 Survivor 的 from 区存活的对象移动到 survivor 的 to 区,将 Survivor 的 from 区 和 to 区对调,即 from 区变成 to 区,to 区变成 from 区。经过 16 minor gc 还存活的对象,会被移动到老年代。如果新生代 Eden 空间不足时,会将新创建的对象直接放到老年代中。survivor 的 to 区无法容纳 eden 区和 survivor from 区存活的对象时,会将对象直接移动到老年代。在 survivor 中的年龄从小到大累加,如果对象总和的大小大于 survivor to 区空间的一半,年龄大于该年龄的对象就直接进入老 年代。
- RabbitMQ 重复消费、消息丢失解决方案
- 重复消费
- 给消息一个 UUID,在消费消息之前,先查询缓存,判断消息是否已经被消费过。
- 消息丢失
- 生产者向MQ 推送消息的时候要有一个确认机制
- MQ 开启持久化
- 消费者从 MQ 消费消息时,也要有一个确认机制
- 死信队列,消息出现失败、超时、拒绝等问题时,将消息路由到死信队列,避免消息丢失。
- Redis 缓存击穿、雪崩、穿透
- 击穿:热点 key 失效,使用互斥锁,确保只有一个线程能够构建缓存,
- 雪崩:大片 key 失效、redis 挂了,key 的有效时间设置成不均匀的,避免同时失效;互斥锁,保证
- 击穿:访问不存在的 key, 先在redis 中缓存所有的 key ,使用布隆过滤器判断 key 是否存在。
- 布隆过滤器:有一个数组,对一个 key 有 n 个 hash 函数,得到 n 个下表,将数组中对应下标的值改成 1 ,在判断数据是否存在时,直接找对应下标是否全为 1 .
- MySQL 优化
- 优化案例
- 开启慢查询日志,找到查询慢的 SQL,查看慢 SQL 的执行计划。
- 是否走全文检索,如果是全文检索,给过滤条件添加索引。
- 有索引,但是没有走索引,判断没有走索引的原因。应用最左匹配原则、覆盖索引、索引下推等规则。
- 开启慢查询日志,找到查询慢的 SQL,查看慢 SQL 的执行计划。
- 如何判断 sql 的执行计划是否有使用到索引
- type 字段 all 为权限检索
- possible_key 可能使用到的索引
- key 使用到的索引
- key_len 索引的长度,根据这个可以判断,在符合索引中使用到了哪些索引。
- 定长字 段, int 占用 4 个字节,date 占用 3 个字节。char(n) 占用 n 个字符。
- 变长字段 varchar(n) 占用 n 个字符 + 2 个字节。
- 不同的字符集,一个字符占用的字节数是不同的。gbk 一个字符占 2 字节,utf-8 一个字符占 3 个字节。
- 对于所有的索引字段,如果设置为允许为 null ,则还需要加 1 个字节。(MySQL 需要额外一个字节来表示是否为 null)
- 优化案例
- Docker 的掌握程度,有没有用 Docker 部署过正式环境
- SpringBoot 的自动配置原理(源码)
- 有没有使用过 ES 1Vue 的要求:生命周期、插槽集、数组集、参数传递