一些面试题目

之前逛论坛时,看到了一些经典的面试题,下边讨论的时候,也提供了一些不错的回答,现在把其中一个整理一下,不然老留着链接放浏览器里占位置,存文档里看的机会也会很少。

问题:
1、MySQL 里的记录有这么两个字段:
课程 id,课程余额
同时间大量学生抢同一门课,如何设计这个功能?
2、线上 Redis 内存满了,应该如何处理?这个问题,暂且认为是问线上Redis满了之后的处理方案。当然给了处理方案之后,后续的故障处理流程和优化方案也应该提供一下。
3、你认为解决高并发问题的本质是什么?

首先说第三个问题,根据下边网友讨论提示,这个面试官可能看过《高并发的哲学原理》才会问,链接: https://pphc.lvwenhan.com/
另外,有一个说法感觉说的也非常好:解决高并发的本质就是在业务上避免高并发的场景的产生,看看早年的双十一和现在的双十一。

OK,接下来贴一下一个网友(admol)的答案,如下:

第一问,实际上是在问你系统设计问题
而你只是直接回答了其中很小的一个点(做法),也不能说不对,只能说不完全对。

尝试从下面几个步骤回答下:
1. 多问
- 学校总的有多少学生需要抢课
- 学校大概总的有多少非常热门的课程
- 平均到每门热门课程大概有多少学生会同一时刻抢
- 给出一些人数,然后是否可以估算出 QPS
假设:需要抢课的学生 1000 人,
假设查询课程 QPS 粗略估算:1000QPS ,峰值*2 ,算 2000QPS

- 其他开放性问题,是否有其他要求
2.初步方案
分为两部来进行涉及:
1. 查询课程(查询并发最大)
设计一个高效的索引和缓存机制,以应对高并发查询需求。方案有:缓存、读写分离等
2. 提交抢课
设计一个分布式锁机制,确保同一时间只有一个学生可以成功抢课。方案有:Redis 、ZK 分布式锁、消息队列等

3.详细方案
- 开始抢课之前,提前将课程-课程余额缓存到 Redis 中
- 使用读写分离,分散查询课程和抢课程写结果时数据库的压力
- 使用 Redis 进行扣减余额
- 扣减成功,记录抢课结果(学生-课程)
4.总结
- 缓存、锁、读写分离、其他方案

问题2:线上 Redis 内存满了,应该如何处理?
思路:
1. 解决线上问题,快速恢复线上功能正常访问
- Redis 扩容
- 手动清理不必要的缓存数据,释放内存

线上功能恢复后再做
2. 找出为什么满问题
- 分析 Redis key ,是否是热点数据访问量暴增?
- 是否是 缓存 key 设计不合理
- Redis 配置参数不合理,导致内存使用效率低下
3. 避免为什么满问题
- 针对 2 进行优化,增加监控告警等措施

问题3.你认为解决高并发问题的本质是什么?
- 本质就是在大量的请求和有限的资源情况下,如何来保持系统的性能和可用性等。
- 手段很多:增加资源、减小开销、缓存、服务化、冗余、异步、队列、限流、熔断等

此网友还推荐看《系统设计面试:内幕指南》链接: https://learning-guide.gitbook.io/system-design-interview

以下是另外一个网友(dilu)的回答,这个点赞也比较多,回答也比较成体系,

 小菜鸡一枚,尝试回答一下,以下答案没查阅资料也没参考楼上大佬们的答案。

1. 这个问题我觉得可以分开讨论一下,首先如果真的只是学校的抢课场景,从经验来说,那就算有并发也不会有很高的并发,在不保证高可用的情况下(如果真是学校抢课,没必要真的做什么高可用吧?)单台 redis 足够支撑需求了,最简单的实现肯定是 setnx ,但是可以从这里延伸一下,例如锁的时长要设置多久,锁过期了怎么办,要不要重试等等八股文,也可以用 lua 脚本,但是缺点是什么巴拉巴拉(掺杂八股文)
但是如果不是简单的学校抢课场景,而是电商的抢购商品这种场景(说时候电商秒杀的八股文和方案大家估计背的比我熟了吧?)既要保证高可用也要数据一致性的情况下,我觉得可以这样设计:

