Skip to content

SystemDesign 面试专题手册

💡 本章节共收录 5831 道面试真题,建议每天复习 10-20 题。


Q1: 在网络不稳定的情况下,如何对文件分片进行校验以保证完整性和顺序?

【核心解析】 使用哈希校验(如MD5、SHA)验证分片完整性;通过分片序号或位图保证顺序;采用前向纠错(FEC)机制恢复丢失分片;结合HTTP3的QUIC协议减少重传;客户端与服务端协商校验策略。


Q2: 项目拷打:RAG检索流程,文件上传如何从8s优化到2s?为什么采用两阶段检索?为什么使用ES?WebSocket vs SSE?

【核心解析】 两阶段检索减少候选集;ES倒排索引加速;WebSocket全双工,SSE单向流;文件上传优化:分片、压缩、异步处理


Q3: 如何设计一个文件上传接口?

【核心解析】 考虑文件大小限制、类型校验、存储方式(本地或OSS)、断点续传、分片上传;使用multipart/form-data;生成唯一文件名;返回访问URL。


Q4: RAG(检索增强生成)的工作流分哪几步?

【核心解析】 索引阶段:文档切分、向量化、存储;检索阶段:用户查询向量化、相似度检索;生成阶段:检索结果与查询拼接、输入LLM生成回答;可结合重排序优化;支持多轮对话;知识库更新策略


Q5: 如何自测排查接口全链路?

【核心解析】 单元测试;集成测试;链路追踪(如Jaeger);日志监控;模拟异常场景;压力测试;全链路压测;接口文档与契约测试


Q6: 从工程或技术角度来看,内容生成类和智能体(Chatbot,基于纯文本的大模型)有什么区别?

【核心解析】 内容生成类:一次性生成完整内容,无状态;智能体:多轮交互,有状态管理;智能体需维护对话历史;智能体可调用工具;智能体需规划与推理;内容生成类更注重质量;智能体更注重交互流程


Q7: 即梦和Sora2在接入和使用上有什么区别?

【核心解析】 即梦:文生图/视频,API调用;Sora2:文生视频,更复杂;Sora2需处理长视频生成;即梦响应更快;Sora2对算力要求更高;接入方式可能不同;使用场景差异


Q8: Sora2的生成效果有问题吗?接Sora2的时候有没有遇到什么问题?

【核心解析】 效果问题:物理规律不准确、细节模糊、时长限制;接入问题:API稳定性、延迟高、成本高、内容审核、模型版本迭代


Q9: 介绍策略引擎的整体思路,以及你做了哪些改造?

【核心解析】 整体思路:规则配置、决策树、评分卡、实时计算;改造:引入规则热更新、优化执行效率、支持复杂条件、增加监控告警、可视化配置


Q10: 关于用户是否访问过小红书上的广告,是如何收集数据的?

【核心解析】 前端埋点(曝光、点击);后端日志记录;用户行为事件上报;数据清洗与ETL;存储到数据仓库;关联广告ID和用户ID;注意隐私合规


Q11: 从工程角度来看,如何监控特征质量(覆盖率:KV存储数据/广告点击流数据)?

【核心解析】 定义覆盖率指标;实时监控缺失率;数据质量校验规则;异常告警;定期数据对账;采样验证;可视化看板


Q12: 讲一下动态限流如何实现的,RateLimiter的原理是什么?

【核心解析】 动态限流:根据系统负载动态调整限流阈值;实现方式:令牌桶、漏桶、滑动窗口;RateLimiter原理:基于令牌桶算法,以固定速率生成令牌,请求需获取令牌才能执行;支持预热和突发处理。


Q13: 设计一个日志系统,支持控制台输出和文件输出,如何实现工厂模式?

【核心解析】 定义抽象基类LogSink,包含虚函数write;派生类ConsoleSink和FileSink实现具体写入逻辑;使用SinkFactory根据类型字符串创建对应的Sink对象,返回unique_ptr。


Q14: 如何设计一个统计页面独立访客(UV)和页面点击量(PV)的系统?

【核心解析】 UV使用Redis的Set存储,key为页面URL,value为user_id集合,保证唯一性;PV使用Redis的String,key为页面URL,value为计数,每次访问自增。


Q15: 如何保证缓存与数据库的一致性?请以文章热点数据为例说明。

【核心解析】 先更新数据库,再将变更信息投递到消息队列;消费者异步删除缓存;下次读取时重新加载缓存;保证最终一致性。


Q16: 如何设计一个高并发的点赞系统?如果必须将点赞数据持久化到数据库,如何优化?

