频繁/重要面试题

2025-10-01

1.MySQL中有哪些锁类型?

行锁,锁住指定的行,其他事务可以并发操作其他的行,适合高并发场景
表锁,锁住指定的表,其他事务无法对该表进行读写操作,适用于需要保证完整性的小型表
意向锁,行锁与表锁的结合,意向锁住某个表中指定的行
共享锁,其他事务可以对共享锁的资源进行读取操作,释放共享锁后其他事务才能获取排他锁
排他锁,只允许一个事务进行读写操作,其他事务在获取排他锁之前不能对资源进行读写操作
元数据锁,用于保护数据库对象,表,索引等的元数据,防止在DDL操作时的DML操作和在DML操作时的DDL操作
间隙锁,对两行记录之间的间隙加锁,间隙锁不锁定行只锁定之间的空间,防止其他事务插入数据引起幻读
临键锁,间隙锁与行锁的结合,锁住具体行以及一段范围内的间隙,防止其他事务插入数据引起幻读
自增锁,对自增数据加锁,防止并发导致的自增数据不唯一

意向锁是加在表上的,在加S/X锁时要先加入对应的意向锁,原来对于检测锁是扫描每行数据,现在可以检测所有的意向锁

2.MySQL事务的二阶段提交是什么?

mysql事务的二阶段是保证数据一致性的安全机制
事务提交后mysql的Innodb引擎首先写入redolog,完成后状态改为prepare状态,Mysql Server开始写入binlog,写入完成后通知redolog,改为commit状态完成事务记录。在突然宕机时,如果redolog为prepare状态,会检测redolog与binlog的数据是否一致,一致则补个commit状态,不一致则回滚redolog。

3.MySQL中如果发生死锁应该如何解决?

mysql有内置的死锁处理机制,当检测到死锁后,mysql会回滚持有资源少的那个事务,解决死锁
持有锁达到一定时间也会自动释放锁进行回滚
手动处理:通过日志找到发生死锁的事务的线程信息,通过kill将其释放

2025-10-02

1.MySQL中如何解决深度分页的问题?

1.可以通过子查询优化查询效率,使查询能命中更多索引提升性能
2.可以记录查询结构的最大id,下次查询时通过id>maxId进行快速查找,仅适用于连续查询

2.什么是MySQL的主从同步机制?它是如何实现的?

主从同步是一种数据复制技术,mysql通过binlog日志的方式将数据同步到一个或多个从库,当有数据提交时,binlog写入后会推送给从库,从库执行对应的部分同步数据

mysql支持异步复制:主库不会等待复制完成,继续进行操作
        同步复制:主库会等待从库全部完成复制,再继续操作
        半同步复制:主库会等待至少一个从库完成复制,再继续操作

3.如何处理MySQL的主从同步延迟?

主从延迟是不可避免的,只能降低
关键业务读写都走主库
写操作的一段时间内的读操作都走主库,保证同步到从库前都走主库
可以通过增加缓存解决主从延迟,但会有缓存不一致问题
可以在从库查询不到数据时再去主库查询一次
减少从库数量,使主库同步数据压力减小

2025-10-03

1.Redis中常见的数据类型有哪些?

string 字符串类型,底层由简单动态字符串实现
list 集合类型,底层为双向链表结构
set 不重复的无序的集合类型,底层采用哈希表实现
hash 键值对类型,底层采用哈希表实现
zset 拥有分数排名的set类型,可以通过分数排序,底层采用跳表和哈希表实现

2.Redis为什么这么快?

redis是基于内存存储的,比硬盘存储的数据库快很多
redis采用单线程模型加异步i/o方式,避免了多线程的上下文切换和竞争,提高处理效率
redis优化了数据结构使其操作性能更高

3.为什么Redis设计为单线程?6.0版本为何引入多线程?

redis原采用的单线程加异步i/o方式已经能极大的保证效率了,但由于并发量的突破,redis已经不能满足超大的并发量了,redis的性能瓶颈在网络i/o操作上,所以在网络i/o上采用了多线程方式进行,数据的读写仍然使用单线程

2025-10-04

1.Redis中跳表的实现原理是什么?

跳表是高效的数据结构,
元素随机决定层级关系的,但有限制
插入时由最高层开始,找到最后一个小于等于他的元素,如果等于直接返回,如果小于则判断元素是否拥有这层,有则在之后插入当前元素,然后前往下一层,一直到最后一层处理完后终止
查询时由最高层开始找到最后一个小于等于他的元素,如果等于直接返回,如果小于继续前往下一层,直到找到最后一层,在找到最后一个小于他的元素时,再往后查看一个元素判断是否是该元素,是则返回成功,不是返回失败
删除时和查询比较像,但会在每一层找到最后一个小于他的元素时都往后查询一个元素是否和当前元素相等,相等则删除