a) 根据以往秒杀时期的数据前提下,前端直接抛弃一部分流量,例如只有 20%的请求才能真正的请求,80%的请求在前端直接抛弃。
b) 秒杀请求进入队列,这样可以把对 redis db 等资源的峰值削平避免服务出现毛刺。由于是秒杀场景,失败了用户也会重试,所以完全可以不在意消息是否会丢失,这种情况下 mq 的性能绝对是能承载主流量的
c) 在消费的时候,再按照商品纬度加锁,这里可以用 redis 集群模式,也可以用 zk 等等组件,调你熟悉的讲,例如你熟悉 redis 的 redlock 那就讲 redlock ,熟悉 zk 脑裂你就讲脑裂

2. reidis 内存满了怎么办?我认为有也得分类讨论(前提是 redis 满了已经导致服务不可用了,如果配置了内存淘汰策略那就不用在乎满不满了)
a) 首先确认这个 redis 里面的数据是不是全是“缓存型数据”,如果是,可以挑一些 topn 的 key 先删一批,先让服务正常可用,然后迅速扩容,如果能动态扩容最好,如果不行先用 rdb 复制一台更高规格的 redis ,然后切换过去。
b) 如果 redis 后面不是传统 MySQL 或者 qps 不高的情况下,直接重启是最好的办法,当然这种情况不太常见,如果 qps 过高可能会直接拖垮 DB 。
c) 这件事的关键是要做好事后复盘、做好防护,避免下次再出问题,一个是要增加 redis 内存监控告警,超过 80%要告警,其次要配置一下 redis 的缓存淘汰策略,(这里也可以卖弄一下 LRU 之类的八股文)。

3. 我认为并发问题就是资源竞争的边界问题,解决并发的问题就是让资源竞争的请求从并行变成串行(加锁),让无序变有序,让混沌变秩序。这里可以卖弄一下读写锁,互斥锁,CAS ,原子操作之类的八股文。

其次,有一些关于面试的经验,想分享给 V 友们。

1. 面试跟谈恋爱是一样的,眼缘最重要,而不是闯关或者解密游戏,答对所有题,写出所有算法,不会决定你能否通过,能通过面试,一个是因为合适,一个是因为眼缘。而我认为后者的占比更大一些,所以建议可以适当处理一下个人形象,面试的时候别太颓废,别太随意。不管是面试还是生活中,看起来让人舒服的人,总能占更多的好处。

2. 面试的时候,问题不会,算法不会是很正常的一件事,计算机的知识没人能做到全都懂,你需要做的是把握面试节奏,让面试官去讨论你熟悉的东西,引导面试官的话题。例如楼主的题目,问你 redis 怎么实现分布式锁,如果你不熟悉 redlock 但是你熟悉 zk 那就说不好意思面试官,xxx 我不太熟,但是 zzz 我用的比较多,zzz 的原理是这样的 balabala 。要把节奏掌握在自己手中。

3. 面试官不一定能决定你是否通过,很多情况下还是 HR 话语权大一些

4. 面试前最好了解一下面试的公司和部门,他们有什么产品?主营什么业务,熟悉一下,对方问起来可以增加一些好感。

5. 面试必问,自我介绍、离职原因、语气薪资,这些问题一定要提前想好避免回答的时候大脑一片空白。

以上挑选了两个比较完整、认真的回答,保存下来,自己也多温习,毕竟基础不能丢啊。

DAY27(0703,周日) 关于视频号运营(十二)

今天到办公室继续折腾。在看资料的时候,忽然想起来航海刚开始的时候,说过所有船的手册在开始后都会公开给所有圈友,于是我登录了知识星球去专门看了一下,纯粹是想看下里面都是怎么操作的,现在不操作以后可以操作。
在报名一开始的时候,我只关注了短视频这块的内容了,等报名完,在大群里交流的时候,才发现还有一个方向是我也感兴趣的,那就是付费插件这块。当然当时考虑了一下,还是先专注一个事情比较好,之前自己也反思过,要做减法,不要贪,想法太多,铺的太多,自己也会更容易给自己找到时间不够、精力不足等方面的原因去逃避面对真正的问题。
今天看这个手册的时候,发现的却是另外一个问题。因为这个手册,跟之前看的微信短视频的手册一样,相当大篇幅都放在了同一个部分:需求。
短视频平台、直播、TikTok等各个赛道,除了前期的基础准备工作之外,都是把定位放在第一位,而定位,就是定自己要面对的用户和挖掘、满足这个用户群的需求。
比如我又看的这个收费插件的航海,里面提供的定位和挖掘需求的方式,其实在各个营销领域都很通用。
第一个,最简单的,就是从自身出发。比如你去使用一个平台,一个网站,从你自身使用角度,在使用过程中,你有什么不满意的地方,有什么想要的,但是你使用的这个平台、网站没有提供的功能,或者你感兴趣的问题和一些数据突出的问题,那这个就可能是个不错的需求,可能有市场;从一个问题,延伸出来四五个问题,不过一般一定不要离开你选定的平台。
第二个,使用搜索平台,比如谷歌,然后带着半个问题或者26个字母去搜索。比如你在插件这块,比较常见的有处理图片、处理内容等功能,那么你去搜索的时候,”带着半个问题”搜索,去搜”how **平台名 image”,这时候,谷歌会给你一个搜索提示,这个提示是谷歌根据搜索量的多少推荐的,那也就是说,现在提示出来的这些问题,都是有最多人搜索的,有最多的人遇到并想要解决的。这,就是需求。

