字节 AI 后端秋招二面:Redis、RAG 与预约系统设计
- 轮次
- 二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 能否做一下自我介绍?
- Java 为什么区分 int 与 Integer,各适合哪些场景?
- HashMap 如何扩容?
- JVM 垃圾回收有哪些流程、算法和回收器?
- Spring IoC 解决什么问题,实际有什么好处?
- AOP 是什么,动态代理怎样实现它?
- Redis 可以解决哪些问题?
- Redis 哈希的底层如何实现?
- Redis 字典怎样处理哈希冲突和渐进式扩容?
- Redis 有哪些持久化方式,AOF、RDB 与混合持久化有什么区别?
- 生成 RDB 会不会阻塞服务,怎样处理生成期间的数据更新?
- Redis 分布式锁如何实现?
- 缓存穿透、击穿、雪崩有什么区别,如何处理?
- 布隆过滤器是什么结构?
- RocketMQ、RabbitMQ 的延迟消息怎样实现?
- RAG 是什么,完整流程如何组织?
- 如何从一千名学生中找出成绩前十名?
- 小顶堆方案的时间复杂度是什么,能否使用快速选择?
- 实习中做了什么,得到哪些成长?
- 小程序预约功能有多少订阅用户,扫一次表耗时多久?
- 大规模直播开播预约功能应如何设计?
- 配置变更追溯方案如何设计和实现?
- 数据库代理中间件中负责了哪些工作?
- 基础服务如何保证可靠性,如何处理并发、幂等、写后读和定时任务竞争?
- 功能发布时采用什么流程,怎样灰度和切流?
- 代码生成器解决什么问题,如何评估生成结果可用?
- 端到端验证如何开展,自动化与人工检查如何分工?
- 回溯到对应阶段重新解析、校验的机制,解决什么问题,如何实现?
- 几段实习方向不同,当时如何选择?
- 如何在旋转有序数组中查找 target,找到返回下标,否则返回 -1?
《参考解析》
RDB 后台生成不等于零停顿
Redis 的后台保存通常通过 fork 创建子进程,由子进程写出快照;父进程继续服务,内存通过写时复制维持快照视图。创建子进程本身仍可能带来停顿,修改大量内存页也会增加内存开销。原帖追问中把它口述成“后台线程”,回答时应区分进程与线程。参见 Redis 持久化文档。
一千人选前十,用容量十的小顶堆
扫描成绩,堆未满就插入;堆满后只让比堆顶更高的成绩替换堆顶。扫描结束得到前十的集合,若需要名次,再对十个结果排序。扫描复杂度 O(N log K),额外空间 O(K)。快速选择也能找出分界点,但需要能访问和交换数组元素,且应说明枢轴策略及最坏情况。
预约系统把登记与通知分开
订阅关系需要唯一约束,避免同一用户重复预约。开播后按分片读取订阅记录,分批投递通知任务,消费端按用户、场次和通知类型做幂等。还要考虑取消预约、过期任务、发送速率和失败重试。单次扫表多久,应来自真实数据量和测量,而不是按题目中的知名主播猜一个数。
RAG 的检索和回答分别验证
文档解析与切分后建立检索索引,查询时找出相关片段,再把片段和问题交给模型生成回答。可以用一组带出处的问题,分别观察相关内容是否被检索到,以及回答是否忠实于片段。检索没命中与命中后答错,是两类不同问题。
布隆过滤器只排除一定不存在的项
插入一个键时,用多个哈希结果定位位数组中的位置并置一;查询时,只要其中一位为零,就能判定未插入过。所有位置都为一时,只能说可能存在,因为不同键可能占用相同位置。普通布隆过滤器不能直接把删除项对应的位置清零,那会影响其他键。用于缓存穿透防护时,还要处理新增数据与过滤器更新的先后顺序。
配置追溯与生成代码验证各有验收点
配置变更记录可以包含变更前后内容、版本、操作人和生效时间,并将某次运行实际使用的配置版本关联起来。这样才能回答“这次故障发生时,用的是哪份配置”,而不只是展示一份修改日志。
代码生成器则应从真实输入样例出发,检查产物能否编译、接口调用是否符合契约、异常分支是否按预期处理。回溯重解析时,保留失败阶段、输入和诊断信息,将问题交回对应阶段修正,并限制无结果的重复循环。这里是答题思路,原帖没有披露实习系统的具体实现。
旋转数组二分先找有序的一半
在元素互不相同的前提下,每次取中点,左右至少一半有序。判断 target 是否落在有序半区的取值范围内,决定保留哪一半,时间复杂度 O(log N)。若允许大量重复元素,仅凭端点可能无法判断有序方向,需要额外收缩边界,最坏会退化到 O(N)。
作者记录的反问反馈是知识广度尚可,回答深度仍需加强;这属于该次面试的反馈,不代表最终录用结果。