版权声明: https://blog.csdn.net/qq_41880190/article/details/89404440
短网址生成系统
概述
过长的网址不利于传播,特别是对于微博和 Twitter 等有发文长度限制的网站,短网址生成系统(TinyURL)可以将一个网址变短。在浏览器中输入短网址之后,TinyURL 会将该短网址转换成原始网址并进行重定向。
生成短网址
TinyURL 生成的短网址格式如下:
其中 https://tinyurl.com/
是域名,所有的短网址都相同,而不同的短网址 ID
部分不同。
可以让 ID 从 0 开始自增。为了保证性能,需要使用多台机器来生成 ID,可以使用分布式 ID 生成器。
TinyURL 使用 AZ、az、0~9 总共 62 个字符,长度为 8,总共可以存储的 ID 数量大约为 1014,完全够用。
可以使用分布式 ID 生成器生成一个数字 ID,然后将其转换成包含其它字符的 ID,相当于十进制转换为六十二进制。
public class TinyURL {
private static final char[] alphabet = ("ABCDEFGHIJKLMNOPQRSTUVWXYX" +
"abcdefghijklmnopqrstuvwxyz0123456789").toCharArray();
private static final int N = alphabet.length;
private static final int LEN = 8;
private static final long MAX_ID = (long) Math.pow(N, LEN);
public static String generatorTinyURL(long id) {
if (id < 0 || id > MAX_ID) {
throw new IllegalArgumentException("id out of range.");
}
StringBuilder builder = new StringBuilder();
while (id != 0) {
builder.append(alphabet[(int) (id % N)]);
id /= N;
}
while (builder.length() != LEN) {
builder.append("0");
}
return builder.toString();
}
}
映射
为了让原始网址和短网址能一一对应,就需要存储双向映射,在输入短网址的时候就能转换成原始网址,并且同一个原始网址也不会重复生成多个短网址。
扫描二维码关注公众号,回复:
6151173 查看本文章
存储
映射关系可以表示为键值对,可以使用 Redis 进行存储。但是 Redis 基于内存,内存空间有限,无法存放下海量的键值对。可以使用 LevelDB 这种基于磁盘的键值存储系统来存储海量键值对数据,而使用 Redis 作为缓存。
重定向
TinyURL 会将输入的短网址转换为原始网址并进行重定向,HTTP 主要有两种重定向方式:永久重定向 301 和临时重定向 302。
如果使用 301 的话,搜索引擎会直接展示原始网址,那么 TinyURL 就无法收集用户的 User Agent 等信息。这些信息可以用来做一些大数据分析,从而为 TinyURL 带来收益,所以需要使用 302 重定向。