短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。
最后,求教
以上都是初步的浅陋的想法,望大神们赐教。
- 短url 原理与实现
- 短址(short URL)原理及其实现
- 短址(short URL)原理及其实现
- 短址(short URL)原理及其实现
- 短址(short URL)原理及其实现
- 短址(short URL)原理及其实现
- URL短地址压缩算法 微博短地址原理解析(再转与Java实现)
- 长URL转短连接的简单设计与实现
- URL短网址生成算法原理
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- 短址(short URL)原理及其实现 来源:http://blog.csdn.net/beiyeqingteng
- 【转】微博URL短网址生成算法原理及(java版、php版实现实例)
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- 短址原理及其实现
- Handle的一些用法
- Android 如何通知用户更新app的版本
- Ubuntu下的文件比较工具--meld
- jquery操作属性
- 算法#09--用简单的思维理解选择、插入、冒泡和希尔排序
- 短url 原理与实现
- wget下载目录下的文件
- LeetCode | Longest Palindromic Substring
- 多括号匹配——栈的应用
- windows7下的PHP+apache+mysql+eclipse for php 开发环境搭建
- PopupWindow showAtLocation和showAsDropDown参数分析
- ios修改placeholder字体颜色的方法
- php大文件切割和合并
- DFS问题