短网址服务

短网址源于Twitter中140个字符的限制,有时候一个长网址就占了100个字符,所以需要一个服务将长网址转化为短网址,比如百度短网址服务。

通常短网址服务需要两个接口:

  • 生成短网址
  • 根据短网址查询长网址

当直接访问短网址时,短网址服务器返回一个302和真实网址,然后浏览器会再去访问长网址

生成短网址

短网址可以类比DNS,也是内部维护了一套对应关系然后提供访问:

短网址设计关键点在于后缀token的算法,这里给出一种:

CHARS = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789"

我们将token认为是一个64进制的数,那8位64进制的数完全可以满足短网址申请的数量且不重复。

基本过程如下:

long_url -> redis.incr(index) -> 10_to_64(index) -> token

当然10_to_64返回的是一个字符串而不是真正的数字,基本实现如下:

def 10_to_64(num):
    if num == 0:
        return CHARS[0]
    res = []
    while num:
        num, rem = divmod(num, len(CHARS))
        res.append(CHARS[rem])
    return ''.join(reversed(res))

获取到token后只要和URL一起存入数据库即可

根据短网址查询长网址

查询时从短网址中解析出token然后查询数据库即可,基本过程如下:

short_url -> token = parse(short_url) -> select url from database where token=`token` -> url
原文地址:https://www.cnblogs.com/Peter2014/p/11627932.html