短地址的应用已经普遍化,如微博的140字限制。但是短地址是怎样生成的呢,也许有人会说实现一个转化算法,例如hash、加密。但碰撞呢,URL这种精准的东西~
思路
1、Redis存储已产生的<长地址:短地址>映射,新地址先判定是否存在短地址
2、利用mysql自增主键作为发号器,生成一个长地址、序号的映射,可用转为64位字符串作为短地址
3、短地址存储至Redis、mysql
优化
对于并发量大的系统,可考虑实现多个发号器,如奇偶发号器、区间发号器
对于数据量太大,不想甚至不能缓存所有历史数据的,可以考虑缓存最近一段时间的数据,参考LRU缓存实现JAVA
对于非要找个算法来实现长转短的,记得有一个基于MD5的实现:
- 将长网址经MD5生成签名,可均分成四段,每段类似为16进制字符串
- 每段与16进制0x3fffffff位与操作,得到30位二进制
- 30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串
- 这样一个md5字符串可以获得4个6位串,取里面的任意一个就可作为这个长url的短url地址