秒杀项目的面试问题记录,求助及欢迎讨论

该帖子在秋招时写的,现在楼主已经上岸了。整理一下答案。

但如果牛友点进来,是想找秒杀项目做。

那我必须说:请不要做秒杀项目

人均秒杀导致的,不只是简历大量重复。其实真正的问题是:面试官问的问题,已经有很多人回答过,那他肯定听过更好的答案,那你的答案即使原本是合格线的,在面试官看来,也就不及格了。那这样,你就只有提出更好的回答。或者面试官提出难度更高的问题,然后这样一个死循环。

楼主是建议自己去做一些轮子,这里可以推荐另一个牛友的帖子,一个RPC框架。

一个简易的rpc框架实现完整教程

再次提示,做秒杀,三思而后行。

如果牛友是来讨论秒杀的问题、答案,可以继续往后看了。


首先先总结一下我的简历中秒杀项目的知识点

  • Redis分布式缓存的实现
  • Redis预减库存
  • 内存标记(HashMap)标记是否已结束
  • RabbitMQ入队

上面都是基础点了,我额外有

  • RabbitMQ可靠性传输的实现 (发送方,broker , 接收方)三方
  • RabbitMQ的消息幂等性实现
  • Jmeter进行的压测
  • 对异常消息的入库记录及Redis对预减库存的补偿

秒杀代码的逻辑就是

1.查看内存标记HashMap,看是否已结束

2.判断这个秒杀订单形成没有,避免重复秒杀

3 setnx,判断该用户是否请求过,返回提示"等待结果"

4 Lua脚本,判断Redis是否有库存,有就扣。没有设置HashMap已结束

5 正常入队MQ

我也写了博客,记录相关的实现,有需要的可以看一下,跳转

(有些问题,博客还没来得及更新,谨慎参考)


先指出个本质设计上的问题:

如果库存为N,其实Redis不应该放N,而应该是2N、3N等

因为放N,若有X条异常消息,无法正常消费

  • 会出现少卖:有库存,买不到

  • 如果回补库存,则设计内存标识的重新开放。

    虽然可以通过MQ实现,但其实有延迟,而且成本大

    而对于秒杀场景,关键就是前几秒,因此MQ的延迟实现意义不大。

(而且这样处理后,其实异常数据就不需要回补了,因为你设置的并不是N,少量的异常数据不会导致少卖)


(此处需要呼吁大佬们提供一下解决思路,挺多问题都没解决的)

面试问题

  1. 针对单个商品,有10w+的库存,怎么优化Redis?

    综合下评论区老哥的答案。

    大概想法是多个相互独立的Redis集群。

    比如10w个库存,10个Redis集群,一个集群分1w。

    存在的问题:某个集群卖完了,但实际其他集群还有。

    楼主认为类似上述的放x倍N的思想,每个集群放2W或3W,再

    配合nginx的最少访问负载策略,能很大程度解决这个问题。

    但感觉并不是最优解。

  2. 如何保证不超卖的情况下,提高效率

    推荐阅读:写的很好,秒杀系统优化方案(上)吐血整理

  3. 项目本身是否多线程

    这里说的不是多线程访问,而是指程序本身是否多线程。

    答了无额外处理,依靠springboot的调度。


    楼主查阅资料,只有一个跟多线程扯上的。

    是一位牛友告知的,队列泄洪的概念。

    我感觉跟常规的理解有点区别。

    这种用的是多线程来限制访问,表象上看反而是降低了访问速度,但可能是出于大量请求等导致的崩溃的问题,这块不太清楚。因此具体请百度

二、内存标识HashMap的相关问题

  1. 对Redis库存进行补充后(异常或退款),如何反馈到内存标记

    上面已经说了,已经放X倍的N,来避免这种情况。

    当然,该问题的答案是:

    1. 单机环境下,把HashMap的范围改为public,补充库存后,直接重置HashMap为true。

    2. 集群环境下,就把补充的消息推送到MQ,各个节点进行监听,修改本地的HashMap。或者直接依靠集群的同步机制完成。

    3. 直接依靠定时任务,根据redis的库存定时更新HashMap的值。

      这种方法缺点也很明显,定时间隔长了,实时性不强。间隔短,性能低

  1. HashMap的问题

    • 线程安全问题:不安全,但不影响。因为后续还是会经过Redis库存判断。

      为了线程安全换ConcurrentHashMap之类的,反而不值得

    • OOM问题:采用Guava,利用其自带的LRU解决。


三、压测相关:

  • load average高,不一定是CPU资源紧张,如何排查

    磁盘IO问题,相关命令: vmstat、iostat

