1.面试官说:你来设计一个短链接生成系统吧
2.转一篇我自动化学院老乡的码剑秋招30w+的心得
面试官说:你来设计一个短链接生成系统吧
引言
相信大家在生活中,特别是码剑最近的双十一活动期间,会收到很多短信,码剑而那些短信都有两个特征,码剑第一个是码剑几乎都是垃圾短信,这个特点此处可以忽略不计,码剑棋源码第二个特点是码剑链接很短,比如下面这个:
我们知道,码剑短信有些是码剑有字数限制的,直接放一个带满各种参数的码剑链接,不合适,码剑另外一点是码剑,不想暴露参数。码剑好处无非以下:
太长的码剑链接容易被限制长度
短链接看着简洁,长链接看着容易懵
安全,码剑不想暴露参数
可以统一链接转换,当然也可以实现统计点击次数等操作
那背后的原理是什么呢?怎么实现的?让你实现这样的系统,你会怎么设计呢?来自于某鹅场面试官
短链接的原理短链接展示的逻辑这里最重要的知识点是重定向,先复习一下/tzHLFw与/gmccapp/webpage/payPhonemoney/index.html?channel=之间的装换是怎么样的呢?前面路径不变,变化的是后面,也就是tzHLFw与gmccapp/webpage/payPhonemoney/index.html?channel=之间的转换。
实际也很简单,就是数据库里面的一条数据,一个id对应长链接(相当于全局的发号器,全局唯一的ID):
idurl1/gmccapp/webpage/payPhonemoney/index.html?channel=这里用到的,也就是我们之前说过的分布式全局唯一ID,如果我们直接用id作为参数,貌似也可以:/1,访问这个链接时,去数据库查询获得真正的url,再重定向。
单机的唯一ID很简单,用原子类AtomicLong就可以,ios汇率源码但是分布式的就不行了,简单点可以用 redis,或者数据库自增,或者可以考虑Zookeeper之类的。
id 转换策略但是直接用递增的数字,有两个坏处:
数字很大的时候,还是很长
递增的数字,不安全,规律性太强了
明显我们平时看到的链接也不是数字的,一般都是大小写字母加上数字。为了缩短链接的长度,我们必须把id转换掉,比如我们的短链接由a-z,A-Z,0-9组成,相当于进制的数字,将id转换成为进制的数字:
publicclassShortUrl{ privatestaticfinalStringBASE="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";publicstaticStringtoBase(longnum){ StringBuilderresult=newStringBuilder();do{ inti=(int)(num%);result.append(BASE.charAt(i));num/=;}while(num>0);returnresult.reverse().toString();}publicstaticlongtoBase(Stringstr){ longresult=0;for(inti=0;i<str.length();i++){ result=result*+BASE.indexOf(str.charAt(i));}returnresult;}publicstaticvoidmain(String[]args){ //tzHLFwSystem.out.println(toBase("tzHLFw"));System.out.println(toBase(L));}}id转 位的key 或者key装换成为id都已经实现了,不过计算还是比较耗时的,不如加个字段存起来,于是数据库变成了:
idkeyurltzHLFw/gmccapp/webpage/payPhonemoney/index.html?channel=但是这样还是很容易被猜出这个id和key的对应关系,要是被遍历访问,那还是很不安全的,如果担心,可以随机将短链接的字符顺序打乱,或者在适当的位置加上一些随机生成的字符,比如第1,4,5位是随机字符,其他位置不变,只要我们计算的时候,将它对应的关系存到数据库,我们就可以通过连接的key找到对应的url。(值得注意的是,key必须是玉石网站源码全局唯一的,如果冲突,必须重新生成)
一般短链接都有过期时间,那么我们也必须在数据库里面加上对应的字段,访问的时候,先判断是否过期,过期则不给予重定向。
性能考虑如果有很多短链接暴露出去了,数据库里面数据很多,这个时候可以考虑使用缓存优化,生成的时候顺便把缓存写入,然后读取的时候,走缓存即可,因为一般短链接和长链接的关系不会修改,即使修改,也是很低频的事情。
如果系统的id用完了怎么办?这种概率很小,如果真的发生,可以重用旧的已经失效的id号。
如果被人疯狂请求一些不存在的短链接怎么办?其实这就是缓存穿透,缓存穿透是指,缓存和数据库都没有的数据,被大量请求,比如订单号不可能为-1,但是用户请求了大量订单号为-1的数据,由于数据不存在,缓存就也不会存在该数据,所有的请求都会直接穿透到数据库。如果被恶意用户利用,疯狂请求不存在的数据,就会导致数据库压力过大,甚至垮掉。
针对这种情况,dhcp vb源码一般可以用布隆过滤器过滤掉不存在的数据请求,但是我们这里id本来就是递增且有序的,其实我们范围大致都是已知的,更加容易判断,超出的肯定不存在,或者请求到的时候,缓存里面放一个空对象也是没有问题的。
作者简介: 秦怀,公众号秦怀杂货店作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
转一篇我自动化学院老乡的秋招w+的心得
文章并非炫耀南信大研究生的薪资水平,这并非普遍现象;也不是鼓动大家投身高强度互联网开发工作;而是告诉大家,只要在南信大“双一流”平台上努力,开房查询源码研究生阶段的学习并不会比某邮、某电、某的研究生差太多。就像南工大一样,我的同事和师弟在阿里等公司工作,南工大计软院也不差。问题的关键在于个人努力,而非学校。
送给在校的南信大研究生们:别沾沾自喜于自己就读于双一流高校,千万别把读研当作玩乐,否则研一玩、研二混、研三开始自责,抱怨南信大这一平台、抱怨南信大远不如某某邮、某某电、某某。
首先:这种薪资待遇在南信大研究生里是否普遍?答案当然是否定。很多人喜欢拿某邮、某电、某的研究生高薪与南信大nuister低薪做比较,得出南信大工科研究生工资低、找工作困难的结论。然而,这样的情况极为罕见。在某些知乎、贴吧微博黑子的言论里,却将南信大工科研究生工资低、找不到工作作为事实。
截止到年月日,据我所知,南信大电信院、计软院、自动化学院研究生大部分偏重理论,实习机会不多,导致这些学院的研究生毕业后从事的非开发类工作较多。
某些知乎、贴吧微博黑子开始拿南信大非开发类的薪资去对比某某邮、某某电、某某开发类的薪资。如果你在南信大学开发类的技术工作,大部分人都是从k、k起步,即便你不是南信大的研究生,其他一般高校的毕业生也差不多。
其次:南信大目前与某某邮、某某电、某某的差距在哪里?
————————————————————大厂的认同,大厂不仅仅只有阿里、腾讯、华为。我们电信院除非是码农才有可能进这些公司,那我们电信院考电信院干嘛,何不考计软院呢?我读研的时候,连海康威视这样的企业都不来南信大校招,我们nuister缺的就是一个‘’头衔。现在呢?我毕业的时候,海康、大华都来了,我的电信院师弟们陆续拿到了“AMD”、“大疆”、“小米”等的offer。现在电信院需要进步的是如何大批量培养优秀人才,大批量送这些企业,时间会证明:南信大为什么叫做南京信息工程大学。
实话实说,截止到现在,喷子和黑子眼中的大厂“腾讯”、“华为”并不太认同南信大研究生的质量。准确地说,并不太了解南信大研究生、本科生的质量。因此,在届本科生新增加了“华为班”、“腾讯班”,包实习的那种。说白了,也就是南信大要让更多的nuister让那些大厂明白:其实南信大优秀的本科生、研究生们也不差!!
贴一张年本科理科的投档线统计,黑子们不会以为学校不给你解封、学校不给你点外卖、学校不给你啥啥,把学习和生活中的失败发泄到贴吧、知乎、微博上就能动摇那些对南信大充满向往的学弟学妹们吗吧?还快跑?快跑?快跑?
最后:物以类聚、人以群分。为什么我身边的师弟师妹大都是年薪w+,甚至几个w+,到你们某些人眼里南信大研究生就是底薪低能了?
希望那些对南信大充满向往的准研究生们也千万别被这w+的年薪冲昏头脑、这不代表普遍。尤其是电信院、计软院、自动化学院其实这几年报考人数还是蛮多的、尤其是计软院。报考请结合自身能力量力而行。
至于那些正在读研的准研究生们:开发是高薪的为数不多的出路,开发也不仅仅是我这里说的大数据开发、我干的前端开发、电信院也有fpga开发、算法岗位开发、图像处理开发等等。开发大概率意味着如果你想要高薪,至少研一的时候就要开始准备学技术,研一研二在保证毕业的前提下,要反复刷技术、刷面试题,有机会的还要去实习实习。这样拿w+的概率才大,这也意味着你读研的时候别人还在吃喝玩乐你在学技术、别人缩在被窝里睡懒觉、你在赶去实习公司的地铁上。这也意味着可能你工作后大概率会,大概率会加班。也并不是所有人都向往大厂的生活,至少我本人不羡慕。
下面是他刚刚考上自动化学院(那个时候还叫信控院),他问我什么最赚钱,我跟老乡说:码农赚钱,算法类大数据类的码农更赚钱。
部分微信聊天记录:
我老乡的贴吧原文:
楼主秋招算是顺利结束,目前到手的offer里面,最高总包年薪是 w(不算杭州 3w + 3w 人才补贴),公积金全额 * %。趁国庆没什么事,写一点面经给计算机的或者想转计算机的学弟学妹们,仅当参考。
先下个我个人的结论,以我秋招的所见所感,南信大的学生真不差,南信大这个牌子也能达到大厂及格线,只是学校的培养体系所培养出来的孩子横向的项目实践能力普遍太弱了。大家多花点时间,最好找个实习,有很大机会进互联网中厂甚至大厂。
说一下我个人的情况,本人是非科班硕,计算机几乎零基础(本科学过一点 C 语言),花了大约一年时间自学 Java 和 大数据。针对Java、MySQL、Redis、设计模式、计算机网络、操作系统等内容,我看了 CSNotes 和 JavaGuide 这两大著名八股文项目,百度或者 GitHub 就能搜到,JVM 和 JUC 部分我看了黑马满一航的视频(比较适合新手)以及《深入理解Java虚拟机》和《Java并发编程的艺术》这两本书,看完应付面试足够。大数据(Hadoop、Flink、Spark、Kafka)看了尚硅谷全套视频。尤其是Kafka,我研究过源码,然后面试官都挺喜欢问这个的,这算是我的加分项,所以我建议有时间可以看看Spring、Hadoop等框架源码。
其实非科班的我最头疼的就是算法题,刚开始一头雾水,复杂度都不知道是什么,然后我到LeetCode上面刷“剑指offer”,几乎全程背诵 Krahets 的题解(真的是一点思路都没有)。慢慢的背多了,自己也能摸索出一些套路,后面连着背+理解刷了剑指offer和Leetcode有道,道应付大厂的普通题目绰绰有余了。
另外就是实习,我在秋招前找了份实习工作,没学到什么技术,但是我觉得实习至关重要,比大部分比赛都重要,几乎每个面试官都喜欢深挖实习的项目,如果他们看不到项目就会一直问你基础,一道答不出来几乎凉凉,风险太大。
最后秋招前的突击阶段,我花了很大精力在牛客网上,牛客有很多真实面经(基本无答案),我就看面经的问题,顺着问题自己心里面默答,如果发现这题不会,我就去立刻百度。大多数面试都是这种八股文 + 项目 + 算法题!
转码过程挺艰辛的,但是终究有回报。希望学弟学妹们珍惜你的时间,好好努力。