首页>>短链接
如何优化短链接性能?附解决方案
2023-08-07
114浏览
现在到处都可以看到短网址。许多短消息将包含短 URL。点击短网址链接可以直接跳转到对应的长链接地址。其背后的原理其实很简单。服务器将存储短链接和长链接。对应关系,当收到短链请求时,程序会去程序中找到对应的长链,然后返回给浏览器,让浏览器重定向到长链地址,这就是整个过程要知道如何优化短链接性能,首先要了解

现在到处都可以看到短网址。许多短消息将包含短 URL。点击短网址链接可以直接跳转到对应的长链接地址。其背后的原理其实很简单。服务器将存储短链接和长链接。对应关系,当收到短链请求时,程序会去程序中找到对应的长链,然后返回给浏览器,让浏览器重定向到长链地址,这就是整个过程

要知道如何优化短链接性能,首先要了解:短链是如何产生的?

1684297956574959.png

短链接地址一般为域名+随机字符串,如下所示

如何从原始长链接生成短链接?哈希算法正好可以解决这个问题

Hash算法的特点是可以将任意长度的地址串转换为固定长度的哈希值。比如MD5,SHA的内部算法就是Hash算法,

这两种算法的逆破解难度很大,对应的内部也涉及到大量的计算。用于短网址,不考虑被破解的可能性

所以主要关注的是算法的效率和冲突的概率。

MurmurHash 是一种 Hash 算法,以效率高、冲突概率低而著称。 Redis、Google 的 guava 和 apache 的 commons-codec 都有这个算法的内部实现

这里我们选择MurmurHash中32bits的生成方式去生成短链接,我复制了谷歌的实现代码


public class HashUtil {

    private static final int c1 = 0xcc9e2d51;

    private static final int c2 = 0x1b873593;

    private static final int r1 = 15;

    private static final int r2 = 13;

    private static final int m = 5;

    private static final int n = 0xe6546b64;

    private static final int DEFAULT_SEED = 0;

    private static int hash32(byte[] key, int seed) {

        int hash = seed;

        final int len = key.length;

        int i = 0;

        int k = 0;

        for (; i + 4 <= len; i += 4) {

            k = ((key[i + 3] & 0xff) << 24)

                    | ((key[i + 2] & 0xff) << 16)

                    | ((key[i + 1] & 0xff) << 8)

                    | (key[i] & 0xff);

            k *= c1;

            k = Integer.rotateLeft(k, r1);

            k *= c2;

            hash ^= k;

            hash = Integer.rotateLeft(hash, r2);

            hash = hash * m + n;

        }

        int k1 = 0;

        switch (len - i) {

            case 3:

                k1 = (key[i + 2] & 0xff) << 16;

            case 2:

                k1 |= (key[i + 1] & 0xff) << 8;

            case 1:

                k1 |= key[i] & 0xff;

                k1 *= c1;

                k1 = Integer.rotateLeft(k1, r1);

                k1 *= c2;

                hash ^= k1;

        }

        hash ^= len;

        hash ^= hash >>> 16;

        hash *= 0x85ebca6b;

        hash ^= hash >>> 13;

        hash *= 0xc2b2ae35;

        hash ^= hash >>> 16;

        return hash;

    }

    public static int hash32(String str) {

        return hash32(str.getBytes(), DEFAULT_SEED);

    }

}

我们使用这个算法对这个 URL 进行哈希处理并得到结果:-1251719704

这是一串十进制整数值。如何将其转换为字符串?我们可以将其转换为十六进制。常用的62位合法字符有0~9、a~z、A到Z等62个字符。

转换算法我也会贴出来

private static String to62HEX(int num) {

        num = Math.abs(num);

        String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

        StringBuilder sb = new StringBuilder();

        int remainder;while (num > 62 - 1) {

            remainder = Long.valueOf(num % 62).intValue();

            sb.append(chars.charAt(remainder));

            num = num / 62;

        }

        sb.append(chars.charAt(Long.valueOf(num).intValue()));

        return sb.reverse().toString();

    }

