闽公网安备 35020302035485号
短链系统相信大家都不陌生,业务逻辑也很简单,但从架构角度,许多点是需要我们可以深入了解的。在各类大厂的面试中,如何设计一个短链系统,也是设计题中的高频问题。下面从系统架构设计的角度,为大家介绍下短链系统的设计与实现,本文会重点介绍几个个人认为比较关键的地方,让大家看完后,能够真正了解设计一个短链系统的方方面面。
采用随机数来实现,6个字符,每个字符都用随机数产生(用0~63的随机数产生一个Base64编码字符)。为了避免随机数产生的短 URL 冲突,我们在预生成的时候检查该 URL 是否已经存在(用布隆过滤器检查)。因为预生成短URL是离线的,所以这时不会有性能方面的问题。
`Wdj4FbOac5CHtvPD`预生成时,我们读取文件6000K数据,也就是一次预加载100W个短链,并记载偏移量,方便下次读取。
redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN由于我们每次加载100W个短链,按照日均1600W的短链数据量预估,我们可以设置一个5分钟的定时任务,如果列表数量不足1w,就继续去HDFS中加载即可。
redis 127.0.0.1:6379> LLEN KEY_NAME用户非自定义生成短链
redis 127.0.0.1:6379> LPOP key将短URL与长URL的映射关系存储在 HBase 数据库中。


如果缓存没有用户请求访问的短 URL,短 URL 服务器将访问 HBase 短 URL 数据库服务器集群。如果数据库中存在该短 URL,短 URL 服务器会将该短 URL 写入缓存服务器集群,并构造重定向响应返回给客户端应用。如果 HBase 中没有该短 URL,短 URL 服务器将构造 404 响应返回给客户端应用。
满足短 URL 重定向要求的 HTTP 重定向响应码有 301 和 302 两种,其中 301 表示永久重定向,即浏览器一旦访问过该短 URL,就将重定向的原始长 URL 缓存在本地,此后不再请求短 URL 生成器,直接根据缓存在浏览器(HTTP 客户端)的长 URL 路径进行访问。302 表示临时重定向,每次访问短 URL 都需要访问短 URL 生成器。
一般说来,使用 301 状态码可以降低服务器的负载压力,但无法统计短 URL 的使用情况,我们的架构设计完全可以承受这些负载压力,因此使用 302 状态码构造重定向响应。