短链平台设计

简介: 一种生产环境可用的短链生成方法,将长度较长、难以识别的长链转换成长度可控的短链,点击短链再跳转回长链的方法

为什么需要短链?
有时候,平台的地址会异常的长,比如一次搜索的地址:

https://www.google.com/search?q=mongodb&sca_esv=567212709&ei=OxAMZdm7PM7ZhwO0wK0w&ved=0ahUKEwiZxd2VtbuBAxXO7GEKHTRgCwYQ4dUDCBA&uact=5&oq=mongodb&gs_lp=Egxnd3Mtd2l6LXNlcnAiB21vbmdvZGIyBxAAGIoFGEMyBxAAGIoFGEMyBxAAGIoFGEMyDRAAGIoFGLEDGIMBGEMyBxAAGIoFGEMyBxAAGIoFGEMyBxAAGIoFGEMyBxAAGIoFGEMyBxAAGIoFGEMyBxAAGIoFGENI6QRQowJYowJwAXgBkAEAmAGKAaABigGqAQMwLjG4AQPIAQD4AQHCAgoQABhHGNYEGLAD4gMEGAAgQYgGAZAGCQ&sclient=gws-wiz-serp

如果这个地址仅仅在网站内部,不需要用户操作是自动生成和跳转的,那也没有把它缩短的必要。但是如果我想把这个地址分享到外部平台或者发送给别人,那使用这种地址就很痛苦了。由此,我们需要设计一个系统,能够把这么长的地址,转换成一个相对较短的地址。并且当用户点击短链时,还能回到原来长链对应的内容。
此外,使用短链的好处还有:

  • 内容变短后,在对内容长度有限制的平台,可编辑文字变多。比如微博限制140个字符,如果我写上这么长的一个地址,那几乎没有多少自己可以编辑的内容了;再比如,发送短信的场景,如果是这么长的链接,再加上需要发送的其它内容,可能就得拆分成几条短信发送,成本也变高了。
  • 容易识别:有些平台,比如有些IM平台,会自动解析网址,显示网站内容。这么长的链接,IM在识别的时候,可能因为长度太长,内容复杂而识别不全,无法显示网站内容;即便是使用二维码,过多的内容也会导致二维码密集难以识别。

    生成短链的方法

    唯一ID转换进制法

    这种方法的流程是,先根据长链内容,生成一个全局唯一的ID,然后将这个数字ID转换成用62进制表示,得到一个短码。保存短码和长链的对应关系,后续就可以根据短码获得真实的长链
    之所以是62进制,是因为26个大写字母+26个小写字母+10位数字。
    我们可以在本地维护一个62位元素的数组,例如:

    char[] chars ={'A', 'B', 'C', 'D', 'E', 'F', 
                  'G', 'H', 'I', 'J', 'K', 'L', 
                  'M', 'N', 'O', 'P', 'Q', 'R', 
                  'S', 'T', 'U', 'V', 'W', 'X', 
                  'Y', 'Z', 'a', 'b', 'c', 'd', 
                  'e', 'f', 'g', 'h', 'i', 'j', 
                  'k', 'l', 'm', 'n', 'o', 'p', 
                  'q', 'r', 's', 't', 'u', 'v', 
                  'w', 'x', 'y', 'z', '0', '1', 
                  '2', '3', '4', '5', '6', '7', 
                  '8', '9'};
    

    然后将唯一ID,转成62进制,方法如下:

    StringBuilder sb = new StringBuilder();
    while (id > 0) {
         
      sb.append(chars[(int) (id % chars.length)]);
      id = id / chars.length;
    }
    System.out.println(sb.reverse());
    

    测试一下:

    // 假设得到的唯一ID是 987654321 ,那么转换得到的短码是
    BE0GAZ
    // 假设得到的唯一ID是 987654322 ,那么转换得到的短码是
    BE0GAa
    

    优化

    1、编码表顺序打乱
    如果编码表完全按照字母顺序,那么有心之人只要连续生成两个短链,就知道短链生成的规则了,进而可以获得一些隐秘信息。
    实际使用中,可以将编码表顺序打乱,不完全按照字母顺序来,即便是连续生成几个短链,也难以猜到编码表规则
    2、保留一位字母
    如果编码表完全是26个大写字母+26个小写字母+10位数字,那么根据唯一ID生成短码的时候,就会出现短码长度不一致的情况,比如

    // id = 100 短码是Bm
    // id = 987654321 短码是BE0GAZ
    

    为了保持所有生成的短码长度一致,可以预留一位字母,当生成的短码长度不够时,填充默认的字母
    关于短码的长度,可以预估一下短链的数量。采用61进制时,6位短码就可以支持五百多亿的短链了
    3、检查是否重复
    如果生成唯一ID的策略不能保证一定全局唯一,最好还是加上一个重复检查
    关于重复检查的方法,推荐使用布隆过滤器。布隆过滤器是一种高效的、内存占用非常小的“检查是否存在”的数据结构。redis、guava等组件都有相应的实现

    短链跳转的原理

    当短链生成后,用户点击短链时,是如何跳转到真实的地址呢?
    浏览器会失败HTTP请求返回的不同code,当服务端返回301和302时,浏览器都会跳转到新的地址。区别是

  • 301,代表永久重定向,当浏览器第一次拿到短链对应的长链后,后续再次访问短链,浏览器会直接访问长链,不再和服务端进行交互。一般不会采用这种方式,因为服务端可能需要对长链进行一些调整和统计分析的工作

  • 302,代表临时重定向,每次访问短链,浏览器都会先去访问服务端,拿到长链后再跳转到长链地址,推荐使用的方式

