系统设计总结

短URL设计

1级设计

1.设计一种编码/解码的模式来转换URL为5-字符的编码
2.使用单一数据库来保存从短URL到原始URL的映射
3.在查找短URL时,存在就返回原始URL,不存在就返回空

1.5级设计

1.编码方式:从0-9变为a-z A_z…等,64编码,可以表示的数字更多
2.缓存设计:考虑读写频率和内存置换算法

缺点

1.性能:要是10000qps呢?
2.伸缩性和可用性:db宕机呢?

2级设计

1.使用key-value数据库
2.使用md5转换为128bits,采用64编码则需要21字节,在截断为5字节
如何解决冲突问题?

3级设计

1.使用多服务器;
切分:服务器ID=hash(URL)%N;
对热门服务器进行热备份来进行流量的负载均衡
2.可靠性;
备份,恢复和持久性

4级设计

1.使用一个集群来专门生成ID
2.如何避免URL被爬虫(使用映射表先将URL外部ID转化为内部ID)
3.如何限制单一用户的RPS(限流)
4.如何实现重定向服务器

拓展:限流实现

背景:输入密码登录,要求用户不能在1小时之内登录出错超过5次

第一层

内存放一个hashmap,存谁在哪个时间做了某件被限制的事情

无法实现需求

第二层

使用cache,带上过期信息,设置1小时之后自动过期
key=事件名字+用户ID,value=1小时内的出错次数

用户登陆出错时,在cache中找到这个key,将value+1,并延长销毁时间为一小时之后

缺点:不正确;

第三层

每分钟为单位一个bucket
使用cache,key=时间戳+事件+用户ID,value=出错次数,过期时间=2小时

用户登陆出错时,在cache中创建这个key,将value+1,以当前时间为key往前数60分钟,看出错次数有没有超过5次

  1. 场景题1:如何设计商品类目数据库,设计不同类的商品的数据库,怎么样设计保证查询效率。
  2. 场景题2:设计游戏的排行榜。我说redis的zset,于是跟我讨论了半小时的查询用户排名,查询指定排名区间的时间复杂度。我不是很懂跳表的结构,于是跟我讨论了跳表的数据结构还怎么设计。
  3. 场景题3:有 k 个数组,所有数组元素个数之和为n,每个数组都是升序排列,问有哪些方法合并数组呢?秒答k路归并,面试官要求时间复杂度 小于 O(kn),于是讨论了很久直到面试结束。
  4. 算法题: 代码实现场景题3,时间复杂度要求是 O(nlgk)。因为时间不够了,开了一个腾讯在线文档让我自己下来写。结果我只写出了 O(knlgk) 的代码。因为我觉得k个链表可以实现 O(nlgk),而数组最少得 O(knlgk)。

1.写个快排
问你写的是从前往后遍历,和从后往前遍历有什么区别,有什么好处。
我???
面试官:从内存方面考虑
我:是缓存问题吗
面试 官:cpu加载时的预取机制吗?不了解
2.写个哈希表,不用太考虑边界条件,实现插入和查找两个接口。
用的链表法处理冲突
最后面试官给我讲了一些存在的问题
3.实现一个remove_if函数,删除单链表中指定节点
代码写的不够简洁吧,面试官最后给我发了个他自己写的代码…

1,算法题,长度为n的数组,每个元素相邻都不相等,a0小于a1,倒数第二个元素大于最后一个元素,找其中的满足ak大于ak-1,ak大于ak+1,二分法做,好像是LeetCode原题

三道场景题
1商城不同品类,不同大类的表设计,参考MOOC网那个数据库新零售实战课程,原题

2排行榜的设计,数据结构,查询复杂度,实时更新

3多线程设计,100个woker线程,一个io线程,如何避免轮询,如果解决消息的通知

应用:有上亿条有序的训练数据,内存一次可以存大概一万条,现在想要每次取一个batch(大概1千条左右)进来训练,如何设计取法
算法:有两个元素完全相同但顺序不同的数组,求最少删掉多少元素可以使得两个数组相同
其他基本知识的问题不太记得了,都挺基础的

三面
先是问了hash表的底层实现的几种方式,各自的优缺点,然后大概50min都在基于哈希表的各种场景上的应用进行深挖,主要是从体系结构的角度去问的,包括存取效率(涉及到***,针对的是链表和数组两种结构),插入删除和查询之间的trade off,问的非常细,面试官很nice,一直在提醒我引导我思考,包括我不是很熟悉的bitmap他也费了很大的劲让我想明白了怎么用来优化哈希表,三面就这一个点的展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值