(仍然没思路的↓)

  • 如何检测、定位项目的性能瓶颈在哪

    答了把方法细拆,分别压测对应方法。但反应不理想

  • 除了CPU占用率外,还有什么能判断是否到底瓶颈?

#秋招##项目#
全部评论
m
点赞 回复 分享
发布于 2020-08-20 16:37
大家好,我叫夹嗦
4 回复 分享
发布于 2020-08-20 22:57
其实我真的不太建议人均秒杀的,应该我在网易听他们面试官说,碰到秒杀项目的,除非真的特别优秀,不然基本过不了
2 回复 分享
发布于 2020-08-22 11:08
请问什么是秒杀项目呀,是说楼主项目做得很快吗?😂
1 回复 分享
发布于 2020-08-21 16:37
哈哈,这个帖子好。
1 回复 分享
发布于 2020-08-20 18:10
秒杀是一个模块,你要是单写一个秒杀肯定是不行的,现在电商包括的模块很多,秒杀只是比较热的模块而已,包含但不仅限于
1 回复 分享
发布于 2024-09-10 09:39 陕西
请问在哪可以找到在简历上介绍秒杀项目的描述参考呢
点赞 回复 分享
发布于 2023-08-09 22:33 广东
m
点赞 回复 分享
发布于 2022-08-08 10:32
请问hashmap的标记是存在哪儿呀?还有加载页面或许需要缓存,这个页面存在哪儿呀
点赞 回复 分享
发布于 2022-07-03 16:31
字节跳动大佬!!!
点赞 回复 分享
发布于 2021-12-28 10:05
大佬,我想问问redis锁加在哪里?请求秒杀就开始加吗?我的流程是先去redis预减,然后发送到消息队列。我这个redis锁应该加到redis预减库存前面吗?
点赞 回复 分享
发布于 2020-08-31 10:42
跨考生弱弱的问一句,不做电商、管理系统、秒杀之类有视频教程的项目的话,应该做什么呢,感觉没有视频教程对着做我就寸步难行= =
点赞 回复 分享
发布于 2020-08-27 16:40
m
点赞 回复 分享
发布于 2020-08-24 09:23
m
点赞 回复 分享
发布于 2020-08-22 11:29
m
点赞 回复 分享
发布于 2020-08-22 11:13
项目中使用lua脚本预减库存,被问到可不可以不使用lua脚本,使用redis自带的方法完成这个功能
点赞 回复 分享
发布于 2020-08-21 14:53
我也有个问题困惑着: 就是秒杀令牌,获取一个秒杀令牌,然后进入到下订单环节,下完订单这个令牌是不是要删除啊
点赞 回复 分享
发布于 2020-08-21 14:45
原来是JAVA大佬
点赞 回复 分享
发布于 2020-08-21 12:46
m
点赞 回复 分享
发布于 2020-08-21 12:40
前来学习一下秒杀项目
点赞 回复 分享
发布于 2020-08-21 12:26
m
点赞 回复 分享
发布于 2020-08-21 11:24

相关推荐