【核心解析】 点赞数先保存在Redis中,利用RDB和AOF持久化;若需写入数据库,采用异步方式:点赞请求入消息队列(如RabbitMQ或Kafka),实现削峰限流;消费者批量拉取(如一次100条),聚合相同帖子的点赞请求,减少数据库写入次数。


Q17: 用户反馈后台系统一个查询列表接口响应很慢,可能的原因有哪些?如何定位和解决?

【核心解析】 网络层:网络延迟、带宽不足;应用层:服务器线程堆栈分析(jstack)、内存分析(jmap)排查GC问题;数据库层:开启慢查询日志,用explain分析SQL,检查索引使用情况,优化SQL或分批次查询;缓存层:检查缓存失效或重建,使用Lua脚本保证Redis操作原子性;事前压测:使用Prometheus+Grafana进行链路追踪。


Q18: 请介绍一个在线平台的数据流转过程。

【核心解析】 设备状态上报进入接入服务,经协议校验和字段标准化后放入内部消息队列;规则计算模块根据设备类型和规则模板实时判断,触发异常则进入告警链路;原始事件异步写入日志存储和时序数据存储;实时状态查询优先走缓存和聚合结果,历史轨迹或异常记录走落盘数据;设计核心是分离实时展示、告警触发、历史追溯三条路径,避免慢路径影响其他。


Q19: 加载数据IO卡顿优化

【核心解析】 使用缓存(本地缓存如Caffeine、分布式缓存如Redis);异步IO(NIO、AIO);批量读写减少IO次数;压缩数据减少传输量;使用SSD;调整系统参数(如文件系统缓存、IO调度器)。


Q20: 编译阶段优化多类多函数切换卡顿

【核心解析】 使用增量编译;模块化设计,减少依赖;预编译头文件;链接时优化(LTO);使用更快的编译器(如Ninja);代码生成优化(如模板实例化控制)。


Q21: 大模型接入、调优、原理及幻觉解决

【核心解析】 接入:API调用或本地部署;调优:微调(Fine-tuning)、Prompt Engineering、RAG(检索增强生成);原理:Transformer架构、自注意力机制;幻觉解决:知识库约束、事实核查、温度参数调低、few-shot示例。


Q22: 如何替换LLM及处理大量数据

【核心解析】 替换LLM:抽象接口,适配不同模型API;数据量大:分片处理、流式处理、使用向量数据库存储和检索;数据预处理:清洗、去重、分块。


Q23: C++项目性能调优

【核心解析】 使用性能分析工具(perf、gprof、Valgrind);优化热点代码:减少拷贝、使用移动语义、内联小函数;数据结构选择:map vs unordered_map;内存池;并行计算(OpenMP、TBB)。


Q24: 高并发场景下如何设计秒杀系统?

【核心解析】 前端限流(按钮置灰、验证码);后端限流(令牌桶、漏桶);削峰填谷(消息队列);库存预热(Redis预减库存);数据库乐观锁;异步下单;防重复提交(幂等性)。


Q25: 用户点击下单后,库存是什么时候扣的?如何设计库存扣减方案?

【核心解析】 常见方案:下单时预扣库存(防止超卖)、支付成功后再扣减;分布式场景需考虑原子性,可使用Redis缓存库存+数据库最终一致性;高并发下需防重扣,结合乐观锁或分布式锁。


Q26: 你对自己未来 3 年的职业规划是什么?为什么选择滴滴?

【核心解析】 短期提升技术深度,掌握核心系统设计;中期成为技术骨干,参与复杂项目;长期向架构师或技术管理发展;选择滴滴因其业务规模大、技术挑战多、能快速成长。


Q27: 给定一个4GB大小的文件,如何判断访问量最高的十个URL?

【核心解析】 分治思想:将大文件分割成小文件,使用哈希映射到不同文件;每个小文件内用哈希表统计URL频率;维护大小为10的小顶堆获取Top10。


Q28: 项目中最困难的部分是什么?如何解决的?

【核心解析】 描述具体技术挑战,如性能优化、分布式一致性、高并发等;解决思路:分析瓶颈、设计优化方案、测试验证。


Q29: 爬虫抓取文件,10个一批并发访问,用固定线程池实现。如果用消息队列如何做?滑动窗口是什么?如果有一万行任务,处理时间不同,该怎么办?

【核心解析】 消息队列:生产者将任务放入队列,消费者从队列拉取;滑动窗口:控制并发数量,窗口内任务数固定;处理时间不同:使用线程池+任务队列,或调整滑动窗口大小。


