短网址生成系统

版权声明: https://blog.csdn.net/qq_41880190/article/details/89404440

短网址生成系统

概述

过长的网址不利于传播,特别是对于微博和 Twitter 等有发文长度限制的网站,短网址生成系统(TinyURL)可以将一个网址变短。在浏览器中输入短网址之后,TinyURL 会将该短网址转换成原始网址并进行重定向。

在这里插入图片描述

生成短网址

TinyURL 生成的短网址格式如下:

img在这里插入图片描述

其中 https://tinyurl.com/ 是域名,所有的短网址都相同,而不同的短网址 ID 部分不同。

可以让 ID 从 0 开始自增。为了保证性能,需要使用多台机器来生成 ID,可以使用分布式 ID 生成器。

TinyURL 使用 AZ、az、0~9 总共 62 个字符,长度为 8,总共可以存储的 ID 数量大约为 1014,完全够用。

可以使用分布式 ID 生成器生成一个数字 ID,然后将其转换成包含其它字符的 ID,相当于十进制转换为六十二进制。

img

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();
    }
}

映射

为了让原始网址和短网址能一一对应,就需要存储双向映射,在输入短网址的时候就能转换成原始网址,并且同一个原始网址也不会重复生成多个短网址。

img

扫描二维码关注公众号,回复: 6151173 查看本文章

存储

映射关系可以表示为键值对,可以使用 Redis 进行存储。但是 Redis 基于内存,内存空间有限,无法存放下海量的键值对。可以使用 LevelDB 这种基于磁盘的键值存储系统来存储海量键值对数据,而使用 Redis 作为缓存。

重定向

TinyURL 会将输入的短网址转换为原始网址并进行重定向,HTTP 主要有两种重定向方式:永久重定向 301 和临时重定向 302。

如果使用 301 的话,搜索引擎会直接展示原始网址,那么 TinyURL 就无法收集用户的 User Agent 等信息。这些信息可以用来做一些大数据分析,从而为 TinyURL 带来收益,所以需要使用 302 重定向。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41880190/article/details/89404440