1.高级面试-MySQL、Redis、特殊场景、Java

news/2024/7/5 3:12:28

本文目录如下:

  • 高级面试
    • 一、MySQL
      • B+树有什么优点?
    • image.png
      • InnoDB 和 MyISAM 的索引结构有什么区别 (聚簇索引-非聚簇索引)?
    • 二、Redis
      • Redis 如何保证存储的都是 热点数据?
      • 大量 key 为同一过期时间怎么办?
      • 缓存一致性的解决方案有哪几种?
    • 三、特殊场景
      • 什么是 QPS、TPS、OPS、RT?
      • 秒杀场景实践之 抢红包 如何实现?
    • Java
      • Java 中常见的 OOM 是什么 (堆内存溢出)?
      • 堆内存溢出的 原因?
      • 堆内存溢出的 解决方法?

高级面试

一、MySQL

B+树有什么优点?

B+树的特点和优势

  • B Tree 的 强大功能 (每个节点可以存储 更多关键字; 子树更多), 并且在每个叶子节点中保存指向下一个叶子节点的指针
  • 扫库、扫表能力更强(进行 全表扫描 只需要遍历 叶子节点 就可以了)
  • 范围查询排序 能力更强 (因为 叶子节点 上有下一个 叶子节点指针, 所有 叶子节点 形成了 链表)

image.png

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堆空间 即可,或使用 MATJProfiler 之类的工具进行进一步的分析:

  • 检查超大对象: 哪些对象占据堆的大部分堆内存。
  • 检查内存泄漏,找到持有的对象,修改代码设计,对于一些连接、打开的 IO文件 进行关闭。
  • 对于业务峰值压力,可以 增加机器资源,或者做 限流降级操作

-Xss参数 可以用来调整 线程栈的大小



http://lihuaxi.xjx100.cn/news/1142786.html

相关文章

Android Studio 基础 之 使用 okhttp 长连接,流式获取数据的方法简单整理了

Android Studio 基础 之 使用 okhttp 长连接,流式获取数据的方法简单整理了 目录 Android Studio 基础 之 使用 okhttp 长连接,流式获取数据的方法简单整理了 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现关键 六、关键代码 七…

一个有趣的avs编码器(注意,是avs,而不是avs2噢)

本章附件是一个清华大学写的关于avs编解码器: https://download.csdn.net/download/weixin_43360707/87793302 该编码器遵循了stuffing bit: 打开文件夹后,如下: 可以看出这个是个跨平台的工程,提供了windows vs2015的工程文件sln&#x…

js中获取当前页面的访问路径 IP 端口号 项目名等

例:http://127.0.0.1:8080/index.html?userNamezhangsan&passWord123456 1、获取URL 的路径部分(文件地址) window.location.pathname(本例中返回 index.html) 2、获取URL 完整地址(地址栏的整个地址) window.l…

数据结构与算法(二)

一、数组 什么是数组? 数组:在内存中用一串连续的区域来存放一些值。数组是相同类型数据元素的有序集合 数组是由相同类型的元素的集合组成的数据结构 连续内存:JS的数组元素可以是任意类型,JS中的内存地址是不连续的 数组的…

用两分钟教会你在领英Linkedin实现一天几个询盘

如果有兄弟还只会在展会、邮箱这些传统渠道开发客户的话,今天这篇文章你就要好好读一下了。最近几年,是社交媒体营销比较火爆的时候,很多跨境人都开始了社交化主动式去开发客户。而领英作为目前全球用户总计超过8亿,覆盖了200多个…

mongodb设置用户名和密码

docker run --name mongodb -p 27017:27017 -v /opt/mongodb/data:/data/db -v /opt/mongodb/backup:/data/backup -d mongo --auth进入容器: docker -it exec 容器id /bin/bash进入mongo的控制台 mongosh设置用户名及密码 use admin db.createUser({ user: &…

一文理解Kafka

概述 Kafka是一个基于Zookeeper的分布式消息中间件,支持消息分区,提供发布和订阅功能。使用Scala编写,主要特点是可水平扩展,高吞吐率以及高并发。 常见的使用场景: 企业级别活动数据和运营数据的消息传递&am…

postgresql流复制同异步分析

postgresql流复制同异步分析 postgresql流复制主要是四个进程的交互。 postgres(backend进程)(主节点) 接受客户端的请求,并通过共享内存等待walsender唤醒。 walsender(主节点) 向walreceive…