Q30: 怎么设计表容量?

【核心解析】 根据业务预估数据量,考虑增长趋势;设计合理的字段类型,使用分库分表;监控实际使用情况。


Q31: 场景:类似12306买车票,如何保证多个请求不会发生超卖?

【核心解析】 使用数据库行锁或乐观锁;Redis分布式锁(如Redlock);库存预扣减+最终一致性;消息队列异步处理;限流和排队;数据库事务隔离级别(可重复读)。


Q32: 一个大型项目,你会怎么对代码分层?

【核心解析】 常见分层:Controller、Service、Repository;领域驱动设计(DDD);接口隔离;依赖注入;模块化。


Q33: Facebook数据定时任务异步拉取轮询处理,定时任务的时间间隔怎么配的,为什么这样定义?

【核心解析】 根据数据更新频率和时效性要求;考虑系统负载;使用指数退避或动态调整;监控任务积压。


Q34: 定时任务异步处理任务的状态机怎么设计的,幂等,高可用怎么保证?

【核心解析】 状态定义:待处理、处理中、成功、失败;幂等通过唯一ID和去重;高可用通过分布式调度(如Quartz)和重试机制;持久化状态。


Q35: 异步任务失败怎么处理的(哪些可以重试哪些降级)?

【核心解析】 可重试:网络超时、临时错误;降级:非核心功能、数据不一致容忍;重试策略:指数退避、最大次数;记录失败原因。


Q36: 大文件分片上传如何实现?

【核心解析】 前端将文件切分为固定大小的分片;每个分片生成唯一标识(如MD5);后端接收分片并暂存;所有分片上传完成后,后端合并分片;支持断点续传和并发上传;需处理分片顺序和完整性校验;可使用Redis记录上传进度。


Q37: JMeter压测主要看哪些数据?QPS是什么?

【核心解析】 QPS(每秒查询数)、响应时间、吞吐量、错误率、CPU/内存使用率;QPS衡量系统处理能力


Q38: 请解释令牌桶和漏桶算法的原理、实现方式及适用场景。

【核心解析】 令牌桶:以固定速率生成令牌,请求需获取令牌才能通过,允许突发流量;漏桶:请求以固定速率流出,超出则丢弃或排队,平滑流量;实现:令牌桶可用定时器+计数器,漏桶可用队列+定时器;适用场景:令牌桶适合允许突发,漏桶适合严格限流。


Q39: 怎么理解规则树?请具体讲一下规则树的流程。

【核心解析】 规则树是一种决策树结构,用于复杂规则匹配;流程:从根节点开始,根据条件分支,最终到达叶子节点得到结果;应用场景:风控、推荐、策略引擎


Q40: 请描述你最近解决的一个技术问题,包括如何发现问题、分析原因、制定方案并最终解决的过程。

【核心解析】 发现问题:通过监控告警或用户反馈;分析原因:日志排查、代码审查、性能分析;制定方案:设计多种候选方案并评估;解决过程:实施、验证、优化;总结:文档化并分享经验。


Q41: 请介绍MCP(Model Context Protocol)工具的概念,以及tool、MCP、skill之间的关系。

【核心解析】 MCP是模型上下文协议,用于标准化AI模型与外部工具的交互;tool是具体功能接口,如搜索、计算;MCP定义了tool的发现、调用和结果返回协议;skill是组合多个tool完成复杂任务的流程;开发MCP工具需实现协议接口,注册工具描述


Q42: 如何用4GB内存对64GB数据进行排序?

【核心解析】 外部排序:将数据分块,每块排序后写入磁盘;使用多路归并(如败者树)合并有序块;内存中维护一个最小堆,每次从各块读取一个元素;注意磁盘IO优化(预读、缓冲);可考虑使用MapReduce(Hadoop)或Spark。


Q43: 如果线上接口延迟突然变高,你会怎么排查?

【核心解析】 查看监控指标(CPU、内存、IO、网络、GC);分析慢查询日志、接口调用链;检查是否有突发流量、死锁、资源竞争;排查外部依赖(数据库、缓存、下游服务)是否异常;使用性能分析工具(如 Arthas、JProfiler)定位热点代码。


Q44: 混合检索 RRF 加权参数 K 怎么调?

【核心解析】 RRF(Reciprocal Rank Fusion)融合多个排序结果;参数 K 控制平滑程度,通常取 60;K 越小,高排名文档权重越大;通过交叉验证或网格搜索调整 K;根据业务场景和指标(如 NDCG、MAP)选择最优 K。


