概览

Java

数据结构

  1. hashmap
    1. 实现原理。hash 冲突解决方式,为什么 list 要转为红黑树,数据量达到多少才会转为红黑树,为什么选择那个量
    2. 为什么不支持并发?
  2. 排序算法

JVM

  1. JVM 结构。堆、栈、Metaspace
    1. OOM 问题排查
    2. 堆栈溢出
  2. GC。
    1. CMS、G1
    2. gc 日志
    3. 内存泄漏
    4. full gc or major gc。STW
    5. 对象引用。强引用,弱引用等 4 个
  3. ClassLoader。双亲委派机制
    1. 插件,SPI

并发编程

  1. 线程。线程原理(操作系统的线程),每个线程会占据一定的操作系统资源(如内存),创造过多的线程会 OOM
    1. 线程状态。不同的状态是什么含义?如何获取线程堆栈?
    1. 锁类型,锁升级
    2. 锁工具。synchronized 关键字,violate 关键字
    3. 相关工具
      1. 原子引用
      2. 读写锁。Lock,Condition,ReentrantLock
      3. AQS 原理。Semaphore,CountDownLatch,CyclicBarrier
    4. 如何实现单生产者多消费者队列
  2. 线程池。为什么要池化?
    1. 线程池原理。核心参数配置,任务执行流程(向线程池提交一个任务,它是怎么处理的)
    2. 拒绝策略。有哪几种,如何选择
    3. 队列。如何实现优先级
    4. 如何监控线程池。micrometer 没有对线程池的监控,只能采集到 JVM 所有的线程,有没有对线程池做过监控埋点上报监控指标
    5. 动态线程池
  3. 阻塞vs非阻塞,同步vs异步
  4. 异步任务编排。CompletableFuture 等
  5. ThreadLocal。
    1. 原理。thread -> 数据 的一个 map
    2. 资源泄漏。在线程执行结束后没有主动移除 ThreadLocal 中的数据
    3. 线程池问题。
  6. 相关框架
    1. 动态线程池
    2. disruptor。无锁化
    3. TransmittableThreadLocal(TTL)

网络编程

  1. BIO、NIO、AIO
  2. netty
    1. 原理。reactor 模型,epoll
    2. 编解码。拆包、沾包
    3. 内存分配原理
    4. 时间轮

框架

mybatis

spring

存储

mysql

  1. 索引原理。B + 树
    1. 有哪些场景会造成索引失效?
    2. 给定xxx场景,会选择哪个索引?给定xxx场景,会走xxx索引吗?
    3. 为什么要用雪花算法来作为主键,用 uuid 不行吗?页分裂
  2. 锁概念
    1. 有哪些锁?表锁,行锁
    2. 死锁原因
  3. 事务
    1. 事务隔离级别,业务上用的是什么级别?
    2. 大事务。如解析 excel 做数据导入场景,一个事务里插入了大量数据,执行了大量操作。
  4. explain
  5. sql 优化
    1. 慢 sql 优化
      1. 如何发现慢 sql?数据库层面配置慢 sql 日志,应用层面监察慢 sql 如 druid 连接池
      2. 慢 sql 原因?
        1. 未走索引,like 慢
        2. 多表 join
        3. 业务场景限定。sql 计算逻辑复杂(分析型 sql,非 OLTP 场景如每日排行榜)
      3. 如何优化
        1. 加索引
        2. 优化 sql 逻辑
        3. 更上层解决
          1. 应用接口加缓存,减少访问
          2. 多表 join 场景,多次查询
          3. 使用别的存储。如 like 效果不佳走 es,大数据量场景如订单查询也会走 es(不一定是搜索场景,es 的分布式能力比 mysql 更高,可支撑更高的查询,会经常有将 mysql 数据整合后同步到 es 支持线上查询的案例),分析型 sql 走 OLAP 数据库
          4. 数据预加工或数据冗余存储
    2. 多表 join。
      1. 大表 join。在 join 的表数据量很大时,sql 性能不高。尽量选择在 java 层面执行 2 次查询后做数据拼接
      2. 分库分表。部分分库分表场景下不支持 join
    3. text 等大字段查询。为什么不建议 select * 查询的原因之一就是对于 text、mediumtext 等类型代价较大,业务不需要应避免查询
    4. 深翻页
  6. 大数据量导出。如何处理从 mysql 读取大量数据的问题?
    1. 深翻页
    2. 流式查询。mybatis 封装的从 ResultSet 直接读取
  7. 数据迁移。迁移数据库或迁移表
    1. 从 A 数据库迁移到 B 数据库。数据迁移工具
    2. 从 A 表迁移到 B 表
      1. 迁移历史数据,迁移完成后从迁移的那一刻回放 binlog 数据到新表,应用双写,回放完毕应用迁移到新表
      2. 根据 updateTime 时间迁移 A 表数据至 B 表,迁移完时,应用迁移到新表

