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个移动的点,求最早相遇时间