2.Redis的hash是什么?

hash是存储键值对的集合,可以使用一个key存储多对字段。
哈希表数据结构,适合存储字段与值的映射

3.Redis的Zset的实现原理是什么?

zset使用跳表加哈希表的结构存储数据
跳表用来存储元素的数据结构,排序和查找等
哈希表用来存储元素与分数的映射

2025-10-05

1.Redis 中如何保证缓存与数据库的数据一致性?

1.先更新缓存再更新数据库,不推荐
2.先更新数据库再更新缓存,不推荐
3.先删除缓存再更新数据库,不推荐
4.先更新数据库再删除缓存,可能有暂时的数据不一致问题,可保证实时一致性,虽然有可能数据不一致,但能尽量保证数据的一致性
5.先删除缓存再更新数据库再延迟删除缓存,采用消息队列,定时消息等延迟删除,更好的保证数据的一致性
6.先更新数据库,监听binlog的变化,加消息队列异步更新缓存,可以保证最终一致性,消息队列保证顺序
强一致性保证可以加锁,
获取写锁,更新缓存,更新数据库,释放写锁
获取读锁,查询缓存,缓存为空则查询数据库,然后释放读锁,缓存有数据,则释放读锁

2.Redis 中如何保证缓存与数据库的数据一致性?Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?

缓存穿透,访问了数据库中没有的元素,那么缓存中也一定没有,这时就会访问数据库,不走缓存
缓存击穿,某个热点key在大量访问时缓存过期失效,访问到数据库,造成服务器压力
缓存雪崩,多个key同时过期,导致巨量的访问访问了数据库,给数据库造成极大压力

3.Redis String 类型的底层实现是什么?(SDS)

string的数据结构为简单动态字符串(simple dynamic string)加上一些字符集编码的优化

2025-10-06

1.

redis通过set ex nx配合lua脚本的方式实现,set ex nx命令用来设置锁,ex为过期时间,nx判定锁是否存在、存在返回0创建失败,不存在返回1创建成功
lua脚本用来操作解锁,只有锁的持有者可以释放锁

2.

red lock红锁,是分布式锁的一种实现方式,用来解决主从切换时的锁问题,主从加哨兵实现方式下,主从节点切换有可能锁的信息没同步到从节点而被其他节点获取,导致两个客户端操作一个资源导致数据不一致问题。
红锁的实现没有主从,官方推荐最少开五个实例,当客户端获取锁时,五个实例分别获取锁,超过半数成功(3个)则获取锁成功,即便有实例宕机,4个实例也足够实现超过半数的3个实例,但是这样的实现方式消耗较大,不如主从加哨兵的性能

3.

业务未执行完,锁已过期
主从同步的锁问题
时钟偏移问题
网络分区问题
单点故障问题
锁的可重入性问题

2025-10-07

1.

持久化机制有rdb和aof
rdb是数据快照,把某一时间点的数据记录下来,适合做数据恢复,数据恢复快,但会丢失上次快照以后的数据
aof是redis的日志文件,记录每一条执行,aof的日志会进行重写压缩,避免文件过大,aof恢复较慢,最多只会丢失1秒的数据

2.

redis的主从复制是先进行全量复制,之后建立长连接,进行增量复制,如果期间有断线的节点,redis会有一个缓冲区,只要没超过缓冲区就可以继续增量复制,如果覆盖了缓冲区内容就需要全量复制了

3.

有定期删除和惰性删除
定期删除会在一定时间后扫描一部分键,检测到过期的键会删除
惰性删除会在使用某个键时检测是否过期,如果某个键已过期但一直没使用,会有内存泄漏的风险

内存淘汰策略
noeviction 不删除
volatile-lru 最近最少使用,扫描有过期时间的key
volatile-lfu 最少使用频率,扫描有过期时间的key
volatile-random 随机淘汰,扫描有过期时间的key
allkeys-lru 最近最少使用,扫描全部的key
allkeys-lfu 最少使用频率,扫描全部的key
allkeys-random 随机淘汰,扫描全部的key
allkeys-ttl 存活时间最短的,扫描全部的key

————————————————————————————————————————————————————————————

要了解的其他面试相关的知识点
AI
Prompt提示词工程
结构化输出
流式输出
记忆化存储
持久化存储
Advisor顾问(拦截器)
RAG检索增强生成
Tool Calling 工具调用
MCP

开发一个自然语言转sql的智能体工具