Q45: 设计一个Java程序,输入充电时段和价格配置、充电订单信息,计算并输出该订单的总费用。

【核心解析】 定义PriceRule类包含时段和价格;定义充电订单类包含充电起止时间;计算订单覆盖的时段;根据时段匹配价格规则;处理跨时段费用累加;考虑边界情况如跨天;输出总费用


Q46: 分层记忆机制怎么实现?

【核心解析】 将数据按访问频率分层;热数据存内存;温数据存SSD;冷数据存磁盘;使用LRU等淘汰策略;缓存预热;数据一致性保证;监控和动态调整


Q47: 反诈预警怎么实现?

【核心解析】 基于规则引擎;机器学习模型;实时数据流处理;特征提取如交易频率、金额;异常检测;多维度关联分析;告警和人工审核


Q48: skill和混合检索如何实现?

【核心解析】 skill检索:基于关键词或语义匹配;混合检索:结合全文检索和向量检索;使用Elasticsearch等搜索引擎;向量数据库如Milvus;融合排序算法;考虑性能与准确性平衡


Q49: 如果让你设计一个后端的新增或查询接口,你会考虑哪些方面?

【核心解析】 接口安全性:鉴权、防篡改;参数校验;幂等性设计;性能:缓存、索引;异常处理;日志记录;版本控制;文档;限流;数据一致性


Q50: 接口防抖有哪些解决方案?

【核心解析】 前端防抖:按钮禁用;后端防抖:基于Token或时间戳;使用分布式锁;幂等性设计;唯一请求ID;数据库唯一约束;缓存标记


Q51: 如果某个接口突然变慢了,你会怎么去排查?

【核心解析】 先确认是否所有接口都慢还是单个;检查服务器资源(CPU、内存、IO);查看慢SQL和数据库连接池;分析日志和链路追踪;检查外部依赖(第三方API、缓存);代码层面:循环、锁、序列化等


Q52: 接口优化有哪些方式?

【核心解析】 数据库层面:索引优化、SQL优化、分库分表;缓存:Redis缓存热点数据;异步:消息队列削峰;代码层面:减少循环、批量操作、连接池;架构:CDN、负载均衡、限流熔断


Q53: 你的项目是高并发的,QPS大概是多少?为什么要做分库分表?分库分表后如何实现跨库查询?

【核心解析】 QPS根据项目实际;分库分表原因:单库容量瓶颈、读写性能;跨库查询方案:全局表、冗余、中间件(ShardingSphere)、应用层聚合;考虑分片键选择


Q54: 购票软件如何解决超卖问题?

【核心解析】 数据库乐观锁(版本号)、悲观锁(行锁);Redis原子操作(DECR);消息队列串行化;库存预扣减;最终一致性


Q55: 本地缓存加令牌桶控制频率具体怎么做的?如何往令牌桶里放令牌?如果很多用户岂不是有很多令牌桶,按顺序放会不会很慢?

【核心解析】 每个用户或请求来源维护一个独立的令牌桶;使用定时任务或延迟队列定期向桶中添加令牌;多用户场景下可采用分段锁或无锁算法(如CAS)减少竞争;批量添加令牌可优化性能;考虑使用Redis等分布式缓存实现共享令牌桶


Q56: 大模型的滑动窗口和其他存储上下文的方法你知道哪些?

【核心解析】 滑动窗口:固定大小窗口,丢弃旧token;其他方法:压缩上下文(如KV缓存压缩)、摘要生成、外部存储(向量数据库)、分层记忆(如HuggingFace的Longformer)


Q57: 如何设计一个IP限流方案?移动网络NAT出口下如何避免误伤?

【核心解析】 IP限流可使用令牌桶或漏桶算法;NAT环境下可结合用户ID或Cookie标识;使用更细粒度的限流(如每用户、每API);动态调整阈值或使用白名单。


Q58: 订单数据怎么做持久化?

【核心解析】 使用关系型数据库如MySQL存储订单核心数据;采用分库分表应对高并发;结合缓存如Redis提升读取性能;使用消息队列异步落库;定期备份和归档历史数据。


Q59: 如何设计幂等性的Web API?

【核心解析】 客户端生成唯一请求ID;服务端通过Redis或数据库记录请求ID;处理前检查是否已执行;使用乐观锁或分布式锁防止重复提交;返回相同结果。


Q60: CPU和内存暴涨时如何排查?