服务端实现重定向的方式,只需要在controller中返回:

HttpHeaders headers = new HttpHeaders();
headers.setLocation(new URI("长链内容"));
return new ResponseEntity<>(headers, HttpStatus.FOUND);
目录
相关文章
|
算法 Java 关系型数据库
短链接生成
短连接生成推荐
4980 0
|
5月前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
50370 72
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
11月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1210 3
|
运维 监控 数据可视化
使用阿里云操作系统控制台排查内存溢出
操作系统控制台是阿里云最新推出的一款智能运维工具,专为提升运维效率、优化服务器管理而设计。它集成了多种运维管理功能,包括操作系统助手、插件管理器以及其他实用工具,为用户提供一站式的运维解决方案。无论是个人开发者还是企业运维团队,都可以通过这一平台轻松管理服务器和操作系统。
600 18
 使用阿里云操作系统控制台排查内存溢出
|
数据采集 算法 前端开发
社交媒体分析:破解无限滚动的技术实践
本方案介绍了一种高效的数据采集技术,涵盖技术演化路径、传统痛点解决及架构设计。通过代理IP轮换、请求指纹管理与滚动加载模拟等核心模块,大幅提升请求成功率(98%)和数据完整率(91%),显著降低封禁概率(3.2%)。实战代码以微博热搜为例,展示如何结合动态User-Agent、Cookie管理与三级校验机制实现稳定采集。行业应用表明,该方案可将采集效率提升3.8倍,封禁率降至0.7次/日,助力热点事件早期捕捉。适配大规模任务需求,同时注重流量控制与异常处理,确保稳定性与安全性。
451 7
社交媒体分析:破解无限滚动的技术实践
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
1298 25
|
SQL 人工智能 关系型数据库
Flink CDC YAML:面向数据集成的 API 设计
Flink CDC YAML:面向数据集成的 API 设计
854 5
|
缓存 算法 NoSQL
短链是什么原理?怎么实现呢?
内容营销中给用户推送营销消息最常见的方式就是发短信,比如三大运营商移动、联通、电信平时会发送一些诸如套餐办理、消费查询、话费充值这些短信,还有像银行、云服务厂商等等推送的各种包含查询服务的短信等等。
短链是什么原理?怎么实现呢?
|
机器学习/深度学习 移动开发 自然语言处理
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
【YOLOv8改进- 多模块融合改进】GhostConv + ContextAggregation 幽灵卷积与上下文聚合模块融合改进,助力小目标高效涨点
|
关系型数据库 MySQL 开发工具
NextCloud自建家用网盘
在阿里云ECS(2核2G,SSD40G,3M带宽)上,安装Ubuntu 22.04,然后配置FRPs,设置权限,开放端口。本地服务器拉取 `NextCloud` Docker镜像,并通过docker-compose进行容器部署,容器启动成功,通过FRPc链接到云主机,到这里就已经实现本地网盘服务可以通过公网访问。
1144 0