通过上面的算法,-1251719704可以转化为:1mI5tu

通用解决方案(如何优化短链接性能):

高性能短链接(短网址)算法,计算出来的字符串和域名可以拼接起来

这样我们就成功得到了一个短链URL,只需保存短链和长链的映射关系

6位十六进制数可以表示568亿个数字,足够了

如果有Hash冲突怎么办?

一般情况下,为了防止相同的短链出现在数据库中,我们会以新生成的短链作为查询条件来查询数据库,看是否存在相同的短链

如果有,别着急,看看我们处理的长链的地址与这条短链对应的长链是否相同。如果相同表示传入的长链是重复的,那么我们可以直接直接取这个短链。使用,无需再次储存。

如果不一样,说明有冲突。这时候我们可以在长链中加入一串特殊字符,然后进行哈希运算。如果这次没有冲突,我们可以用这个特殊字符拼接长链。与短链一起存储在数据库中

下次收到短链请求后,截断特殊字符再重定向

确定哈希冲突优化

以上方法判断是否发生哈希冲突,效率不是很高。您必须每次都查询数据库。事实上,哈希冲突的概率很低。当没有冲突时,就会有性能损失。如何优化它

我们可以为表中的短链列添加唯一索引。在程序中计算好短链后,我们就不需要查表直接保存了。如果成功,则说明不存在Hash冲突。是不是一样。然后重新计算——保存...

这样做的好处是,在没有哈希冲突的情况下,总的 SQL 语句执行次数会大大减少。只有发生哈希冲突时才需要重新操作,哈希冲突的概率很小。

还可以使用bloom filter优化sql条数。首先,构建一个存储短链的布隆过滤器。每次生成短链时,使用布隆过滤器判断是否重复。这种方法还可以减少sql查询次数

总结

我总结一下如何优化短链接性能,这个算法的核心思想

通过高效的哈希算法生成哈希值,将哈希值转换为十六进制,然后得到一个短网址后缀。

hash冲突的解决方法是给URL加一个固定的后缀,进行hash操作,直到不重复为止。

我粗略测试了一下,生成100万条短链只需要200毫秒,效率还是很高的。测试代码如下

public class ShortUrlTest {

    public static void test(){

        int size = 1000000;

        String[] urls = new String[size];

        for (int i = 0; i < size; i++) {

            urls[i] = "https://time.geekbang.org/column/article/80850" + UUID.randomUUID().toString();

        }

        System.out.println("数据填充完成");

        long l = System.currentTimeMillis();

        for (String s : urls) {

            String shortUrl = ShortUrlGenerate.generate(s);

        }

        System.out.println(System.currentTimeMillis() - l);

    }

    public static void main(String[] args) {

        test();

    }

public class ShortUrlGenerate {

    public static String generate(String originalUrl) {

        return to62HEX(HashUtil.hash32(originalUrl));

    }

    /**

     * 10进制转26进制

     *

     * @param num

     * @return

     */

