Mysql

Mysql 的事务隔离级别有哪些?

给定 MYSQL 的情景:通过非主键列更新数据时加锁的流程。

一列主键 a,一列 b,一列 c,通过 b 读出五行 c 的数据需要进行几次磁盘 IO?

索引用什么数据结构?

索引设计原则及优化手段有哪些?

B+ 树的优势是什么?为什么不用 B 树?

三大引擎(MyISAM, InnoDB 等)讲一下,各自的优势和区别是什么?

NoSQL 与 SQL 的区别?

数据库优化

对于高并发环境下数据库的优化都有哪些?

缓存、分库分表、悲观锁乐观锁和队列

为什么会引起索引失效?最左前缀法则?

从 b+ 树的角度去讲一讲,如果插入节点的时候达到了页上限,树结构怎么调整的?

乐观锁和悲观锁的区别是什么?

数据库的锁都有什么类型?

介绍一下行级锁和表级锁。

给出一个使用表级锁的场景例子。

在更新没有索引的非主键列时,加锁的流程是什么?

MySQL 聚簇与非聚簇索引的区别是什么?

联合索引的具体结构是什么?给定一个 SQL 语句,能否命中联合索引 (a,b,c)?

1
select * from order where a=1 and c>2 order by b

行锁、表锁、间隙锁的区别是什么?给出一个 SQL 语句,问会加上什么锁?

行锁什么时候会升级?

索引结构是什么?

MVCC(多版本并发控制)的工作原理是什么?

Redis

Redis 为什么快?

基于内存、单线程、key-value 而非传统的关系型数据库

还有其他让 Redis 快速的原因么?

基于事件的 reactor 模型加上 I/O 部分的多线程模型

Redis 的 RDB 持久化指令 BGSAVE 操作是 fork 一个子进程进行持久化的,为什么不创建一个子线程完成持久化?

看你用到了 redis,如果是多主节点,分布在不同的机房,同步规则是啥?

写入的时候是只写最近机房的集群吗?其他机房集群有写入功能吗?还是只是读取?

讲解 Redis 的架构(单 Reactor 单进程)。

Redis 为什么快?讲解不同版本的架构。

Redis 集群与哨兵模式的工作原理是什么?

消息队列

消息队列有什么作用?

如果使用消息队列怎么解决返回消息同步性的问题?

网络编程

TCP 和 UDP 的区别是什么?

TCP 握手和挥手过程中的 TIME_WAIT 和 CLOSE_WAIT 分别在哪个阶段?

epoll 原理是什么?

TCP 四次挥手的状态有哪些?

I/O 多路复用:select、poll、epoll 的区别是什么?

操作系统

操作系统的用户态和内核态有什么区别?

除了 IO 操作什么时候会访问内核态?

匿名管道和文件管道的区别?

fork 的时候是否会创建 fd?

进程间通信方式有哪些?哪个比较快?共享内存的方式在哪里见到过?不同主机之间一般是怎么通信的?

Linux 内存模型是怎样的?malloc 做了什么?

堆区和栈区的作用是什么?

多线程同步机制有哪些?

进程、线程、协程的区别是什么?

I/O 模型有哪些?

提到 Reactor 和 Proactor 模式。

场景题:

电商下单策略,在抢购情景下如何实现数据库操作?(针对一件商品和一千件商品的不同策略)

在抢购情景下,你会用什么方法实现数据库操作?

如果有两个不同的商品抢购场景(一件商品和一千件商品),你会怎么设计策略?

设计一个计数系统,比如统计一个文章的点赞量,转发量,收藏数。怎么设计这个系统,怎么能保证高并发的数据查询,怎么能保证系统的健壮性

数据库方面考虑索引设计,分表设计,事务方面考虑下,缓存方面考虑一些数据结构帮助节省空间,比如用 bitmap 之类的,然后缓存和数据库之间的一致性设计,还有缓存上的限流检测要考虑下,高并发下缓存中的分布式锁怎么设计,然后 mq 可以怎么用

场景题:设计一个广告收费系统,考虑到高可用性和流量很大的情况。削峰之后 MySQL 压力依然很大怎么办?

场景设计题

设计一个贴吧系统,在某个贴吧做活动期间发帖量很高时应如何处理?

