本文目录如下:
- 高级面试
- 一、MySQL
- B+树有什么优点?
- image.png
- InnoDB 和 MyISAM 的索引结构有什么区别 (聚簇索引-非聚簇索引)?
- 二、Redis
- Redis 如何保证存储的都是 热点数据?
- 大量 key 为同一过期时间怎么办?
- 缓存一致性的解决方案有哪几种?
- 三、特殊场景
- 什么是 QPS、TPS、OPS、RT?
- 秒杀场景实践之 抢红包 如何实现?
- Java
- Java 中常见的 OOM 是什么 (堆内存溢出)?
- 堆内存溢出的 原因?
- 堆内存溢出的 解决方法?
高级面试
一、MySQL
B+树有什么优点?
B+树的特点和优势
- 有
B Tree
的 强大功能 (每个节点可以存储 更多关键字; 子树更多), 并且在每个叶子节点中保存指向下一个叶子节点的指针。扫库、扫表能力更强
(进行 全表扫描 只需要遍历 叶子节点 就可以了)范围查询
和排序
能力更强 (因为 叶子节点 上有下一个 叶子节点 的指针, 所有 叶子节点 形成了 链表)
InnoDB 和 MyISAM 的索引结构有什么区别 (聚簇索引-非聚簇索引)?
详解MySQL 聚簇索引与非聚簇索引
InnoDB
使用聚簇索引
: 叶子节点 就是 数据节点。MyISAM
使用非聚簇索引
: 叶子节点 仍然是 索引文件, 只是这个 索引文件 中包含指向对应数据块的 指针。
二、Redis
Redis 如何保证存储的都是 热点数据?
当 Redis 使用的内存超过了设置的最大内存时,会触发 Redis 的 淘汰机制, 使用 allkeys-lru 策略,从数据集中挑选 最近最少使用 的数据 优先淘汰,即可满足 保存热点数据。
大量 key 为同一过期时间怎么办?
- 大量的 key 集中在某个时间点过期,Redis 可能会出现短暂的卡顿现象。如果访问量大的情况下,甚至出现缓存雪崩。
- 处理办法:可以在时间上加一个 随机值,分散过期时间点。
缓存一致性的解决方案有哪几种?
点击查看
先更新缓存,再更新数据库: 有很大的几率会出现缓存不一致的情况。先更新数据库,再更新缓存: 会有很大的几率会出现缓存不一致的情况。先删除缓存,再更新数据库: 会有很大的几率会出现缓存不一致的情况。先更新数据库,再删除缓存 [先写库再删缓存]
: 可以保证 数据一致性 的。
三、特殊场景
什么是 QPS、TPS、OPS、RT?
QPS
(queries per second): 每秒 查询数,查询操作。TPS
(transactions per second): 每秒 事务数,增删改操作。
秒杀场景实践之 抢红包 如何实现?
秒杀场景实践之抢红包 —— 常用解决方案
秒杀核心要点:
稳定
: 扛得住突发的 大流量, 确保红包都能成功派发。准确
: 数据一定要正确, 不能出现 超额派发 的情况。
秒杀核心技术:
- 高并发: 负载均衡、限流等。(10万个请求, 取前1000个请求放行到 服务器?)
- 读多写少: 缓存。
- 资源争用: 更新红包状态一定要是 原子操作。
实现方法:
开抢前
: 将 红包信息 加载到 缓存, 首次加载时间可长一些。抢红包
: 从缓存读取(没有则加载), 分配红包后 原子更新缓存(若已发放完毕则直接返回失败)缓存更新后写入数据库
。
Java
Java 中常见的 OOM 是什么 (堆内存溢出)?
详解java中的OOM及 java堆溢出分析
堆内存溢出
: 最常见的 OOM,当 堆内存 没有足够的空间存放新建的对象时,就会抛出java.lang.OutOfMemoryError:Javaheap space
错误。
堆内存溢出的 原因?
详解java中的OOM及 java堆溢出分析
- 请求创建一个超大对象: 比如说创建一个超大的数组;
- 内存泄漏Memory leak: 大量 对象引用 没有释放,JVM无法对其自动回收。
- 超出预期的访问量/数据量: 比如上游系统请求流量飙升,业务系统中的促销/秒杀活动等。
堆内存溢出的 解决方法?
通常情况下,通过
-Xmx参数
调高 JVM堆空间 即可,或使用MAT
、JProfiler
之类的工具进行进一步的分析:
- 检查超大对象: 哪些对象占据堆的大部分堆内存。
- 检查内存泄漏,找到持有的对象,修改代码设计,对于一些连接、打开的 IO文件 进行关闭。
- 对于业务峰值压力,可以 增加机器资源,或者做 限流降级操作。
-Xss参数
可以用来调整 线程 的 栈的大小。