大厂后端场景题总结

#秋招面试通关锦囊# 最新的文章有解答思路,优化了排版。
链接:https://www.nowcoder.com/discuss/733322587777888256?sourceSSR=users
1. 淘宝,在你商品的购物车页面,有几个商品,点击商品购物之后点击支付会跳转到第三方页面不管是微信还是支付宝,从你点击支付跳转到支付页面,输入支付码,完成支付之后返回响应的订单列表页面,在这个业务场景中试着想想会有什么问题?架构方面你会怎么设计?
问题总结:
​支付状态同步延迟​(第三方回调不及时,订单状态不一致);
​网络中断或用户中途退出​(支付未完成,订单状态卡在“处理中”);
​重复支付或超时失效​(用户重复操作或支付超时未更新);
​数据一致性风险​(订单、库存、支付系统间状态冲突);
​第三方支付回调失败​(网络抖动或接口异常导致状态丢失)。
架构设计思路:
​异步通知 + 主动查询:用MQ监听第三方支付结果,同时定时任务补偿未确认订单;
​幂等设计:订单ID与支付流水号绑定,防止重复处理;
​分布式事务最终一致性:通过状态机驱动订单流转,结合日志和补偿机制;
​前端兜底:支付完成后强制刷新订单列表,并引导用户手动查询;
​容灾降级:第三方支付异常时,提供延迟跳转或本地订单状态缓存。

2. 大文件小内存,文件内存储的是数字,要求对文件内容进行排序,详细说明每一步干什么?
假设有10GB数字文件,内存1GB:
​分割:生成11个临时文件(每个约0.9GB)。
​内部排序:每个文件排序后保存。
​归并:若系统允许同时打开10个文件,则每次归并10路,两轮完成(10→1)。
​输出:得到最终有序文件,删除临时数据。

3. 在表上新增一个字段时,如果这个表正在进行读写操作,应该如何处理以确保不影响现有操作?
用工具绕过锁表

✅ ​在线DDL:MySQL用ALGORITHM=INPLACE;SQL Server用ONLINE=ON。
✅ ​无锁工具:pt-online-schema-change或gh-ost(影子表同步,秒级切换)。
​代码与数据兼容

⚠️ ​先发代码:应用层兼容新字段(允许NULL/默认值)。
⚠️ ​默认值必填:如DEFAULT 0,避免脏读。
​低风险操作

⏰ ​低峰执行:监控流量,避开业务高峰。
🔄 ​备回滚方案:工具自动备份原表,异常时快速回退。

4. 在Linux命令行敲下一行命令,会进行哪些事情?
Shell解析:处理别名、变量、通配符、重定向和管道。

命令类型判断:检查是内建命令还是外部可执行文件。

创建子进程:通过fork()和exec()加载并执行命令。

执行命令:程序运行,可能调用系统调用与内核交互。

结束与清理:返回状态码,回收资源。

返回Shell:重新进入交互状态,等待下一条命令。

