基于发号器构建的短网址系统

原文 标签 IT工具网 短网址 其他

关键词:短网址、分布式、发号器。

短网址原理: 长网址经过某种转换成为短网址,一个长网址可以拥有一个或多个短网址。

long_url => shorten() => short_url

访问短网址时,将短网址经过重定向到长网址。用户在页面上看到的短网址,最后是重定向到了真实的长网址。
short_url => short_server => long _url => backend_server
例子: 访问 http://t.cn/AiH7RkgW , 会访问新浪短网址后台,然后找到对应的长网址url,再重定向访问长地址url,这里长网址是:http://www.ojit.com/ 。

短网址服务提供重定向到长网址的功能,还可以进行点击访问统计,用户地域分析等等统计功能。 像Google、新浪等短网址服务提供商一样,集成类似的后台统计功能。
短网址算法实现: 1、哈希算法把长网站生成32位md5签名的字符串,该字符串被分为4段,每个段8个字节。对于这4个段,8个字节作为16位字符串,0 x3 ffffffffff(30位1)和操作,即忽略超过30位的处理。这30位被分成6段,每个5位数字被用作字母表的索引,以获得特定的字符。为了得到6位的字符串,MD5的总字符串可以得到4个6位的字符串,其中任何一个字符串都可以用作长URL的短URL地址。

2、自增序列二进制转换算法设置全局自增ID,并将此ID转换为62个二进制数。为什么是62?因为[a-z,a-z,0-9]总共有62个字母和数字。短网站的长度是6位,总共62^6~=568亿个组合,基本上就够了。
为了分析用户信息,例如点击吞吐量、访问的IP区域、用户使用的设备,需要创建其他表来帮助实现它。

3、Redis用于设计发送方,redis在内存中存储数据,读写性能比mysql高很多。定义一个全局自增ID密钥short_url_id。生成短网址时,incr(short_url_id)使用生成的ID生成短代码。redis的incr是原子操作,具有良好的性能。从10000开始,可保留1-10000供自己使用。其他细节存储在mysql表中,redis只生成自增序列id,对于redis集群可以使用incrby num,间隔增加。Redis可用性的设计防止了Redis挂断和服务可用。redis可以支持持久性,也可以在mysql表中添加一个字段,在mysql表中存储相应的自增ID和短网址和长网址的映射表数据,但是redis可以作为缓存来提高查询性能。

恢复和跳转短网址是301还是302?301是永久重定向,302是临时重定向。短网址一旦生成就不会更改,因此使用301符合HTTP语义。

相关文章:

tcpdump命令

加载JNI共享库失败(JDK)

Java如何遍历map对象

java - 如何测试一个数组是否包含指定的值

短网址赚钱的方法

做网站的一点总结

iptables命令之禁ping和ddos向外发包