2025-11-26 11:21
已编辑
武汉理工大学 Java
个人bg: 211本,一段京东实习,一段xhs实习,一段小厂实习。互联网只有美团一个带薪意向。转正失败情况:京东实习了四个月,感觉收获比较少,做的事情偏基础,第三个月底答辩,离职后两个月被告知转正失败。对此我只能说,零售卡硕。xhs实习两个月,反而感觉收获更多,被安排了有挑战的事情,大模型在业务场景中的运用,最后一个星期通知有转正机会,边做需求边匆忙准备,答辩采取一票否决制,四个领导三过一否,也失败。(早知道xhs今年开这么高我就熬夜赶材料了)不过在这个过程中,也push自己了解了一定rag mcp 大模型的相关知识,对于后续面阿里和美团很有帮助。个人基础情况:hot100能默写。去年12底学完jvm juc。2月入职京东前小林coding guide就差不多看完了。后面实习的时候也有继续补面筋,场景题。秋招情况:8月初就投了,也不晚。滴滴: 笔试a了没面,可能投的岗位太小众了?(抱着拿了也不去 用于a价的想法)一直卡着。携程: 不发笔。发官方邮件也不回。京东:笔试挂了。嗯,很耻辱,那天在外面玩但确实很久没复习笔试考试范围了,全忘光了。腾讯:从来没约过,可能暑期面了十几次面太多了。阿里控股:一面挂。阿里国际:hr面后一个月挂。字节:国际电商三面挂->星图一面挂(面的时候已经有很多候选人了)-> 安全风控二面挂(业务不是很好,面试过程说漏嘴说业务会影响我选择,场景题没答好)-> 中台一面后无消息快手:二面挂。xhs:hr面后无消息,排序应该很靠后。虾皮:hr面两个月无消息,应该还在泡池子。百度:一面挂。pdd:笔试a3后笔试挂。难绷。个人反思总结:for 后来者。1. 笔试一定要把握好,虽然面试中都是hot100,有些甚至不考面试题,但是大厂笔试题是有acm难度的,挂了就是挂了,很多没有第二次机会,约面也没机会了。建议时间充裕情况下,还是要把灵神的题单多刷点。顺序可以参考:代码随想录视频+题 -> 灵神视频+题 ->hot100 ->灵神题单(可以每个part挑难度低的前几道写)2. 一段深入长的实习经历一定是大于两段短的,不过现在再让我选到底是继续在jd还是去xhs我还是选不出来。在面试的过程中,有些面试官也会认为我实习的太浅,没有做什么有深度的事情,对多种方案的调研不全面。如果实习做的事情比较有挑战最好,如果没有,也要尽量往多种方案调研最后选择了哪个方案,达到了当初定的业务指标/技术指标方面包装。3. 还是得早投。身边除了bg特别好的朋友,投的晚的无一例外秋招情况会差很多。8月前投能赶上提前批。最晚不要8月中旬过了还没投完。有投的早的没有实习的朋友秋招结果也可以。没有面试的同学一定要尝试官网,boss直聘多种途径投。4. 对于有实习的同学,基础没有那么重要了,更多还是专注于对实习的考察,可以以金字塔的形式进行论述,避免在最开始的时候就展开大量细节。如果实在没有实习,bg够硬,投的够早也会有面,只需要一个比较深入的项目应该就没问题,把项目当作自己在实习要投入生产的心态去调研包装。5. 有的时候真的看运气。即使是同一个部门甚至是同一个组的同学,做的事情也会有差异,这主要看导师被分配到什么样的活。for me:大二的时候绩点排名前10%,但还是决定放弃保研,开始学java,这一路走来,经历迷茫踏实的反复,也想和自己说句幸苦了,谁想得到当初给自己定的目标是有份工作不饿死就行。可能差点运气,可能在关键节点上做的还是不够,对于实习的包装,对于面试表现还是差点。会后悔自己没读研吗?其实我也有考雅思,申请了港大计算机,但估计大概率还是工作(实则也没港大offer)。人不能既要又要还要,我不能既要早点工作赚钱,实现我财富自由支配,带不舍得花钱的家人去旅游的想法,又要长期来看高学历晋升的优势,还要在大环境变差一届比一届卷我也能找到差强人意的工作。所以,至少现在,我不后悔。如果我更倾向于国企而不是互联网,比起技术挑战更偏爱稳定的生活我大概率会读研。如果我本科没有211,我还想进大厂,我也大概率会读研。会后悔自己没选其他的方向吗?java确实相对卷一点,但也只是相对的,因为其他方向的人也很多,并不是换方向就一定会更好。计算机这一行本就短命,能干到35就算成功,大家都是为了赚钱,基于此,在背景没那么硬时,选择一个相对人少的方向进大厂是对的。看自己怎么理解了。最好的还是参考直系学长学姐的选择,一定要多沟通交流。一些安慰自己的话,秋招是人生的起点,不一定是高费阵容才能吃鸡,低费阵容早点发育也有吃鸡的上限。(随便乱说的)。最后还想再写一段话给学妹们,程序员这一行,女生确实会相对少一点,但比起传统工科非常直接的偏向男生,计算机这一行认为菜是原罪,性别的因素会少很多,更多看个人技术和水平。在京东实习的时候,我的小组长在我进去第一天就和我说,我们部门女生虽然少,但是水平都至少是中上的,都很能吃苦很能干。无论是我们组干活巨快的A姐,还是总能很快解答我问题的B姐,又或者是其他总能给我提供建议的其他姐姐们,都使我对这一点坚信不疑,她们高学历,专业,细心,耐心。如果你也热爱技术,虽然有时会被bug折磨,但喜欢学到知识时候的踏实,喜欢bug fix的爽感,你就是适合这一行的。我的秋招结束了,但我大概率不会甘心,还是会想试试春招,但我也真的觉得到现在这一步已经很棒了。欢迎同校学妹学弟们找我沟通交流~
疲倦的牛马还在上班:再冲一次,春招不留遗憾吧!
我的秋招日记
点赞 评论 收藏
分享
评论
44
559
分享

创作者周榜

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