BIGO 后端一面:幂等、并发、深分页与 Top K
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 异步写入丢失后怎样补偿?
- 接口幂等有哪些实现方式,余额更新和流水写入如何保证一致?
- 没有现成流水号时,如何定义稳定的幂等键?
- synchronized 的锁状态如何变化,软引用和弱引用有什么区别?
- TreeSet 与 HashSet 有什么区别,JIT 有什么作用?
- volatile 能保证什么,不能保证什么?
- 线程池提交任务经历什么流程,execute 与 submit 有什么区别?
- 怎样估算线程数,使用 Executors 工厂时要注意哪些队列和线程上限?
- SimpleDateFormat 为什么不适合多线程共享,怎样正确格式化日期?
- 死锁的必要条件是什么,如何排查?
- Spring AOP 如何实现,同类内部调用绕过代理时怎样调整?
- LIMIT 的参数是什么,深分页如何优化?
- 覆盖索引有什么作用,哪些条件影响索引利用?
- InnoDB 的快照读和当前读有什么区别?
- Kafka 的 acks 各取值代表什么,可靠性还依赖哪些配置?
- Cookie、Session 和 Token 有什么关系,JWT 载荷默认加密吗?
- CLOSE_WAIT 与 TIME_WAIT 分别是什么,大量出现时怎样排查?
- 一百亿个整数中怎样找出最大的 100 个数?
- 怎样求最大连续子数组和?
《参考解析》
余额与流水
在同一个数据库中,可以把请求去重记录、余额变化和流水写入放进同一事务。稳定的业务请求编号加唯一约束负责挡住重复动作,事务负责整体提交或回滚。缺少编号时先定义业务动作身份,不能用每次重试都新生成的随机值冒充幂等键。
海量 Top K
只维护大小为 100 的最小堆。每个新数先与堆顶比较,较大时替换并调整堆,时间 O(n log 100),额外空间 O(100)。如果要求最大的 100 个不同数,还要明确去重规则。数据分片时各片先求局部 Top K,再合并候选。
最大子数组和
维护以当前位置结尾的最佳和,决定把当前数接到前一段后面,还是从当前数重新开始;同时更新全局最大值。初始值取首元素,才能正确处理全为负数的输入,不能默认空子数组是合法答案。
连接状态
CLOSE_WAIT 表示已收到对端关闭,通常需要查本端是否漏掉关闭或卡在处理逻辑;TIME_WAIT 通常由主动关闭端进入,用来处理连接结束后的报文边界问题。看到数量多时先结合连接创建速率和资源耗用判断,不要直接把所有等待状态都当成泄漏。