5. 比如说 42 亿个 QQ 号,然后有 10 万行数据。那比如它这个数据量就比较大了,查阅效率比较低。那你要提升查阅效率的话,采用分库的方法,你觉得要怎么分?比如前5万行放到一个库里,然后5万行放到一个库里。这里有个问题,比如说想要查找名字叫做abc的所有账号,可能前五万行外行里边有 10 个,后五万个行里边有 3 个,然后你要查出名字叫abc的用户,你就要查两次?
6. 从前端页面到Java后台再到数据库,有一张表,表存在上百万条数据,从这三个层面,去做一个查询方面的优化,单表查询。
7. 假设现在还有挺多内存,有什么情况还会频繁fullgc?
8. 如何判断语言是面向对象的还是面向过程的?
9. 使用普通的互斥锁实现读写锁
10. 后端项目的集群部署,如果在使用canal同步数据库binlog的时候发生了宕机,从节点的同步方案?
11. 如果服务和mq之前发送消息进行数据同步的过程意外暂停了,如何去排查?
12. 把面试官看成是一个小白的话,如何去给他讲解mysql的作用和底层实现?对比使用文本文件存储
13. 选课,课的人数不能超,人的时间段不能重
14. 设计表的时候,关联表和在一个表中加冗余字段关联各有什么优势
15. 分库分表方案(题目:淘宝购物场景-区分用户订单和商家订单)
16. 库存系统设定(讲到了分为读和写。高并发读的情况下怎么扛住。数据一致性怎么保证。怎么加锁的,锁的粒度在流程中锁了什么?)
17. 遇到内存泄露有什么排查方式
18. 看堆内存溢出的时候会看那些指标?
19. 解决超卖问题的思路
20. 为什么你数据库的ID不用自增ID而是用雪花ID?
21. 单例模式有没有线程安全情况
22. 编写Java程序到到运行经历了什么
23. viloate关键字作用,为什么jvm会指令重排序,我说加快运行速率,为什么可以加快?
24. 防抖和节流如何实现
25. 服务器大量请求超时,怎么排查
26. 栈溢出会对其他进程造成影响吗?
27. 程序是如何在计算机上跑起来的?
28. 需要启动一个线程去完成某一个工作,耗时是不确定的,我需要设置一个超时时间,不管运不运行完都要返回,如何设计呢?
29. 假如mysql和redis使用kafka解耦之后,有一部分失败导致数据不一致怎么办
30. bitmap的作用,及常见使用场景
31. 对于微博成千上万的评论,一个评论可能还会有很多回复,你会如何设计这个评论系统?
32. 业务上 什么情况使用悲观锁,什么情况使用乐观锁?
33. .我用了一个多线程去查多个结果集,主线程使用线程池获取多个结果集,主线程如何知道前面的线程执行完了,并且得到结果集?
34. 你怎么对帖子按照最热进行排行?用户点赞/关注这个三元组(如果数据量很大)怎么存储查询?
35. 1000w url排序,10M内存
36. 一个商品1000万库存,20w秒杀,只用设计减库存环节
37. 怎么快速定位到五分钟内重复登录了两次的QQ号,用什么数据结构。
38. 两个500G的文件存ip地址,给30G内存,求两个文件的交集
39. 设计一个 QPS 一百万的分布式数据库的订单号方案。
40. 我现在有一些海外业务,从国内将数据发送到海外延迟比较大,有没有什么改善方法?
41. 主题里面假如有1万条消息,这个 topic 的 badcase 有 10 个,那我这个1万条消息是怎么分布的?Kafka为什么要有这个 partition 这个概念?消费者是按照 topic 去消费的还是按 position 去消费的?consumer group有了解吗?一个 consumer group 下面有 5 个节点,就比方说刚才那个 topic 下面有十个partition,有五个这个消费节点,它这个五个消费节点是怎么去消费这些 partition?Kafka 它的性能比用 其它mq 那些都要快,那你了解过Kafka 为什么能实现高吞吐量吗?
42. 场景:设计一个网络服务器,现在有【多线程 + 每个线程内部阻塞IO】 和 【单线程 + Epoll】这两种方案
(1)这两种方案在cpu负载,时间效率,内存资源占用这三个方面各有什么特点?
(2)现在有大量的就绪socket需要处理,使用单线程模型有什么问题?该怎么优化?
(3)开放题:如果让你来设计一个网络服务器,你有什么方案?
43. 场景:现在有一天内的大量日志,每条日志记录了用户id, 登陆时间,登出时间 {userid, login_time, logout_time}, 时间单位是秒。
(1)怎么求出一天内的最大在线人数?
(2)怎么求出维持在最大在线人数的最长持续时间?
全部评论
1 回复 分享
发布于 2025-03-15 21:42 上海
mark住这个帖子
点赞 回复 分享
发布于 03-23 13:51 河南
mark
点赞 回复 分享
发布于 2025-11-09 13:37 浙江
mark住这个帖子
点赞 回复 分享
发布于 2025-10-24 22:03 吉林
mark住这个帖子
点赞 回复 分享
发布于 2025-10-15 00:06 广东
mark住这个帖子
点赞 回复 分享
发布于 2025-08-22 20:10 四川
mark
点赞 回复 分享
发布于 2025-07-16 14:52 辽宁
mk
点赞 回复 分享
发布于 2025-06-06 03:11 北京
mark住这个帖子
点赞 回复 分享
发布于 2025-05-26 00:52 江苏
mark住这个帖子
点赞 回复 分享
发布于 2025-05-26 00:49 江苏
mark住这个帖子
点赞 回复 分享
发布于 2025-05-09 21:54 陕西
mark住这个帖子
点赞 回复 分享
发布于 2025-05-06 20:54 辽宁
mark住这个帖子
点赞 回复 分享
发布于 2025-04-24 12:14 山西
mark住这个帖子
点赞 回复 分享
发布于 2025-04-10 18:37 陕西
mark
点赞 回复 分享
发布于 2025-04-10 17:21 云南
mark
点赞 回复 分享
发布于 2025-04-10 12:15 陕西
mark学习一下
点赞 回复 分享
发布于 2025-04-09 16:03 天津
mark住这个帖子
点赞 回复 分享
发布于 2025-04-09 10:34 天津
m
点赞 回复 分享
发布于 2025-04-08 10:33 福建
Mark
点赞 回复 分享
发布于 2025-04-07 18:00 湖北