【核心解析】 使用top、htop查看进程资源占用;jstack分析线程堆栈;jmap导出堆内存快照;分析GC日志;检查代码死循环、内存泄漏、大对象等。


Q61: 在模型评估中,使用20%数据作为测试集,人工评判准确率的做法是否合理?请说明原因及替代方案。

【核心解析】 合理但需注意:测试集应独立于训练集;人工评判可验证模型效果但成本高;替代方案:交叉验证、自动化评估指标(如准确率、召回率)。


Q62: 商品秒杀系统设计相关问题。

【核心解析】 秒杀特点:高并发、库存有限、瞬间流量;方案:前端限流、CDN静态化、页面缓存;后端:Redis预减库存、消息队列异步下单、数据库乐观锁;分布式锁(Redisson)控制库存;限流算法(令牌桶、漏桶);降级、熔断。


Q63: 请求全链路剖析:一次会话请求,从用户发出一句话,到最终模型返回,中间经历了什么样的过程?

【核心解析】 用户输入经前端预处理(如分词、纠错);请求到达网关,进行路由、限流、鉴权;进入业务服务,进行上下文构建、提示词组装;调用大模型API或本地模型推理;模型返回结果后,经后处理(如过滤、格式化)返回给用户;全链路涉及负载均衡、缓存、日志、监控等。


Q64: 概念辨析1:提示词工程(Prompt Engineering)和上下文工程(Context Engineering)的区别是什么?

【核心解析】 提示词工程侧重于设计输入提示以引导模型输出,包括指令、示例、格式等;上下文工程侧重于管理和利用对话历史、用户信息、外部知识等上下文数据;提示词工程是上下文工程的一部分;上下文工程更关注数据获取、存储、检索和动态构建。


Q65: 概念辨析2:Skill和Tool / Function Call的区别是什么?

【核心解析】 Skill是更高层次的抽象,封装了完成特定任务的能力,可能包含多个Tool调用;Tool/Function Call是具体的函数或API调用,执行单一操作;Skill可组合多个Tool,并包含逻辑控制(如条件、循环);Skill通常有状态管理,Tool无状态。


Q66: 底层替代逻辑拷问:Skill是怎么做到能够去替代Function Call的?

【核心解析】 Skill通过封装多个Function Call实现复杂任务;Skill内部维护状态和流程控制,可动态选择调用哪个Function;Skill支持参数传递和结果聚合;通过注册机制,模型可识别并调用Skill;Skill可包含错误处理和回退逻辑。


Q67: 除了库的建设和分片,RAG模块还有什么其他优化吗?

【核心解析】 优化包括:文档预处理(分块策略、元数据提取);索引优化(向量索引如HNSW、量化);检索增强(混合检索、重排序);缓存机制(减少重复计算);动态上下文窗口;查询改写和扩展;多模态支持。


Q68: 如何设计日志与配置系统?

【核心解析】 日志系统:分级(DEBUG、INFO、WARN、ERROR)、异步写入、滚动策略、格式化;配置系统:配置文件格式(INI、JSON、XML)、热加载、优先级、默认值;模块化设计;线程安全;性能考虑。


Q69: 视频直播中,高并发场景下的弹幕发送和显示如何设计?

【核心解析】 弹幕发送:使用消息队列削峰填谷;弹幕存储:Redis有序集合或时序数据库;弹幕分发:WebSocket推送或轮询;弹幕渲染:前端虚拟列表或Canvas;限流:用户级别限流。


Q70: 如何设计高并发场景下的Token校验机制,避免每次查数据库?

【核心解析】 使用JWT无状态Token;本地缓存Token黑名单;Redis缓存Token信息;定期刷新缓存;异步批量校验;限流降级


Q71: RAG作为知识库检索,和把知识库放到ES上让模型调用MCP接口有什么区别?

【核心解析】 RAG结合检索与生成,利用向量相似度检索相关文档片段;ES基于倒排索引进行关键词匹配;RAG能理解语义,ES依赖精确匹配;RAG通常使用嵌入模型,ES使用分词和TF-IDF/BM25;RAG适合开放域问答,ES适合结构化搜索;RAG可动态更新知识,ES索引更新成本高;MCP接口是模型调用外部工具,RAG是内部检索


Q72: 若自己实现包含ES检索和向量检索的搜索接口,和RAG有什么区别?

【核心解析】 ES检索基于关键词,向量检索基于语义相似度;混合搜索结合两者优势;RAG通常只使用向量检索;自己实现可灵活调整权重和融合策略;RAG更注重生成质量,搜索接口注重召回率;RAG需要生成模型,搜索接口只需检索;RAG端到端,自己实现可模块化