redis

  1. redis 为什么这么快?
    1. 网络。redis 网络层采用 epoll,实现 reactor 模型,支持多路复用
    2. 单线程。redis 执行命令采用的是单线程,无锁竞争
    3. 内存。redis 数据存储到内存,访问速度快
    4. 数据结构。redis 的数据结构效率更高。如 string 采用的 SDS(Simple Dynamic String)
  2. 分布式锁
    1. 怎么实现。set nx px
    2. 锁持有时间设置。
      1. 太长持有锁的线程挂掉,长久不释放
      2. 太短持有锁的线程没执行完任务就被自动释放掉,其他任务重新持有锁,执行中,又被上一次的释放掉了
      3. 解决办法:redisson 的 watchdog 机制
    3. redisson 锁实现原理
      1. 怎么加锁
      2. 怎么续锁。watchdog 机制
      3. 竞争锁失败如何等待锁。发布订阅机制
    4. 一次性锁多个锁,如何避免死锁
  3. 缓存。缓存穿透,缓存雪崩
    1. 缓存穿透。避免当缓存失效时,多个请求一起查询数据库,然后一起更新缓存,应确保只有一个请求在查询数据库更新缓存,其他请求等待后查询缓存即可
    2. 缓存雪崩。缓存失效时间设置为区间范围内的随机值,避免一次性失效大量缓存
    3. 与本地缓存的区别
  4. redis 怎么保证数据不丢失?redis 的备份快照机制
    1. RDB。将 Redis 内存中的数据以二进制快照形式保存到磁盘的方式,用于灾难恢复、数据备份或主从复制等场景
    2. AOF。每当 Redis 执行一个写命令(如 SETHSETLPUSH 等),该命令就会以文本协议格式追加(append)到 AOF 文件末尾。Redis 启动时,AOF 文件中的所有命令,重建内存数据状态
  5. redis cluster
    1. redis cluster 原理
    2. redis cluster 与 redis 单实例的使用区别。redis cluster 会将数据存储到不同的节点中,redis 单实例在同一个节点中,如果在一次业务请求中要同时处理多个 redis key,需注意批量执行的命令,从单实例迁移到 redis cluster 后,批量执行的命令对应的数据分散在不同的 redis cluster 节点上,导致异常。可在应用层面发起多次请求或者使用 lua 脚本一次性处理多个 key。

ElasticSearch

  1. 使用场景,与 mysql 的区别,倒排索引
  2. es 的集群概念(master、worker 节点),索引结构(shard、replica),索引健康状态(green、yellow、red),集群配置和索引配置
  3. es 的 mapping 优化。类似 mysql 字段类型选择
  4. es 字段的分词器配置
  5. 数据如何从 mysql 同步到 es,往 es 写数据速度优化
    1. 攒批写
    2. 在数据同步阶段 es shard 和 replica 设置为 1,写入完成后执行一次压缩,然后按照线上配置调整 shard 和 replica,上线操作
  6. es 写数据、读数据请求处理流程
  7. es 监控。怎么监控,会关注哪些核心指标
    1. 核心指标。shard 数据量,线程池
  8. 慢 query。如何发现和优化慢 query
  9. shard 迁移风暴 。在大集群环境下部分节点挂掉,导致失败节点上的 shard 发生迁移,集群内部 shard 复制流量飙升,和线上请求争抢流量,集群不稳定

mongo

todo

中间件

rocketmq

  1. 基础概念
  2. 集群架构。NameSvr,Broker
  3. topic 结构。topic + queue,tag
    1. 消息类型。普通消息,顺序消息,事务消息,延迟消息
  4. 顺序消息使用场景
  5. 延迟消息使用场景
    1. 限制。延迟时间。4.x 固定延迟,5.x 任意时间但限制 1 天内
    2. 4.x 固定延迟实现原理,如何用 kafka 实现
  6. 消息消费。
    1. pull vs push
    2. 重试,幂等

配置中心

apoll、nacos

调度系统

xxl-job

RPC

RPC。dubbo

微服务

JDBC

缓存。redis 缓存,本地缓存

应用预热。线程池,JDBC 连接池,缓存

限流、容灾、重试、降级

系统设计

  1. 如何实现一个秒杀系统
  2. 如何实现一个 RPC 系统