MySQL 中如何解决深度分页的问题?回答重点优化方式可以有三种:
1)子查询
比如 select * from mianshiya where name = ’yupi‘ limit 99999990,10; 这样的一条查询语句,可以优化成:
12345select * from mianshiya where name = 'yupi' and id >= (s...
如何在 MySQL 中监控和优化慢 SQL?回答重点可以利用 MySQL 自带的 slow_query_log 来监控慢 SQL,它是 MySQL 提供的一个日志功能,用于记录执行时间超过特定阈值的 SQL 语句。
对于慢查询,再使用 EXPLAIN 分析执行计划,查看查询的执行顺序、使用的索引、扫描的行数等,以识别潜在的性能瓶颈。
基于 EXPLAIN 再进行针对性的优化,常见的优化方向有...
MySQL 中 DELETE、DROP 和 TRUNCATE 的区别是什么?回答重点
Delete 用于删除行数据,但保留表结构和相关的对象。
Drop 用于完全删除数据库表,包括数据和结构。
Truncate 只删除数据,不会删除表结构和索引等其他结构。
从性能来看,Drop > Truncate > Delete
扩展知识Delete本质上这个删除其实就是给数据行打个标记...
MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?回答重点INNER JOIN:
只返回两个表中匹配的行。如果没有匹配,则该行不会出现在结果集中。
适用于只关心交集数据的场景。
LEFT JOIN(或 LEFT OUTER JOIN):
返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配,则结果中的右侧列会显示为NULL。
适用...
MySQL 事务的二阶段提交是什么?回答重点MySQL 事务的二阶段提交是指在 MySQL 中,为了确保redo log(重做日志)和 binlog(二进制日志)之间的一致性,使用的一种机制。MySQL 通过二阶段提交来保证在crash recovery(崩溃恢复)时,不会出现数据丢失或数据不一致的情况。
二阶段提交的两个阶段:
准备阶段(Prepare Phase):在事务提交时,MyS...
MySQL 三层 B+ 树能存多少数据?回答重点在 MySQL 的 InnoDB 存储引擎中,B+ 树默认数据页大小为 16KB。
参数:
每个节点页大小为 16KB(即 16384 字节)。
假设每个数据记录的主键和数据大小为 1KB(一般会比这个小,但这里取整方便计算)。
每个内部节点(非叶子节点)存储的是指向子节点的指针和索引键。
三层 B+ 树的存储计算:
叶子节点:第三层为...
MySQL 在设计表(建表)时需要注意什么?回答重点设计表的时候,在满足业务需求的情况下,需要额外考虑表结构的高效性、扩展性以及维护性。
1)选择合适的数据类型:为字段选择合适的数据类型可以有效减少存储空间,并提高查询效率。例如:
使用 INT 而不是 BIGINT,前提是如果数据不会超出 INT 范围。
使用 VARCHAR 而不是 TEXT,如果字段长度比较短且可变。
使用 DATE、...
Redisson 看门狗(watch dog)机制了解吗?回答重点Redisson 的看门狗(watchdog)主要用来避免 Redis 中的锁在超时后业务逻辑还未执行完毕,锁却被自动释放的情况。它通过定期刷新锁的过期时间来实现自动续期。
主要原理:
定时刷新:如果当前分布式锁未设置过期时间,Redisson 基于 Netty 时间轮启动一个定时任务,定期向 Redis 发送命令更新锁的过...
为什么 Redis Zset 用跳表实现而不是红黑树?B+树?回答重点为什么不用红黑树?1)相比红黑树而言实现简单
跳表基于多层链表实现,通过概率算法动态生成索引层级,没有左旋右旋等操作,逻辑理解上更为简单。而红黑树需要复杂的平衡操作(旋转)来维护结构,代码实现复杂度较高,理解门槛更高。
2)范围查询更高效
范围查询跳表可以通过 O(logn) 的时间复杂度定位起点,然后在原始的链表中往后遍...
Redis Zset 的实现原理是什么?回答重点Redis 中的 ZSet(有序集合,Sorted Set) 是一种由 跳表(Skip List) 和 哈希表(Hash Table) 组成的数据结构。ZSet 结合了集合(Set)的特性和排序功能,能够存储具有唯一性的成员,并根据成员的分数(score)进行排序。
ZSet 的实现由两个核心数据结构组成:
跳表(Skip List):用于存...
Redis 源码中有哪些巧妙的设计,举几个典型的例子?回答重点Redis 作为一款高性能的内存数据库,其源码中包含了许多巧妙的设计。这些设计不仅体现了高效的数据处理和管理能力,也为后续的系统扩展和性能优化奠定了基础。
巧妙的设计主要包括:线程模型、数据结构、共享对象池、过期设计、数据持久化设计等。
线程模型Redis 使用单线程模型来处理所有的客户端请求。
虽然看似单线程简单,但这种设计减少...
什么是 Spring Cloud Zuul?回答重点Spring Cloud Zuul 是 Spring Cloud 官方早期默认推荐的网关组件,不过其由于 2020 年 12 月开始已经停止维护了,其现在逐渐被 Spring Cloud Gateway 所取代。
Zuul 提供了鉴权、路由、限流等功能,可以与 Spring Cloud 的其他组件,比如说 Eureka、Ribbon、Hys...
Spring Cloud 可以选择哪些 API 网关?回答重点在 Spring Cloud 架构中,有很多种可以选择的 API 网关方案,主要如下:
1)Spring Cloud Gateway:这个应该是现在 Spring Cloud 微服务开发中使用比较广泛的,也是 Spring 大力推荐的,其基于非阻塞的 WebFlux 响应式编程框架,充分发挥了响应式编程的优势以及特性,其提供了流...
什么是 Spring Cloud Gateway?回答重点Spring Cloud Gateway 是 Spring Cloud 开源的网关组件,其使用了 WebFlux 框架,充分发挥了响应式编程的特性以及优点,其底层使用了 Netty 作为通信框架,并且包含了 Spring framework 5、SpringBoot 2 以及 Project Reactor 等技术,适配 Spring...
你项目里为什么选择 Gateway 作为网关?回答重点选择 Spring Cloud Gateway 的原因主要有两个:
1)以前用得比较多的是 Spring Cloud 官方开源的 Zuul,其用得比较多的还是 1.0 的版本,不过 1.0 版本 Netflix 很早就宣布进入维护状态了,虽然 Zuul 已经出了 2.0 版本,但是 Spring Cloud 官方团队好像没有整合的计划,并...
什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?回答重点令牌桶算法是一种流量控制算法,用于限制系统的访问频率。该算法允许以固定的速率向“桶”中加入令牌,处理请求时消耗桶中的令牌。当桶中的令牌耗尽时,后续请求会被拒绝或延迟处理。
在 Java 中可以使用基于 Guava 的 RateLimiter 实现令牌桶算法,可以有效控制单用户的访问频率,避免恶意行为。
令牌桶算法工作原理令...
说说什么是 API 网关?它有什么作用?回答重点API 网关是位于客户端与后端服务之间的一层,充当所有客户端请求的统一入口,负责路由请求到正确的服务,并提供认证与授权、负载均衡、限流、缓存、日志记录等功能。
API 网关的作用简化客户端调用:
统一入口:API 网关提供了单一入口,客户端只需与网关交互,而不需要了解后端服务的具体部署位置和接口细节,从而简化了客户端的调用逻辑。
请求聚合:在...
1000 个任务,每个任务 0.1s,最大响应时间 1s,线程池参数怎么设置?回答重点
题目信息不足,那就顺着不足的信息直接回答,不要强加 CPU 核数、I/O密集、CPU 密集等概念限制自己的思考,在直接回答答案后再提出这些概念即可。(还有一种方式就是继续和面试官沟通追问,具象化题目再回答)
分析题目的意思:每个任务需要花费的时间是 0.1s,线程池要在 1s 内处理完这 10...
有一张表里面有三个字段,分别是(id,开始时间,结束时间),表中数据量为 5000W,如何统计流量最大的时候有多少条数据?回答重点
题干没有告知峰值的统计单位,可以直接询问面试官,原理都是一样的。本答案以秒作为单位,统计每秒的最大值。
我们要统计每秒钟内的最大并发流量,也就是在某一秒内有多少个事件处于活动状态(即时间段的重叠),可以使用差分数组和扫描线思想来实现。
我们可以通过将每个事件活...
接口变慢了应该如何排查?导致接口变慢的原因有哪些?回答重点
接口变慢的原因可能非常复杂,涉及到 硬件资源、网络、应用程序代码、数据库 等各个层面。
接口变慢的排查思路
大部分情况下,接口变慢的排查思路按照以下的几点来回答面试官(注意,不要过度发散)
利用服务的监控(目前大部分公司项目都部署在云服务平台上,都会提供基础的监控大屏),或使用监控工具(如 Prometheus + Grafan...
怎么分析 JVM 当前的内存占用情况?OOM 后怎么分析?回答重点利用 jstat 监控和分析 JVM 内部的垃圾回收、内存等运行状态。可以用它来查看堆内存、非堆内存等的实时状态。
可以使用 jmap 查看, JVM 堆的详细信息(包括堆的配置、内存使用情况、GC 活动等)。
在发生 OOM 时,可以根据 jmap 得到堆转储文件(建议增加JVM启动参数,-XX:+HeapDumpOnO...
如果发现 Redis 内存溢出了?你会怎么做?请给出排查思路和解决方案回答重点遇到线上问题,第一时间是止损,如果发现 Redis 内存溢出,则应该立即扩容,增加 Redis 实例的内存,保证线上业务正常运行。
然后再排查内存溢出的可能原因:
数据过多: Redis 中存储的数据量过大,超过了可用内存。
数据过期策略失效: 大量的 key 没有设置过期时间,导致内存不断增长。
大对...
线上 CPU 飙高如何排查?回答重点线上 CPU 飙高是一个比较常见的问题,并且它的排查手段比较流程化,非常适合套在各个项目中,大家按照我下面的思路简单加点细节就可以使用在自己的项目上了。
1)首先确认哪个进程占用 CPU 过高,登录服务器利用 top 命令查看。
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器...
针对支付宝最近出现的八折优惠事故,说说如何才能避免类似事件的发生?回答重点根据官方回应出现 bug 的原因是运营人员配置错营销模板导致的,即优惠额度和优惠类型都写错了。
实际上,类似的人为错误是难以完全避免的。作为开发人员,我们可以从产品和技术的角度出发,思考如何尽量降低人为失误的发生几率,并通过及时的预警、拦截等机制,在出错后减少资损。
从产品侧思考很多敏感场景我们需要“防呆设计”,例...
让你设计一个文件上传系统,怎么设计?这种题目都是开放性的,面试过程中也不奢望聊出所有的设计细节,仅仅需要抛出一些大致的设计需求与要点,然后简单的方案实现思路即可。
关于文件上传系统有几个最主要的核心点需要解决:
1)如何支持超大文件上传2)避免重复文件存储,节省空间3)限流问题
大文件上传假设有个 10 G 的文件需要上传,正常情况下是将文件转成流传到后端,如果不做任何处理,前端一直传,后端...
让你设计一个分布式 ID 发号器,怎么设计?一般在分库分表场景,就会有分布式 ID 的需求,因为需要有一个唯一标识来标记一个订单或者其他类似的数据等。
全局唯一 ID 有很多种实现,例如 UUID ,优势就是本地生成,很简单。但它是无序的,如果需要将唯一 ID 作为主键,则 UUID 不合适,首先是太长了,其次无序插入会导致数据页频繁分裂,性能不好。
在回答这个面试题的时候可以先提下 UUI...
什么是限流?限流算法有哪些?怎么实现的?限流是什么?首先来解释下什么是限流?
在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。
那在我们工程上限流是什么呢?限制的是 「流」,在不同场景下「流」的定义不同,可以是每秒请求数、每秒事务处理数、网络流量等等。
而通常我们说的限流指代的是 限制到达系统的并发请求数,使得...
让你设计一个 HashMap ,怎么设计?这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。
可以先说下你对 HashMap 的理解。
比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。
基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过...
如何设计一个点赞系统?点赞系统看似简单,实则非常复杂,它可以从系统架构、库表设计、数据存储、性能优化、容灾备份等多个角度来思考设计。
我们可以由浅入深的向面试官来说出这个实现方案:
系统架构设计从架构方面需要考虑:服务拆分、异步、缓存。
1)分布式架构
大流量场景下,可以将点赞功能独立成一个服务,解耦业务逻辑,便于扩展和维护。例如点赞服务压力倍增的时候,可以仅扩容点赞服务即可。
2)异步处理...
如何设计一个秒杀功能?回答重点
面试官针对这个问题不指望候选人可以系统地回答出完且可落地的方案。只是想考察候选人是否拥有高并发大流量场景下的处理思路或者说能考虑到的一些关键点。
针对秒杀场景,我们需要先和面试官说出以下几个需要解决的问题点:
瞬时流量的承接
防止超卖
预防黑产
避免对正常服务的影响
兜底方案
然后可以从前后端两个视角向面试官阐述整体的设计点:
首先是前端:
利用 C...