昨天知道126.am短链接服务下线了,觉得挺可惜的,就决定利用163.gs做一个短链接服务。
于是就这么开搞了。
为了追求最高效地完成想法,语言当然首选Python,框架也直接就用了最喜欢的Tornado。数据库也直接使用了Redis。因为短链接这种业务还是非常适合使用key-value数据库来做。
数据存储
对于短链接,使用什么数据存储比较合适呢?
最简单的方法是当然是直接在内存里面搞个hash表,然后将数据塞到里面就ok了,这样速度当然是最快的,不过这样如果要多个进程或者多个机器的进程共享数据,就比较蛋疼了,而且这样数据保存和备份都比较麻烦。
另一种比较靠谱的方案是存到key-value数据库中,个人比较喜欢redis,所以就存到了redis里面。
短链接的生成
对于短链接的生成,最简单的方法当然就是直接搞个自增id,生成一个新的就加1(或者类似的方案),不过这样数据库中的链接总量不就暴露无遗了么?而且可以直接遍历出所有的链接,不过这应该不是啥问题。
觉得看上去比较酷的方案是随机生成一个字符串作为短链接。大家一般都是使用62进制。
26个小写字母、26个大小字母再加上10个数字,一个62个。然后我这里暂时用了5位。以后如果有需要再加到6位。
(26 x 2 + 10) ^ 5 = 916132832
虽然只是5位,但是可以表示916132832个域名。
冲突处理
如果随机生成出来的key和已有的冲突,那么就重新生成,直到找到一个空的槽。对于数据量比较小,桶比较空,产生冲突的概率应该极低。
重复的url
生成url前会查一查这个url是否已经生成过了,如果生成过了,那么就直接返回它的短链接。
所以这里要求我们不仅需要存储short_url => long_url的映射,还需要存储long_url => short_url的映射。
因为都直接存到一个redis db里面,所以前面加了前缀。例如
短链接到长链接的映射:id:iEw2H => url:http://EverET.org/。
长链接到短链接的映射:url:http://EverET.org/ => id:iEw2H。
短链接的访问
例如在你访问http://163.gs/iEw2H这个短链接的时候,服务器返回301重定向,然后浏览器读Location头到指定网站。
1 2 3 4 5 6 7 8 |
@ ~/projects/shorturl git:(master) % curl -i http://163.gs/iEw2H HTTP/1.1 301 Moved Permanently Date: Tue, 13 May 2014 13:04:26 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 0 Connection: keep-alive Location: http://EverET.org/ Server: TornadoServer/3.1.1 |
短链接生成接口
非常简单,直接POST到http://163.gs/short/即可,参数是url。
curl -d "url=http://EverET.org" http://163.gs/short/
已知问题
因为生成没有加锁,所以可能出现的问题是如果创建短链接的并发很大的时候,可能会有极低概率出现2个不同的url申请,返回同一个短链接。
这个可以通过加锁来解决。这个日后有这个需要了再继续添加了。
另一个问题是目前只支持http协议,生成出来的短链接都是http协议的。
结
昨晚(2014-5-12)下班之后得知126.am下线了,我们部门貌似还是有些产品使用了126.am短链接服务,所以觉得挂着126、163的名号的短链接服务还是有一定存在价值,于是头脑发热花了3个半小时在163.gs做一个短链接服务(当然不是网易官方出品)(另外真是头脑发热,还在发烧,吃完退烧药就开始coding)。 –_–||
对于这个短链接服务,其实也不奢望会有多少用户,不过我还是会尽可能地保证它的可用性。
另外我也会继续改进,作为自己的产品、自己技术追求,没有deadline,没有脑残的需求方,可以好好雕琢里面的代码,按照自己的想法去做。
最后,代码当然是open source的 –>url-shorten。
Update:
2014-05-14
发了第二天就发现163.gs被微博、微信和360屏蔽了,访问就提示存在安全隐患,个人的短网址服务就是被大厂鄙视。真是悲催…
2014-05-16
经过申诉,腾讯和360、微博解封了163.gs,腾讯电脑管家和360的申诉还是挺不错的,赞一个!
PermaLink:
http://everet.org/2014/05/short-url-163-gs.html
Tags:
Python,Redis,Tornado
由 udpwork.com 聚合
|
评论: 0
|
要! 要! 即刻! Now!