相关推荐

最近在用AI做Vibe Coding写代码时,发现一个很多人都会被卡的问题:想给项目加个实用功能,比如实时天气、股票价格、地图定位,却不知道从哪里找数据来源。今天这篇分享,就专门解决这个痛点,帮大家打通Vibe Coding的“数据获取”难关。💡API到底是什么?很多人一听到API,就觉得是程序员的专属,和自己没关系,其实完全不是这样!我们可以把API想象成外卖平台:你不用自己开餐厅、买食材、学做饭,只要下单,就能收到做好的饭菜。同理,你的程序想要获取天气、股票、地图这些数据,不用自己去采集、整理,只要通过API“下单”,就能直接拿到可用的数据。现在大家用AI工具做Vibe Coding,写代码的活儿AI已经帮我们搞定了,但在AI写代码之前,我们得先明确:用什么数据、从哪里拿数据。这也是为什么,找API成了很多人做Vibe Coding的第一个拦路虎。💡这个仓库是什么GitHub上有一个叫public-apis的开源项目,堪称Vibe Coding必备神器——它收录了1000+个完全免费的公共API,覆盖60多个领域,目前已经积累了412k star,是开发者社区公认的高质量资源库,靠谱又好用。涵盖的领域特别全:股票、动漫、音乐、天气、地图、NASA数据、翻译、支付……几乎你能想到的需求,都能在这里找到对应的API,而且还有人持续维护更新,完全够用很久。💡超简单用法进入这个仓库后,不用从头翻到尾浪费时间,高效用法很简单:直接按Ctrl+F,搜索你需要的关键词就行。比如想找天气API就搜“weather”,想找音乐API就搜“music”,想找动漫数据就搜“anime”。每个API旁边都清晰标注了关键信息:是否需要注册、是否免费、是否支持HTTPS,一眼就能看清适配性。找到心仪的API后,点进去看官方文档,按照说明申请key(很多API甚至不用申请key),就能直接使用,门槛极低。💡Vibe Coding进阶用法:配合Claude Code以前调用API,还需要自己写代码,处理请求格式、错误排查、数据解析,对非专业程序员来说门槛很高。但现在有了AI,完全不用愁,步骤简单到离谱:1. 在public-apis仓库里,找到你需要的API;2. 复制这个API的官方文档链接;3. 把链接丢给Claude Code,说清楚你想实现的具体功能;4. AI会自动帮你写好所有调用代码,复制过去就能直接运行。举个例子:你想给网站加一个“随机猫咪图片”的功能,先在仓库里找到The Cat API,把它的文档链接发给Claude,说一句“帮我写一个调用这个API的函数”,几秒钟就能拿到可用代码。哪怕你不懂编程,从“想好功能”到“代码跑起来”,全程只要5分钟。下面附上链接:https://github.com/public-apis/public-apis关于API使用、Vibe Coding配合AI调用的任何问题,都欢迎留言交流💬
你都用vibe codi...
点赞 评论 收藏
分享
气笑了,写了半个小时感觉没GPT讲的好,喂给GPT帮我重写了一下,但是有些缩写没说明LCS = Longest Common Subsequence,最长公共子序列LIS = Longest Increasing Subsequence,最长上升子序列BIT = Binary Indexed Tree,树状数组suf[i] = suffix 的缩写,这里表示“从 i 开始的最优长度”给你两个长度为 2e5 的排列 p 和 q,求它们的最长公共子序列中字典序最大的一个。例如:104 7 8 9 5 10 2 1 3 63 2 6 10 8 9 1 4 5 7ans: 8 9 5补了半天,也是补出来了。整体思路其实分两步:第一步,先把 LCS 转化成 LIS。因为 p 和 q 都是排列,所以每个数在 q 中出现的位置唯一。把 p 中每个数替换成它在 q 里的下标,原问题就转化成了求最长上升子序列。第二步,为了方便构造字典序最大的答案,记录每个位置的 suf[i]。suf[i] 的意思是:如果当前选了第 i 个位置,并且把它作为这一段的开头,那么从这里开始最多还能选出多长的合法序列。注意,这个长度是包含当前位置自己的。然后贪心构造答案。从最大的 suf 开始往下做,每次都在当前这一层里选能选到的最大值。这里“能选到”不只是原排列里位置要在后面,还要求它映射到 q 里的位置也在后面。这两个条件都满足,才能保证它仍然是公共子序列。时间复杂度分析:映射下标 O(n)。算 suf[i],本质上还是 LIS 的 DP,可以用二分 / 树状数组 BIT 加速到 O(nlogn)。构造时,把 suf 相同的位置放到同一个桶里,同时记录它们的原值和原下标。每个桶内按值从大到小排序,然后从大到小枚举 suf,顺着扫一遍找第一个合法位置即可。这样排序总复杂度是 O(nlogn),最后构造整体扫一遍是 O(n)。所以总复杂度是 O(nlogn),2e5 可以通过。下面说一下为什么能转成 LIS。最长公共子序列这题,如果两个序列都是排列,那么把其中一个排列里的元素,替换成它在另一个排列中的下标,就可以转成 LIS。核心原因是:“值相同且顺序一致”等价于“映射后的下标严格递增”。这一步成立的关键条件就是:排列里的每个数只出现一次。比如在 p 中选出一个公共子序列:p[i], p[j], p[k]如果它在 q 中也按同样顺序出现,那么它们在 q 里的位置一定满足:pos[p[i]] < pos[p[j]] < pos[p[k]]所以公共子序列就对应着一个上升子序列,LCS 也就变成了 LIS。最后说一下 BIT 为什么能算 suf。这个本质上还是 LIS 的 DP。如果从右往左扫,设 suf[i] 表示以 i 位置开头时最多能选多少个,那么转移就是:suf[i] = 1 + max(suf[j]),其中 j > i 且 p[j] > p[i]也就是:要从右边、并且值比当前大的位置里,找一个最优的接在后面。这个可以用 BIT 维护前缀 max 来加速。因为 BIT 的结构天然适合维护前缀信息,后面的块会汇总前面的信息,而前面的不会被后面的影响。只要维护的是 max 这种可合并的信息,就能像维护前缀和一样维护前缀最大值。而这里值域又正好是 1..n 的排列,所以非常适合直接用 BIT 做到 O(nlogn)。
查看5道真题和解析
点赞 评论 收藏
分享
评论
131
1128
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务