1 评论系统

设计一个基于 Redis 的简单评论系统,需要支持发布评论、回复评论和分页展示。请描述你的数据结构和设计。

在设计一个评论系统中,你如何处理多级评论问题,如何设计数据结构?

追问:如何高效的查询和展示评论,你会采用什么样的算法或技术来优化查询性能?

2 设计一个定时任务执行系统

3 库存超卖

[!note]
高并发卖5000张券

  • Redis缓存扣减库存

  • 分布式锁+分段缓存:借鉴ConcurrenthashMap分段锁的机制,把100个商品,分在3个段上,key为分段名字,value为库存数量。用户下单时对用户id进行%3计算,看落在哪个redis的key上,就去取哪个。

  • Redis原子操作(Redis incr)+乐观锁:

  • stockCount记录库存总量,stockUsedCount记录已使用库存量,对占用的库存设置分布式锁

第19节:设计滑动库存分布式锁处理活动秒杀 · Wiki · KnowledgePlanet / Lottery · GitCode
【并发】高并发下库存超卖问题如何解决?-阿里云开发者社区 (aliyun.com)
万级并发!电商库存扣减如何设计,如何做到不超卖? - 知乎 (zhihu.com)
超卖问题及其解决方法-CSDN博客

4 秒杀系统

“秒杀”,就是在同一个时刻有大量请求争抢购买同一个商品,并完成交易的过程,其间涉及大量的并发读和并发写,并要求高可靠和高性能的系统支持。

  • 高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。本专栏将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这 4 个方面重点介绍。

  • 一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,我将用一篇文章来专门讲解如何设计秒杀减库存方案。

  • 高可用。 虽然我介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,我们还要设计一个 PlanB 来兜底,以便在最坏情况发生时仍然能够从容应对。专栏的最后,我将带你思考可以从哪些环节来设计兜底方案。

  • 过滤无效流量

  • 库存可以少卖不可以超卖

  • 热点商品预热

  • 热点商品信息提前缓存

  • 利用redis缓存

  • 静态资源提前加载

  • 利用消息队列进行流量削峰

  • 切片集群

  • 在用户发起请求前,对用户进行一些校验操作,比如答题、输入验证码

  • 服务限流

过滤无效流量

将用户请求分散

提高QPS

高频面试题:秒杀场景设计 - 知乎 (zhihu.com)
面试官问我:如何设计一个秒杀场景?-腾讯云开发者社区-腾讯云 (tencent.com)
秒杀场景的设计思路和方案-阿里云开发者社区 (aliyun.com)
万字超详解秒杀系统! - 知乎 (zhihu.com)
面试必备:秒杀场景九个细节-CSDN博客

5 商品点击率排行榜

top K排序

多并行优化

多个top K排序,在合并求top K

[!question] 全国的酒店价格(千万级数据)需要在某个瞬间比如7点发生变动(比如说晚上折扣或者升价之类的),怎样高性能准点去进行变更

  • 定时消息+缓存提前预热

  • 提前计算缓存 定时切换Redis命名空间 然后异步做持久化(使用Hash数据结构,key为商家id,value为价格)

[!question] 外卖系统,一天一千万条数据,用户需要查到近30天的数据,商家也要查询到30天的数据,怎么设计表

数据库冷热分离分库分表

6 游戏开发

1.以lol为例,玩家的匹配怎么做。

2.排行榜(其他面经有)。(Redis的zset数据结构)

3.范围技能命中判定。(其他面经有)。

1.饥荒里食物放置在地上隔段时间会有新鲜度的变化,从绿色到黄色到红色最终腐烂,如何设计算法使这个服务器每帧更新食物状态?
我说饥荒联机版搞的是加个组件直接计时,结果就是太多堆积会很卡顿。单纯考虑算法的话整个单调栈,每次食物放地上就把它什么时间需要更新状态存进去,然后按时间读就行

堆排序,取出一个元素后,为下一个元素设置定时器更新

2.抽卡问题,n张卡给个排序要求随机?
直接rand(1,n)取第一张index k然后把k和n位置换一下,接着rand(1,n-1)取第二张indexj ,j和n-1位置交换 依次类推

3.手榴弹爆炸范围,对二维空间内造成aoe伤害,怎么找影响的实体单位?
不太会,后来说可以哈希

从爆炸中心进行BFS找影响的单位

问题1:系统设计(40min)
设计一个长链接转换为短链接的转换?
怎么进行转换?
怎么存储?
怎么设计给别人用的http的接口?
设计这个系统的重点是什么,需要关注什么?
长变短除了随机还有什么比较好的方式转化嘛?

长链接转成短链接的原理和实现详解_长链接转化成短链接-CSDN博客

问题2:java中多线程模型,给了一段代码让输出最终结果?多种情况(10min,这个很简单)

问题3:烧绳法计算15分钟(10min,脑子没转过来,原来可以两端烧)

1.一条公路上有多个点,每个点都有一辆车,给定公路坐标轴,车的速度和行驶方向,求最早两辆车相遇的时间;
第一题:无论相向还是相反,最先相遇的必然会发生在相邻的两部车之间。时间=abs(两相邻点之间的距离差)/abs(速度差),速度差为零永远不会相遇,取最小值就行啦

2.一条直线上多个点运动 知道所有点的位置,和速度包括方向。当两个点相碰时,追及或对撞两个点消失,问什么时候达到稳定状态,也就是以后都不会发生碰撞。第二题可以用第一题的思路,首先消除最先相遇的两个点,去掉这两个点后,重新计算最先相遇的两个点…直到所有车无法相遇就达到平衡啦

可以用优先队列去存相遇时间,每次取最小的,消除之后,会新更新一条进去,用个特殊标记记录两个点不会相遇,比如MAXINT这种,也能处理特殊情况

第一个是矩阵里找最长路径问题
第二个是直线上n个移动的点,求最早相遇时间