    private static String to62HEX(int num) {

        num = Math.abs(num);

        String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

        StringBuilder sb = new StringBuilder();

        int remainder;

        while (num > 62 - 1) {

            remainder = Long.valueOf(num % 62).intValue();

            sb.append(chars.charAt(remainder));

            num = num / 62;

        }

        sb.append(chars.charAt(Long.valueOf(num).intValue()));

        return sb.reverse().toString();

    }


短连接监测数据已成为网络广告运营中的重要一环。它可以跟踪特定网站或页面的点击量和转化率,帮助推广者准确评估广告效果和用户反应。然而,市场上的监测工具各不相同,很难确定哪种是最可靠的。首先,监测工具的数据源必须真实可靠。某些流量来源可能会造成垃圾点击,导致数据误差加大。因此,监测工具需要具备对来源进行...
09-15
短连接监测数据,监测工具,数据源
在如今这个数字化时代,网站已经成为人们获取信息的最主要来源之一。然而,许多网站的访问速度却让人不满。为了提高网站的性能,短连接测试这一技术被广泛应用。本文将介绍相关知识,让您对这个技术有更深入的了解。什么是短连接测试?短连接测试是一种测试技术,旨在测量网络连接的响应时间和延迟。在网站开发中,短连接测试...
09-15
短连接测试,短连接专业的工具
短连接接口是一种将长URL转换为短URL的服务,它在互联网应用中被广泛使用。本文将介绍短连接接口的实现及应用。一、短连接接口的实现短连接接口的实现需要借助于URL缩短服务,在复杂的网络环境下,高速、安全、可靠的短链接生成服务往往可以帮助开发人员更好地开发和设计各种网站、应用程序。我们可以从多个渠道获取URL缩短...
09-15
短连接接口,URL数量,有效期
短连接变长连接的背景及意义在现代互联网的生态环境中,搜索引擎被誉为“信息时代的门户”,它是网站获取流量的重要渠道之一。而SEO搜索引擎优化则成为了网站流量获取的重要工具。短连接变长连接是SEO优化中的一项重要的技术,其意义在于让搜索引擎识别同一网站中的不同页面,从而提高网站的排名,并增加网站的曝光度和访问...
09-15
301重定向,短连接,长连接
短连接加密生成是什么?短连接加密生成是一种将长连接(URL)缩短并进行加密处理的技术。它可以将长连接转化为一串短字符,使得URL更易于记忆和分享,也更美观。同时,通过加密处理,可以保护网站的数据安全性。为什么需要短连接加密生成?在互联网时代,链接是信息传播的重要形式。传统的长链接比较复杂且难以记忆,而且过长的...
09-15
短连接加密生成,短链接分享,加密处理
短连接服务在互联网时代已经成为了一项必不可少的工具,因为它不仅可以减少URL长度,还可以帮助用户分享和传播信息。变色龙云作为一款全球短连接服务的新宠儿,越来越受到网民们的欢迎。与传统的短连接服务相比,变色龙云具有诸多优势。首先,它可以生成高精度短连接,可以将长链接压缩至短链接,从而减少输入成本,提高使用...
09-15
传统的短连接服务,访客的地域分布
近年来,网络互连日益普及,数据交流也成为人们日常生活中不可或缺的一环。随着移动设备的普及,数据传输的速度和实时性也成为用户关注的焦点。短连接SDK应运而生,成为许多企业数据交流的首选。本文将从短连接SDK的基本原理、优势和应用场景三个方面进行阐述。一、短连接SDK的基本原理短连接SDK是一个跑在客户端的轻量级信...
09-15
短连接SDK,轻量级,API接口
如果你需要推广一篇博客文章或者一款新产品,让潜在客户尽快接触到你的品牌,那么短链接生成器是一个非常有用的数字营销工具。这些工具可以快速缩短复杂的URL,提高分享和点击率,同时还可以帮助你更好地跟踪和分析营销数据。首先,让我们看一下短链接的优势。长长的URL经常很难记忆并且看起来也很笨重。它往往会压缩在一条...
09-15
短链接,短链接api,域名标红
在日常使用互联网时,偶尔会遇到访问失败的情况。这可能是由于网站维护、服务器崩溃、网络错误或者被封禁等原因导致的。如果是前几种情况,我们可以耐心等待或寻找其他可行的解决方案。但如果是被禁用了,我们该如何处理呢?短链接恢复可以帮助我们解决这一问题。所谓短链接,是指将原始链接转化为较短的URL地址。这种方式可...
09-13
第三方短链接平台,Hosts文件,DNS映射
短链接平台已成为现代社会中不可或缺的一部分。短链接通过将长链接转化为短链接,让我们方便地在社交媒体、聊天软件、网站等平台上分享链接内容,提高我们的工作效率和生活便利性。一些短链接平台如变色龙提供了简单的短链接服务,并且没有额外的费用。这些平台还提供了一些统计信息,如短链接访问次数、地理位置等,使你更...
09-13
自己的短链接平台,短链接平台