MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?回答重点MyISAM :1)MyISAM 是基于 ISAM 引擎而来的,支持全文检索、数据压缩、空间函数,不支持事务和行级锁,只有表级别锁,它适用于 OLAP 场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景。
2)MyISAM 的索引也是 B+ 树,只是不像 InnoDB 那种叶子节点会存储完整的数...
如何实现数据库的不停服迁移?回答重点迁移想着很简单,不就是把一个库的数据迁移到另一个库吗?
但是实际上有很多细节,在面试中我们可以假装思考下,然后向面试官复述以下几点:
首先关注量级,如果是几十万的数据其实直接用代码迁移,简单核对下就结束了。如果数据量大那么才需要好好设计方案。
不停服数据迁移需要考虑在线数据的插入和修改,保证数据的一致性。
迁移还需要注意回滚,因为一旦发生问题需要及时切换...
什么是数据库的逻辑外键?数据库的物理外键和逻辑外键各有什么优缺点?回答重点逻辑外键是一种在应用程序层面上管理和维护数据完整性的方法,而不是通过数据库本身的外键约束。主要是利用应用程序代码来保证引用的完整性。
逻辑外键的优缺点优点:
灵活性高:应用程序层面控制,可以更灵活地实现复杂的业务逻辑。
性能优化:避免了数据库层面的约束检查,可以在某些情况下提高性能(详细看扩展知识)。
跨数据库兼容性...
什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?回答重点逻辑删除是一种将数据标记为已删除但实际不会从数据库中移除的删除方式。一般是在表中添加一个表示删除状态的字段,如 is_deleted ,默认是 0 表示未删除,1 表示已删除。
物理删除则是直接从数据库中删除记录。
一般业务上都是使用逻辑删除,便于后续的数据分析、追溯等。
扩展知识物理删除的优缺点优点:
节省存储空间:物...
MySQL 数据库的性能优化方法有哪些?回答重点对开发而言,一般可以从 SQL 和库表设计两部分优化 MySQL 性能问题。
SQL 优化根据慢 SQL 日志,找出需要优化的一些语句。
常见优化方向:
1)避免 SELECT *,只查询必要的字段
2)避免在 SQL 中进行函数计算等操作,使得无法命中索引
3)避免使用 %LIKE,导致全表扫描
4)注意联合索引需满足最左匹配原则
5)不要对...
MySQL 的查询优化器如何选择执行计划?回答重点选择执行计划一般需要经过以下几个步骤:
1)将 SQL 语句解析为解析树。
2)预处理,包括语法检查、权限验证、查询重写(例如常量表达式计算、子查询展开等)。
3)生成多个执行计划,并选择成本最低的执行计划。
扩展知识优化器成本的计算方式实际上优化器的内部实现方式比较复杂,我们仅需着重关心它的成本计算,这样能更好地理解 SQL 的执行计划是如...
Redis Zset 的实现原理是什么?回答重点Redis 中的 ZSet(有序集合,Sorted Set) 是一种由 跳表(Skip List) 和 哈希表(Hash Table) 组成的数据结构。ZSet 结合了集合(Set)的特性和排序功能,能够存储具有唯一性的成员,并根据成员的分数(score)进行排序。
ZSet 的实现由两个核心数据结构组成:
跳表(Skip List):用于存...
为什么 Redis Zset 用跳表实现而不是红黑树?B+树?回答重点为什么不用红黑树?1)相比红黑树而言实现简单
跳表基于多层链表实现,通过概率算法动态生成索引层级,没有左旋右旋等操作,逻辑理解上更为简单。而红黑树需要复杂的平衡操作(旋转)来维护结构,代码实现复杂度较高,理解门槛更高。
2)范围查询更高效
范围查询跳表可以通过 O(logn) 的时间复杂度定位起点,然后在原始的链表中往后遍...
Redisson 看门狗(watch dog)机制了解吗?回答重点Redisson 的看门狗(watchdog)主要用来避免 Redis 中的锁在超时后业务逻辑还未执行完毕,锁却被自动释放的情况。它通过定期刷新锁的过期时间来实现自动续期。
主要原理:
定时刷新:如果当前分布式锁未设置过期时间,Redisson 基于 Netty 时间轮启动一个定时任务,定期向 Redis 发送命令更新锁的过...
Redis 源码中有哪些巧妙的设计,举几个典型的例子?回答重点Redis 作为一款高性能的内存数据库,其源码中包含了许多巧妙的设计。这些设计不仅体现了高效的数据处理和管理能力,也为后续的系统扩展和性能优化奠定了基础。
巧妙的设计主要包括:线程模型、数据结构、共享对象池、过期设计、数据持久化设计等。
线程模型Redis 使用单线程模型来处理所有的客户端请求。
虽然看似单线程简单,但这种设计减少...
1000 个任务,每个任务 0.1s,最大响应时间 1s,线程池参数怎么设置?回答重点
题目信息不足,那就顺着不足的信息直接回答,不要强加 CPU 核数、I/O密集、CPU 密集等概念限制自己的思考,在直接回答答案后再提出这些概念即可。(还有一种方式就是继续和面试官沟通追问,具象化题目再回答)
分析题目的意思:每个任务需要花费的时间是 0.1s,线程池要在 1s 内处理完这 10...
有一张表里面有三个字段,分别是(id,开始时间,结束时间),表中数据量为 5000W,如何统计流量最大的时候有多少条数据?回答重点
题干没有告知峰值的统计单位,可以直接询问面试官,原理都是一样的。本答案以秒作为单位,统计每秒的最大值。
我们要统计每秒钟内的最大并发流量,也就是在某一秒内有多少个事件处于活动状态(即时间段的重叠),可以使用差分数组和扫描线思想来实现。
我们可以通过将每个事件活...
针对支付宝最近出现的八折优惠事故,说说如何才能避免类似事件的发生?回答重点根据官方回应出现 bug 的原因是运营人员配置错营销模板导致的,即优惠额度和优惠类型都写错了。
实际上,类似的人为错误是难以完全避免的。作为开发人员,我们可以从产品和技术的角度出发,思考如何尽量降低人为失误的发生几率,并通过及时的预警、拦截等机制,在出错后减少资损。
从产品侧思考很多敏感场景我们需要“防呆设计”,例...
接口变慢了应该如何排查?导致接口变慢的原因有哪些?回答重点
接口变慢的原因可能非常复杂,涉及到 硬件资源、网络、应用程序代码、数据库 等各个层面。
接口变慢的排查思路
大部分情况下,接口变慢的排查思路按照以下的几点来回答面试官(注意,不要过度发散)
利用服务的监控(目前大部分公司项目都部署在云服务平台上,都会提供基础的监控大屏),或使用监控工具(如 Prometheus + Grafan...
线上 CPU 飙高如何排查?回答重点线上 CPU 飙高是一个比较常见的问题,并且它的排查手段比较流程化,非常适合套在各个项目中,大家按照我下面的思路简单加点细节就可以使用在自己的项目上了。
1)首先确认哪个进程占用 CPU 过高,登录服务器利用 top 命令查看。
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器...
怎么分析 JVM 当前的内存占用情况?OOM 后怎么分析?回答重点利用 jstat 监控和分析 JVM 内部的垃圾回收、内存等运行状态。可以用它来查看堆内存、非堆内存等的实时状态。
可以使用 jmap 查看, JVM 堆的详细信息(包括堆的配置、内存使用情况、GC 活动等)。
在发生 OOM 时,可以根据 jmap 得到堆转储文件(建议增加JVM启动参数,-XX:+HeapDumpOnO...
如果发现 Redis 内存溢出了?你会怎么做?请给出排查思路和解决方案回答重点遇到线上问题,第一时间是止损,如果发现 Redis 内存溢出,则应该立即扩容,增加 Redis 实例的内存,保证线上业务正常运行。
然后再排查内存溢出的可能原因:
数据过多: Redis 中存储的数据量过大,超过了可用内存。
数据过期策略失效: 大量的 key 没有设置过期时间,导致内存不断增长。
大对...
Spring Cloud 可以选择哪些 API 网关?回答重点在 Spring Cloud 架构中,有很多种可以选择的 API 网关方案,主要如下:
1)Spring Cloud Gateway:这个应该是现在 Spring Cloud 微服务开发中使用比较广泛的,也是 Spring 大力推荐的,其基于非阻塞的 WebFlux 响应式编程框架,充分发挥了响应式编程的优势以及特性,其提供了流...
什么是 Spring Cloud Zuul?回答重点Spring Cloud Zuul 是 Spring Cloud 官方早期默认推荐的网关组件,不过其由于 2020 年 12 月开始已经停止维护了,其现在逐渐被 Spring Cloud Gateway 所取代。
Zuul 提供了鉴权、路由、限流等功能,可以与 Spring Cloud 的其他组件,比如说 Eureka、Ribbon、Hys...
什么是 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 官方团队好像没有整合的计划,并...
说说什么是 API 网关?它有什么作用?回答重点API 网关是位于客户端与后端服务之间的一层,充当所有客户端请求的统一入口,负责路由请求到正确的服务,并提供认证与授权、负载均衡、限流、缓存、日志记录等功能。
API 网关的作用简化客户端调用:
统一入口:API 网关提供了单一入口,客户端只需与网关交互,而不需要了解后端服务的具体部署位置和接口细节,从而简化了客户端的调用逻辑。
请求聚合:在...
什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?回答重点令牌桶算法是一种流量控制算法,用于限制系统的访问频率。该算法允许以固定的速率向“桶”中加入令牌,处理请求时消耗桶中的令牌。当桶中的令牌耗尽时,后续请求会被拒绝或延迟处理。
在 Java 中可以使用基于 Guava 的 RateLimiter 实现令牌桶算法,可以有效控制单用户的访问频率,避免恶意行为。
令牌桶算法工作原理令...
什么是 Netty,它在网络编程中解决了什么问题?回答重点Netty 是高性能 Java 网络通信的底层框架,它使用异步、事件驱动等架构,解决了传统 Java 网络编程中的一些复杂问题:
传统BIO阻塞瓶颈:通过NIO多路复用实现单线程万级连接,避免线程爆炸
原生NIO开发复杂度:封装Selector/Channel/Buffer,提供Pipeline责任链式API
网...
说说你知道的几种 I/O 模型回答重点1)同步阻塞 I/O(Blocking I/O,BIO)
线程调用 read 时,如果数据还未到来,线程会一直阻塞等待;数据从网卡到内核,再从内核拷贝到用户空间,这两个拷贝过程都为阻塞操作。
优点:实现简单,逻辑直观;调用后直接等待数据就绪。
缺点:每个连接都需要一个线程,即使没有数据到达,线程也会被占用,导致...
说一下 Netty 的应用场景?回答重点Netty 的应用场景主要有以下几个:
许多框架底层通信的实现,比如说 RocketMQ、Dubbo、Elasticsearch、Cassandra 等,底层都使用到了 Netty。
游戏行业,在游戏服务器开发中,Netty 用于处理大量并发的游戏客户端连接,提供低延迟的网络通信能力
实现一个通讯系统,比如聊天室、IM 等,处理高并发的实时消息传输。...
介绍一下 Reactor 线程模型?回答重点Reactor 是服务端在网络编程时的一个编程模式,主要由一个基于 Selector (底层是 select/poll/epoll)的死循环线程,也称为 Reactor 线程。
基于事件驱动,将 I/O 操作抽象成不同的事件,每个事件都配置对应的回调函数,由 Selector 监听连接上事件的发生,再进行分发调用相应的...
简单说说 Netty 的零拷贝机制?回答重点
前置知识:零拷贝的基本理念
避免在用户态和内核态之间拷贝数据,从而降低 CPU 占用和内存带宽的消耗。
除了系统层面的零拷贝,Netty 还强调在 buffer 之间避免不必要的数据拷贝。
Netty 中的零拷贝包括以下四个方面:
零拷贝机制
描述
FileRegion 接口
利用操作系统的 sendfile 系统调用,将文...
为什么不选择使用原生的 NIO 而选择使用 Netty 呢?回答重点因为原生的 NIO 存在一些问题:
1)原生 NIO 接口较多,能支持更精细化的调用,但是对于通常的使用而言过于复杂。就好下面这张图,对于已经深耕的专业人员来说,可能极好,但对于大部分人员使用来说太复杂了。
所以如果用原生 NIO 开发的话,需要进行二次封装,开发效率不高,且原生 NIO 对开发者要求较高,不好开发。
2...
简单说说 Netty 的线程模型,并且其是如何完成工作的?回答重点Netty 主要采用了 Reactor 模型,且通过细化线程池管理来处理不同的 I/O 任务。
Netty 的线程模型可以分为三个部分:
Boss 线程组:负责接收客户端的连接请求。
Worker 线程组:负责处理 I/O 读写操作。
业务线程组(可选):负责处理具体的业务逻辑。
具体工作机制1)Bos...