写了个短链接服务163.gs

  • Post author:
  • Post category:IT
  • Post comments:0评论

昨天知道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

发表回复