Q73: 请设计一个环形消息队列,使用 vector<char> 模拟连续内存,两个指针维护读写头,重点说明思路和实现细节。

【核心解析】 使用 vector<char> 作为底层存储;两个指针:读指针和写指针;写指针追上读指针表示满,读指针追上写指针表示空;支持单生产者单消费者;注意边界条件和指针回绕。


Q74: 设计一个文本生成HTTP接口,请设计请求与返回的关键字段(至少包含:输入上下文、模型参数、输出结构、错误码,以及用于追踪的一次调用ID)。另外,你会如何支持流式(Streaming)返回?

【核心解析】 请求字段:input_context(输入文本)、model_params(如temperature、max_tokens)、request_id(追踪ID);返回字段:output(生成文本)、error_code(0成功,非0错误)、request_id;流式返回使用HTTP分块传输编码(Transfer-Encoding: chunked)或Server-Sent Events(SSE),逐块返回生成内容。


Q75: 页面置换算法有哪些?各有什么优缺点?

【核心解析】 FIFO(先进先出)、LRU(最近最少使用)、LFU(最不经常使用)、Clock算法;LRU性能较好但实现复杂,FIFO简单但可能抖动。


Q76: 有100000个数据需要调用API处理,但处理方QPS不固定,如何设计发送策略?

【核心解析】 参考TCP拥塞控制:慢启动、拥塞避免、快速重传;动态调整发送窗口大小;使用滑动窗口控制并发数;监控响应时间和错误率;使用消息队列缓冲。


Q77: 设计一个微信红包系统:10个红包,总额20元,需要考虑哪些问题?如何防止超发?如何保证总额恰好为20元?红包过期如何处理?请给出优化方案。

【核心解析】 防止超发:使用预生成随机金额数组和计数器,用户按顺序抢;保证总额:预设数组总和为20;优化:使用队列存储红包,计数器用Redis INCR命令;过期处理:定时任务或Redis过期回调,将未抢金额退回。


Q78: 如何设计高并发的数据查询接口?请结合CompletableFuture异步编排、过滤排序、Redis分布式锁和分库分表等策略进行说明。

【核心解析】 使用CompletableFuture异步调用提升并发能力;通过流式操作过滤违规内容并综合排序;利用Redis分布式锁实现限流保护;采用分库分表解决单库性能瓶颈。


Q79: 如何设计一个评论系统的热度排序算法?请给出综合排序公式。

【核心解析】 综合排序公式S = w1基础热度 + w2个性化分数 + w3热度潜力 + w4时间衰减;时间衰减使用指数函数;需考虑权重调整。


Q80: 如何设计一个高并发评论系统的整体架构?

【核心解析】 混合使用关系型数据库(MySQL)和NoSQL(Redis);Redis有序集合存储热度排序,本地缓存减少Redis压力;热度计算采用异步计算+定期更新,公式为hot_score = log10(like_count×2 + reply_count) + (create_time - 固定基点时间戳)/衰减因子;评论写入同步数据库并异步MQ更新缓存;点赞/回复通过MQ异步重算热度;分页优化:热度排序用ZREVRANGE,时间排序用游标分页;缓存击穿用分布式锁保护;最终一致性通过MQ保证。


Q81: 核心接口P99延迟<100ms,请给出数据存储、缓存、热度计算与更新、分页查询的完整设计方案,并解决高并发写和‘深分页’的性能问题。

【核心解析】 存储:分库分表MySQL或TiDB,以video_id分片;缓存:Redis缓存热数据,使用ZSet存储评论ID和热度分;热度计算:基于点赞数、回复数、时间衰减,异步更新;分页查询:使用游标分页(cursor-based)避免深分页;高并发写:消息队列削峰,批量写入;缓存更新:使用LRU或LFU淘汰冷数据。


Q82: 布隆过滤器的原理是什么?除了布隆过滤器,还有哪些方案可以解决缓存穿透问题?

【核心解析】 布隆过滤器使用位数组和多个哈希函数判断元素是否存在,存在误判但节省空间;其他方案包括缓存空对象、使用Redis的bitmap、布谷鸟过滤器、布隆过滤器的变种等。


Q83: 请描述你设计过的系统架构,按数据流分层说明,并指出可能的瓶颈。

