专精于互联网人肉搜索的青少年,在这方面爱好也敌不过兴趣。
就在这时,汤姆的声音又传来。
“你现在写什么语言?”
“python。”陈哲答。
汤姆颔首,目光落在河面上。
“python挺好入门的,”他说,“不过后端的话,迟早得学go或者java。看你以后想走什么方向。”
陈哲刚要开口,身后传来本的拍手声。
“都过来一下!”
人群重新聚拢。本站在中间,手里不知从哪掏出一块白板,大概a3纸大小,上面贴着一张纸,纸上写着一行字。
陈哲走近了才看清那行字是什么。
“设计一个url短链接服务”
本把白板举高了点,让所有人都能看见。
“来,玩个游戏。”他说,语气里带着一点兴奋,“这玩意儿大家都不陌生吧?短链接服务,bitly那种。给你一个长url,生成一个短码,访问短码的时候重定向到原地址。”
他顿了顿,目光扫过人群。
“规则很简单:每个人三分钟时间,想一下怎么设计。可以讨论,也可以自己想。三分钟之后,每个人轮流说自己的思路。”
有人笑了一声:“面试来了。”
本也笑了:“面试?没意思。这是游戏,随便聊。谁说得有意思,我请他喝咖啡——不是楼下那种,是正经的第三波咖啡。”
“更何况,这种事我们之前的聚会也做过,不是吗?”本嘴角上扬。
人群里响起几声口哨。
陈哲站在原地,目光落在那行字上。
url短链接服务。
简单来说,url短链接服务就是一种将冗长的网址(url)转换为简短地址的工具。当用户点击短链接时,会被自动重定向到原始的长网址。
这东西他见过,用过,但从来没想过怎么设计。
三分钟。
他开始想。
……
最开始想到的是最简单的,一个数据库表,两个字段,长url和短码。用户提交长url,生成一个随机字符串,存进去。访问的时候查一下,重定向。
但这样太简单了。随机字符串碰撞怎么办?重复的url要不要复用同一个短码?访问量大的时候数据库扛得住吗?
过了半分钟,他想到了哈希。把长url用d5或者sha256哈希一下,取前几位作为短码。但哈希冲突怎么办?再加个盐?还是用布隆过滤器先判断一下?
随后,陈哲想到了缓存。
高频访问的短码可以放redis里,不用每次都查数据库。但缓存失效怎么办?缓存雪崩怎么办?
再接着,他想到了分布式。如果服务做大了,单机扛不住,得用分布式id生成器。雪花算法?还是用数据库自增id然后取模?
一分钟,他想到了更多。
短码过期怎么办?自定义短码怎么支持?统计点击量怎么实现?防攻击怎么搞?
……
三分钟到。
本的拍手声把陈哲从思考里拉出来。
“行,时间到。”本说,“谁先来?”
人群安静了一秒。
“我来吧。”
说话的是汤姆。他往前站了一步,清了清嗓子。
“最简单的设计:一张表,id自增,长url字段,短码字段。短码可以用id的62进位表示,0-9a-za-z,一共62个字符。id从100000开始,保证至少六位短码。”
他顿了顿。
“优点是简单,不会冲突。缺点是自增id容易被遍历,可以加个随机偏移量。访问量大的时候加缓存,redis存热点数据。如果要做大,分库分表,按短码哈希分片。”
他的语气中充斥着自信,毫无疑问这是个比较优越的答卷。
本点了点头,没评价。
“下一个。”
莱拉站出来。
“我会用哈希。长url做d5,取前六位。如果冲突了,加个盐重新哈希,或者用布谷鸟哈希的思路。优点是短码随机,不容易被猜。缺点是要处理冲突,性能稍微差点。”
本还是点了点头。
“下一个。”
接下来几个人轮流发言,思路都大同小异——数据库、哈希、缓存、分片。有人提到了用nosql,有人提到了用消息队列做异步统计,有人提到了用cdn加速。
陈哲一直不语。