短URL的系统设计

短URL的系统设计

短url服务好像最早就是因为twitter和weibo之类的媒体有字数限制,为了使得用户尽可能的在一条twitter中表达自己的意思,产生了缩短url的需求。
, 短url系统要做的事情其实很简单,就是用户输入一个比较长的url, 比如www.baidu.com/aaa/xxx/dcc/asdasd/asda
可以返回一个相对比较短的url,比如:b.com/aL。后来也有一些独立的短url服务提供商。

短url的作用

  • 发推少占用字数
  • 短网址可以自定义,这样便于记忆(这个好像大多数服务提供商都不支持)
  • 数据分析,比如统计热url
  • 增加跳转时间,比如5秒以后跳转,在这个过程中增加广告展示 不得不说想出这个想法的人真聪明。

短url使用过程

  • 用户使用原始地址:www.baidu.com/aaa/xxx/dcc/asdasd/asda生成短url:b.com/aL
  • 用户使用短url:b.com/aL访问
  • 后台系统根据b.com/aL反查询原始的url,得到:www.baidu.com/aaa/xxx/dcc/asdasd/asda
  • 后台系统返回302状态码,将响应头中的Location设置为www.baidu.com/aaa/xxx/dcc/asdasd/asda
  • 浏览器重新向www.baidu.com/aaa/xxx/dcc/asdasd/asda

系统设计的核心点

短url使用62进制表示

为了尽可能的使得生成的url比较短,一般都采用62进制的表示方式,为什么是62进制呢,因为大家比较熟悉的0-9,a-z, A-Z加起来是10+26+26=62。
虽然还有很多的其他字符,但是无论是用户识别还是用户输入都不太方便,所以一般都裁员62进制。62的6次方大约为560亿,7次方超过3万亿了,足够了。

长url映射为短url的算法

为了避免hash冲突,所以并没有使用常见的hash函数,而是采用了发号的方式:

  • 用户使用原始地址:www.baidu.com/aaa/xxx/dcc/asdasd/asda
  • 发号器给予自增的十进制的数字,比如:0
  • 十进制的数字0对应的是62进制的字母a
  • 因此生成的url为:b.com/a (此处假设短url服务的域名为b.com)

短url到长url

  • 用户使用短url:b.com/a
  • 根据a查询到对应的原始url为:www.baidu.com/aaa/xxx/dcc/asdasd/asda
  • 进行浏览器302重定向

发号器的实现

发号器本文中使用的是自增的序号,比如,1,2,3之类的。有很多中现成的方式,比较经典的就是雅虎之前提出的:
使用3台redis机器:A, B, C,这三台机器的起始值为0,1,2。每次的步长为3(也就是机器的个数),
依次访问A, B, C机器,因此会得到 0,1,2, 3, 4, 5…..
当然也有其他的分布式id生成方法,可以参考本文参考资料中给出的链接

url映射关系的存储

存储一般采用redis进行存储,当然其他存储方式也不是不行

  • 如果业务上严格要求长短url的映射关系必须永久1对1的话,那么就只能全量存储了: 原始的长url, 62进制的短url编号。剩下的问题就是只是如何快速查询和反差了。
  • 如果业务上不要求严格的一一对应的话,那么可以使用LRU cache来处理。如果新请求的url在cache中,直接返回对应的url,如果不在cache中,则按照新的url来处理。

关于HTTP 301、302状态码的解释

301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL。页面跳到了这个新的url指向的地方。
301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。同时对服务器压力也会有一定减少。但是如果使用了301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。
关于HTTP中的301和302的状态码的对比,可以参见参考文章中的 http://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary
但是还有一个中国特色就是删帖的问题:「领导让你删除长短url的映射关系,你删了,领导在浏览器中访问,我艹怎么还能跳转。人家可不懂什么缓存不缓存。因为301是客户端缓存了转换结果,不请求服务端」

参考资料

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注