【核心解析】 入口层:网关、鉴权、限流;业务层:请求编排、规则判断、状态推进;异步层:MQ解耦高峰流量和补偿任务;存储层:MySQL、Redis、检索索引、对象存储;旁路:监控、日志、配置中心、任务调度;常见瓶颈:检索召回抖动、缓存热点倾斜、下游依赖变慢、消费积压、数据库回查索引失效。


Q84: 请解释RAG(检索增强生成)的原理及其在系统中的角色。

【核心解析】 RAG将外部知识注入生成过程,降低模型参数记忆的不确定性;流程:文档清洗、切块、向量化、索引构建、召回、重排、上下文组装、答案生成;落地时作为知识访问层,而非答案本身;好的RAG系统让模型在证据边界内作答,无证据时拒答。


Q85: 请解释冷热数据分离的概念,并描述如何设计一个定时任务系统来处理冷热数据。

【核心解析】 冷热数据:热数据是近期频繁访问的数据(如近2小时),冷数据是历史数据;热数据存入Redis,使用适当数据结构(如有序集合)检查是否到点执行;冷数据存入数据库,由迁移服务定期生成后续任务;定时任务每小时/每分钟执行,只关注热数据。


Q86: 当任务量巨大时,如何设计分库分表方案?请结合具体组件和阈值说明。

【核心解析】 调研美团、阿里组件,但自研分库分表能力;治理服务监控表大小,超过400万(阿里推荐500万,取缓冲值)时重新分表;新任务写入新表,旧表保留执行记录;冷数据归档,热数据使用Elasticsearch解决大表查询;增加worker机器提升并行处理能力。


Q87: 项目的权限设计(用户、管理员、商户等)以及相关的数据库表设计是怎样的?

【核心解析】 基于RBAC模型:用户表、角色表、权限表、用户角色关联表、角色权限关联表;用户与角色多对多,角色与权限多对多


Q88: 在项目中哪些地方使用了Redis缓存?

【核心解析】 热点数据缓存、分布式锁、计数器、会话管理、排行榜、消息队列


Q89: 向量数据库的作用是什么,它和普通检索系统的边界在哪里?

【核心解析】 向量数据库主要解决语义相似检索问题,适合处理问法不稳定、表达多样但语义相近的场景;将文本映射为高维向量,使用ANN索引进行近似最近邻搜索;不是全文检索的替代品,精确关键词、结构字段过滤、时间约束和强规则查询仍依赖传统倒排索引;实际系统常混合使用向量召回、关键词召回和规则过滤。


Q90: 为什么有些场景会选择多智能体而不是单智能体?

【核心解析】 多智能体适用于任务边界可清晰拆分的情况,如规划、执行、审计、复核等不同职责;拆开后上下文更短,行为更易约束;单智能体链路短、调试简单、状态集中,但多阶段推理加工具调用易导致上下文污染;多智能体的代价包括通信成本、错误放大和治理复杂度;仅在职责边界足够清晰时值得采用。


Q91: 如果让你现场展示项目代码,你会重点讲哪一部分才能体现深度?

【核心解析】 不展示controller或CRUD,选择体现系统复杂度的部分:检索编排层、工具路由、消息幂等消费、缓存一致性控制、任务状态机;这些位置能体现对数据流、故障场景和边界控制的理解;展示时说明实现解决的问题、为何不用更简单方案、上线后踩过的坑。


Q92: 平常主要用什么系统写代码?Windows 和 Linux 分别适合做什么?

【核心解析】 Windows:GUI、IDE 调试、编码兼容性;Linux:网络服务、脚本、构建、系统调用分析;跨平台项目常混合使用


Q93: 你常用过哪些 IDE?分别有什么优缺点?

【核心解析】 Visual Studio:Windows C++ 调试强;VS Code:轻量、插件丰富;Qt Creator:Qt 项目友好;CLion:跨平台 C++;大型工程更关注编译系统等


Q94: 如果 VS 里看到中文正常,但程序运行后界面或控制台乱码,怎么排查?

【核心解析】 确认乱码层:源码编码、编译字面量、控件显示、IO 编码;控制台看代码页;界面看字符串类型;文件看编码和 BOM;统一 UTF-8,显式转码


Q95: 如果不用 Redis 缓存,让你自己实现一个有 TTL 的 K-V 缓存,只能用 Java API,你会怎么设计?

【核心解析】 使用 ConcurrentHashMap 存储键值对;每个值附带过期时间戳;通过后台线程或惰性删除清理过期条目;考虑使用 WeakHashMap 或软引用防止内存泄漏;实现 put、get、remove 方法;注意线程安全;可扩展为 LRU 等淘汰策略。


Q96: 什么是幂等性?如何实现接口幂等性?

