短url 原理与实现

来源:互联网 发布:unity3d 积木游戏 编辑:程序博客网 时间:2024/05/17 06:55

问题描述

微博的长url可以转为短url,这个是怎么实现的呢?

要求通过短url也可以查到原来的长url,怎么实现?

当规模变大的时候,怎么保证性能?

参考

关于短网址算法的问题

短链接、短网址使用的是什么算法?

GitHub:dylang/shortid

腾讯微博长url变成短url的算法是怎样的

使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)

总结

数据库查询

使用数据库来存储短URL和长URL的对应关系。(假设短url都是6位的长度)

新建数据表,其中有两列,id(自增id)和longURL(unique)

CREATE TABLE `shortURL` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `longURL` longtext NOT NULL UNIQUE,                PRIMARY KEY (`id`));

插入

插入长URL:插入新的长URL时先判断长URL是否已存在,存在的话不插入。

查询 长->短

根据长URL计算短URL:引入62进制,(0-9,a-z,A-Z)->(0-61), 将自增id转化为6位62进制,如id=1,对应的62进制为000001,若id=64=62*1+2,对应的62进制为000012。Python代码如下:

alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"def getShortUrlById(id, alphabet=alphabet):    '''    get short url by id    :param id:    :param alphabet:    :return: string    Example:    >>> getShortUrlById(0)    '000000'    >>> getShortUrlById(62)    '000010'    >>> getShortUrlById(10242665433)    'bbbbbb'    '''    res = []    alen = len(alphabet)    while id:        res.append(alphabet[id % alen])        id = id / alen    while len(res) != 6:        res.append('0')    res.reverse()    return ''.join(res)

有了这个函数之后,要查询长URL对应的短URL就很方便了。先在数据库中查询长URL的id,然后调用这个函数得到id转化出来的短url即可。

查询 短->长

调用函数,将短url转化为对应的id,然后查数据,找到id对应的长url。代码如下:

alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"def getIdByShortUrl(shortUrl, alphabet=alphabet):    '''    get id by short url    :param shortUrl:    :param alphabet:    :return: id    Example:    >>> getIdByShortUrl('000000')    0    >>> getIdByShortUrl('000010')    62    >>> getIdByShortUrl('bbbbbb')    10242665433L    '''    res = 0    alen = len(alphabet)    for i in range(0, 6):        res += alen**(5-i) * alphabet.index(shortUrl[i])    return res

实际使用(个人猜想)

在开发网站时,假设我拥有shortUrl.cn的域名,如果接收到shortUrl.cn/bbbbbb的请求,我的网页应用就匹配bbbbbb,然后调用函数getIdByShortUrl('bbbbbb'),可以得到id,再查数据库得到长url,最后redirect到长url。

扩大规模

如果我有多台服务器来实现这一个功能,建多个数据库,每个数据库存放一个范围的id的短url-长url的匹配表,然后接收到请求的时候,可以根据短url算出id,再根据id落入哪个数据库的范围,将查询派发给相应的数据库服务器。

6位的62进制数可以表达的范围是0~56800235583,每次接收到一个短url,算出id值,可以将id%10,哈希到10台机器上,id%10 == 0的数据存放在0号机器,id%10 == 1的数据存放在1号机器。。。以此类推,插入和查询都按照这个规律来。

当我接收到请求shortUrl.cn/bbbbbb,可以算出id为10242665433,10242665433%10=3,哈希后,去3号数据库查询url。

最后,求教

以上都是初步的浅陋的想法,望大神们赐教。

0 0
原创粉丝点击