以上只是针对做插件这块寻找、挖掘需求的时候使用的一些手段。使用这些手段其实是有一些前提的,看起来与其他方向挖掘需求的时候不一样,其实是一样的。
比如做短视频,给视频号、抖音的账号做定位的时候,就是选中一个你想要经营的群体,然后去解析这个群体的需求,会遇到什么问题。
明确了定位,就能知道他们有什么需求,就知道自己该做什么。
做插件的时候没有定位这个步骤吗?其实也有的,只是因为手册里第一步就是让选中一个平台,而选中了平台,就相当于做好了定位,定位的目标用户群体就是这个平台上的用户。

所以大胆的归纳一下,如果我们想要使用我们自己手里的资源,比如自己的技能,自己的时间,自己的知识储备等,转化成收入的时候,我们第一步做什么?以前经常有个误区,就是自己瞎琢磨一番,然后觉得自己的资源能做这个,就觉得:诶,这个我能做,做出来肯定有人要,那就肯定能赚钱!
其实有可能大错特错,不排除有一些人歪打正着这么操作赚钱了,但是对于大多数人,如果没有一个清晰的定位和目标客户群,以及解决的比较具体的问题,那这么操作下来,更大的可能是白费时间精力资源。
我们确实应该首先整理一下手里的资源,分析一下自己能做什么,但是这仅仅是最最基础的一部分。更重要的一部分是,我们要给自己要做的事情定位,找到目标客户群;比如会编程,编程最主要的功能是做什么?是制造工具,解决人们平时重复性劳动,协助人们进行一些机械化的操作。那这时候就凭空想象着去做一款工具就可以了吗?显然不是。你得先去找到你的客户。比如会做浏览器插件,你可以去一些知名的、用户体量比较大的平台上,去寻找。选择用户体量比较大的平台,是因为首先你没有特别明确的目标,找一个体量大的平台,能发觉出来你可以做的、有需求的群体的可能性更大,如果你本来就有一个明确的目标客户群体,压根也不会有这个问题,就直接去做了。接着按照前面描述的方法,或者自己知晓的其他方法,发觉出来需求,找到自己的精确目标客户群。一直到这里,才可以说,你明白你的客户想要什么了,你可以根据他们的需求制作他们需要的工具了。
通过这样的操作,基本上都可以走完一个变现的闭环,先不管回报多少吧,至少能让自己得到正反馈,能让自己知道这件事情是可以做下去的,并且让自己有动力做下去。

因此,我发现在发掘用户需求这块的能力,是十分重要且值钱的。可能这也是为什么咨询、分析工作会成为一个具体的职业、行业,而且还挺贵。

天助自助者

这世间,几乎所有的事情,都需要自己主动去做,才可能做成。

主动,除了包括思想,最最主要的,是包括行动。

这两天正在整理抖音短视频小航海的一个比较成功的财友的小航海总结,里面他就写到了这么一块:天助自助者。

他的总结是:我总会觉得这一路上都有人愿意帮助我,现在回头看来还是受益于生财的价值观:真诚、利他、主动、开放、空杯。我认为我做到了,所以会有磁场把我和这些人联系起来。

这验证了一句话,真诚起来,强大起来,所有的财富、资源都会紫东向你聚集。

由此反思自己,以前总觉得自己空杯心态足够,其实来西安这半年多来,自己的空杯心态远远不够,也不够主动,哪怕看到了一些眼前的机会,但是总感觉自己没有修整过来,总是提不起干劲。

其他的几项,更是相去甚远。

这几天也是终于其他的事情有了一个大致的收尾,节奏和状态调整回来一些,另外制作了一个坚持写作输出一百天的计划,目前执行的还可以,大概也正是执行这个计划,让自己的节奏开始正确了起来。

从身边的小事开始,训练强化自己的执行力,弱化自己的懈怠、自满,让自己从思想上和行动上,都步入正轨。