【核心解析】 幂等性指多次执行结果一致;常见实现:唯一索引、Token 机制、乐观锁、去重表、状态机;适用于支付、订单等场景;需考虑并发和分布式环境。


Q97: 在 AI 全栈开发中,文档分片后向量库中的文档数量如何确定?为什么选择这种方案?

【核心解析】 文档分片数量取决于文档大小、分片策略(如按段落、按固定长度)以及向量库的存储和检索性能;需要平衡检索精度和存储成本;选择方案时需考虑业务场景:如 RAG 应用中,分片过小可能导致上下文丢失,过大则检索不精准;通常采用滑动窗口或重叠分片策略。


Q98: 在项目中遇到过哪些挑战?如何解决?

【核心解析】 常见挑战包括高并发、数据一致性、性能瓶颈等;解决思路:分析根因,设计合理方案,如缓存、异步、分库分表、分布式事务等;需要结合具体项目描述。


Q99: 你平时使用什么技术栈?如何看待 AI 工具在开发中的应用?

【核心解析】 技术栈包括 Java、Spring Boot、MySQL、Redis、Kafka 等;AI 工具可提升编码效率、辅助调试、生成文档等;但需注意代码质量和安全性,不能完全依赖。


Q100: 大模型文本生成HTTP接口设计:流式返回(Stream)的具体数据传输设计;错误码如何设计以便前端快速定位?

【核心解析】 流式返回使用Server-Sent Events或Chunked Transfer Encoding;数据格式为JSON Lines或纯文本;错误码设计需分层(如HTTP状态码+业务码);业务码包含模块、错误类型、具体原因;前端根据错误码展示对应提示;考虑超时、断连重试机制


Q101: 限流怎么实现?

【核心解析】 计数器算法;滑动窗口算法;漏桶算法;令牌桶算法;分布式限流(Redis+Lua);限流框架(Sentinel、RateLimiter);应用层限流(Nginx、网关)


Q102: 你项目的各个量化指标介绍一下,并且说明是怎么测量以及怎么提升的。

【核心解析】 指标定义(QPS、延迟、可用性等);测量工具与方法;基线设定;优化策略;效果验证;持续监控


Q103: 实现了节点的持久化和恢复,这个主要解决的问题是什么?

【核心解析】 数据持久性;故障恢复;避免数据丢失;重启后状态重建;一致性保证;性能权衡


Q104: 文档分片的优化策略

【核心解析】 按文档大小或ID范围分片;使用一致性哈希均衡负载;预分片避免热点;动态调整分片数量;结合缓存减少分片查询;监控分片性能并自动迁移


Q105: 请详细描述秒杀场景下完整的系统交互链路。

【核心解析】 用户请求通过CDN/负载均衡到达网关;网关限流(令牌桶/漏桶);业务层校验库存(Redis预减);异步下单(消息队列削峰);数据库扣减库存(乐观锁);生成订单(分布式事务);返回结果(轮询或回调);兜底策略(降级、熔断)。


Q106: 如何保证多级缓存(如本地缓存+Redis)的一致性?

【核心解析】 常见策略:先更新数据库,再删除缓存(Cache Aside Pattern);延迟双删:更新数据库后先删缓存,延迟一段时间再删一次;使用消息队列异步同步缓存;设置合理的缓存过期时间作为兜底;对于强一致性场景,考虑使用分布式锁或读写锁。


Q107: 如何设计一个高性能的分布式锁?会遇到哪些问题?

【核心解析】 基于Redis:使用SET NX EX命令或Redisson;基于ZooKeeper:临时顺序节点+监听;需解决死锁(设置超时时间)、锁误删(使用唯一标识)、可重入(记录线程信息)、性能(分段锁/读写锁);Redlock算法用于多节点Redis集群;注意时钟漂移和网络延迟问题。


Q108: 大文件上传和分片上传是如何实现的?为什么分片上传后需要在MinIO中合并?

【核心解析】 分片上传将文件切分为多个小片,并行上传,提高速度和可靠性;客户端记录分片信息,服务端接收后暂存;所有分片上传完成后,服务端发起合并请求,将分片按顺序合并为完整文件;MinIO作为对象存储,分片存储后需合并以提供完整文件访问;合并可在服务端或MinIO侧通过组合操作实现。


Q109: 如何用随机数估算圆周率?

【核心解析】 蒙特卡洛方法;在正方形内随机投点,统计落在内切圆内的比例;比例乘以4即为π的近似值;随机数越多,结果越精确。