同步处理请求、异步落地、同步缓存发帖信息、异步 MQ 落地。

如果某个贴吧发帖量相当高,二级消费者消费不过来导致阻塞其他用户发帖怎么办?

提案包括:topic 分区、物理隔离各个贴吧;单点限流(用户体验差被否定);改二级消费者的事件驱动型消费为批处理消费,一次消费多条数据增加 MySQL 吞吐量,同时动态扩容消费者。

设计一个微信朋友圈系统,要求能够查看朋友发的所有朋友圈,并按照时间排序。

每个用户维护一个 zset,保存好友的朋友圈内容和时间戳,同时动态维护这个 zset。当有人发布新朋友圈时,更新其所有好友的 zset。

如果一个人的朋友非常多,一次性更新大量 zset 如何保证全部更新成功或失败?

用户发布朋友圈时不直接更新 Redis,而是先落地数据库,同时发送异步消息通过 MQ 机制更新 Redis,依赖 MQ 的重试机制确保数据一致性。

如何实现幂等性?

利用 zset 的天然幂等特性。

对于类似微博的朋友圈,有很多大 V 用户,他们发布消息时也会异步更新所有关注者吗?

异步更新加主动拉取相结合。对于粉丝量特别大的大 V,不采用异步更新 Redis 的方式,而是在发布朋友圈时主动缓存到 Redis 中。用户浏览朋友圈时,维护一个大 V 的 keyset,用户的 zset 和 keyset 进行归并。

你现在看到的代码考核系统,允许输入任何代码,假设你来维护这套系统,需要考虑什么安全问题;注意它可以提交运行,运行肯定在服务器运行

分布式系统设计

设计一个配置中心的架构,包括哪些模块?如何实现推送和拉取轮询?设计 API 时应考虑哪些方面?

大表治理怎么做?表空洞解决方法是什么?删除大量数据时如何减少 IO 损耗?

Redis 集群如何决定命中哪一个 Redis 节点?集群通信的基本流程是什么?

大 key 问题的解决方案是什么?

服务注册是如何实现的?

微服务的优点和缺点是什么?

使用过哪些分布式组件?

如何缓解写频繁的问题?

回答了构建缓存,进一步提到使用 RocksDB(LSM 树架构的数据库)。

设计 12305(假设为类似铁路售票系统),在分布式高并发场景下,如何处理这么高的并发量?

  • 限流:通过限制单位时间内请求的数量来保护系统。
  • Hash 切片:利用一致性哈希算法对数据和服务进行分区,以分散负载。
  • 分区:数据库分库分表,减少单点压力。
  • 缓存:使用 Redis 等缓存技术减轻数据库负担。

Redis 缓存 MySQL,怎么处理写操作?

需要解决缓存与数据库之间的一致性问题。可以采用写操作直接更新数据库后删除缓存中的对应项,或者使用消息队列异步更新缓存等方式确保数据同步。

怎么处理脚本抢票?

可以通过验证码、图形验证、滑块验证等方式增加抢票难度,防止脚本自动执行;同时结合限流策略和排队机制保证公平性。

怎么处理并发购票?

处理并发购票可以通过多种方式:

  • 使用乐观锁或悲观锁控制对共享资源(如票务库存)的访问。
  • 实现基于版本号或时间戳的 CAS(Compare And Swap)机制避免超卖。
  • 结合分布式锁服务如 Zookeeper 来协调不同实例间的操作顺序。
  • 利用队列机制对购票请求进行排序,确保同一时间内的请求有序处理,避免冲突。

编程题目

代码题 53.最大子数组和

另一棵树的子结构

算法:两两反转链表。

算法:两个 list 求交集,扩展是 list 无限容量的情况怎么办。

手撕 LRU 算法。

实现一个支持 TTL(Time To Live)和支持任意类型值的 K-V 存储数据库。

解决方案包括:map + 自定义 entry + 懒惰删除 + 定期任务 + 线程池。

Java 并发编程

CompletableFuture 在实习中是如何使用的?

线程池的核心参数和任务执行流程是什么?线程是一开始就有的吗?

垃圾回收器相关知识。

非技术问题

当项目中出现同事间争吵时,你会怎么做?

如何看待加班?

如果不喜欢当前工作怎么办?