一、背景
现在在各种圈的产品各种推广地址,由于URL地址过长,不美观、不方便收藏、发布、传播以及各种发文字数限制等问题,微信、微博都在使用短链接技术。最近由于使用的三方的生成、解析短链接服务开始限制使用以及准备收费、不方便统计分析、不方便流控等问题,决定自建一个短地址服务。
二、原理
比如,http://a.b.com/15uOVS 这个短地址
第1步,浏览器请求这个地址
第2步,通过DNS后到短地址服务端,还原这个短地址对应的原始长地址。
第3步,请求http 301 或302到原始的长地址上
第4步,浏览器拿到原始长地址的响应response
三、实现
短地址服务的核心是短地址和长地址的转化映射算法。
最简单的算法是把原来的长地址做MD5摘要记为key,长地址记为value。把key value放入服务端缓存中比如redis中。
反向解析时通过URL解决出key来,比如上面的短地址key = 15uOVS 。然后通过key去缓存中获取原始长地址value实现URL地址还原。
MD5摘要有几个明显的问题:
1、短地址的长度受限,比如MD5后的数据长度是32位,需要进行分段循环处理,使短地址足够短
2、MD5的哈希碰撞问题,有一定的概率重复,解决此问题,需要不断的提升算法的复杂度,有些得不偿失
当然不止MD5实现算法比较多,大家可以自行谷歌。
笔者的实现原理如下:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz这62个字符上,做成6位的短链接码,如开头的例子15uOVS,【 6位62进制数,对应的号码空间为62的6次方,约等于568亿,即可以生成586亿的短网址,基本能满足需求】。
2、把短地址码及长地址,通过key value的形式放入redis和数据库中。
3、写一个过滤器filter 过滤器的执行order设为第一个执行,即值最小