字节业务中台一面:八股盛宴,从线程池参数到 Redis 底层
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 讲讲自己的优势和劣势
- 聊家常(秋招进展咋样,周边同学怎么样)
- 讲一下怎么去学习一个技术栈
- 除了技术,平时有看书的习惯吗
- 手撕:前 K 个高频元素
- 计网这块,你在浏览器里输入一个网址到看到渲染出来的页面,网络层面发生了哪些事情?
- TCP 和 UDP 的区别是什么?
- 操作系统有哪些调度算法?
- 进程和线程的区别是什么?
- Java 线程池有哪些核心的参数?
- 一般要怎么去调整线程池的参数?
- 你们机房的机器是几核的?
- 为什么你们多机房写入缓存的线程池要用 LinkedBlockingQueue?
- CAS 是什么?
- MySQL 的 InnoDB 事务(ACID)怎么实现的?
- 单机 MySQL 也要写 binlog 吗?
- redo log 和 undo log 分别负责什么?
- Redis 的持久化机制有哪些?
- Redis 为什么用来做缓存呢?
- Redis 有哪些数据结构?
- zset 底层怎么实现的?
- 你最近一段实习对你成长最大的是什么?
- 你对 AI coding 有没有什么好的实践?
《参考解析》
-
线程池这组题要能把参数和业务对上:
corePoolSize、maxPoolSize、keepAliveTime、workQueue、threadFactory、handler六个参数要说清生效顺序——任务先填核心线程,再进队列,队列满了才扩到最大线程,再满就走拒绝策略。这道面试里真正值钱的是追问:「为什么多机房写入缓存要用LinkedBlockingQueue」考的是队列选择。有界队列能提供背压、避免任务无限堆积把内存吃爆,但参数没配好会频繁触发拒绝;无界队列(LinkedBlockingQueue不传容量)不会拒绝、但会把压力转成延迟和 OOM 风险。回答时要讲清你们的写入速率、能接受的排队深度、以及拒绝后怎么处理(降级、重试、落盘补偿)。 -
CAS 要连 ABA 和自旋代价一起讲:CAS 是「比较并交换」的原子指令,读内存值、与期望值比较、相等才写回,失败不阻塞、由调用方自旋重试,这是乐观锁的典型实现。要主动补两个坑:一是 ABA(值改回原样,CAS 会误判没人动过),用版本号或时间戳解决;二是高竞争下自旋空耗 CPU,且只能保证单个变量的原子性,多变量要么合并成一个对象用
AtomicReference,要么加锁。Java 里对应Unsafe/VarHandle与Atomic*系列。 -
InnoDB 的 ACID 要拆成机制来讲:原子性靠 undo log(回滚时反向补偿),持久性靠 redo log(WAL,先写日志再刷数据页),隔离性靠 MVCC 加锁(读已提交与可重复读分别对应语句级/事务级快照,间隙锁防幻读),一致性是前三条共同保证的结果。redo 和 undo 的分工值得强调:redo 记的是「页上做了什么改动」用于崩溃恢复重放,undo 记的是「怎么把改动撤回去」用于回滚和 MVCC 读历史版本。binlog 是 MySQL Server 层的逻辑日志,主从复制和按时间点恢复靠它;redo 是 InnoDB 层的物理日志。单机也要写 binlog——只要开了
log_bin,归档恢复、审计、变更订阅都用得上,不用主从也可以留。 -
Redis 的定位要落到「快在哪、代价是什么」:它是内存数据库,读写走内存,单线程处理命令避免了锁竞争(新版本网络 IO 已多线程化),所以延迟低、吞吐高。代价是内存贵、容量有限,因此必须配套淘汰策略(如
allkeys-lru)、过期策略(惰性删除 + 定期抽样删除),以及缓存穿透/击穿/雪崩的防护。持久化给两套:RDB 是某一时刻的快照,文件紧凑、恢复快,但两次快照之间断电会丢数据;AOF 记录写命令,可配everysec之类的刷盘策略,丢得少但文件大、恢复慢。生产上常见是两者同时开,用 RDB 做快速恢复、AOF 兜最近一段的数据。 -
数据结构与 zset 底层:常用的是 string、hash、list、set、zset,外加 bitmap、HyperLogLog、geo、stream 这些扩展结构。zset 要能讲到它同时维护一个跳表和一个哈希表——哈希表负责 O(1) 按成员查分数,跳表负责按分数有序范围查询和排名,这是它既能
ZSCORE又能ZRANGE的原因;元素较少且较短时会退化成紧凑的 listpack 存储以省内存。面试官顺着问「为什么不用红黑树/B+ 树」,落点是跳表实现简单、范围遍历友好、并发改造(如无锁)比平衡树容易。 -
浏览器输入网址这题别只背 DNS 和 TCP:按层讲完 DNS 解析、TCP 三次握手、TLS 握手、HTTP 请求与响应、连接复用与队头阻塞,再补上缓存这一层(浏览器缓存、
Cache-Control、CDN 边缘节点),以及服务端侧的网关路由、负载均衡和连接超时排查点。操作系统那两问(调度算法、进程与线程)通常紧跟着问,答进程时落到地址空间、资源拥有与切换开销,答线程时落到共享地址空间与栈私有,别把两者混成一句话。 -
手撕前 K 个高频元素要点出复杂度选择:维护一个大小为 K 的小顶堆,遍历统计频次,堆顶就是第 K 高频的门槛,复杂度
O(n log k),空间O(n)的频次表加O(k)的堆;如果追求线性,可以统计完频次后按「出现次数」做桶排序,从高频桶往下取够 K 个,复杂度O(n)。答题时把两种都点一下、再写其中一种,并主动说清k很小时堆更省空间。 -
行为题要提前备好素材:优势劣势这题别报性格标签,用一件具体的事证明优势(推动过什么、扛过什么坑),劣势选一个真实的、并且能给正在改进的动作。问「怎么学一门技术栈」就讲你的输入输出闭环——看官方文档和源码、写 demo 验证、落到项目、最后写成笔记或分享。「最近一段实习成长最大的是什么」和「AI coding 实践」这两题是面试官在判断你的自驱程度,用具体场景答,别给方法论口号。