如何设计一个高性能的短链设计

news2025/7/27 20:18:21

1.什么是短链

        短链接(Short URL) 是通过算法将长 URL 压缩成简短字符串的技术方案。例如将 https://flowus.cn/veal/share/3306b991-e1e3-4c92-9105-95abf086ae4e 缩短为 https://sourl.cn/aY95qu,用户点击短链时会自动重定向到原始长链接。其核心价值在于通过 空间压缩 和 统一管理 解决长链接在传播中的实际问题。

2.为什么需要短链

        2.1 突破字符限制

        例如微博,Twitter等平台对内容长度严格要求(如微博140字),长链接会占用大量文本空间。

        2.2 降低短信成本

        短信按长度计费,长链接可能导致单条短信拆分为多条,同时使用短链可将短信长度减少50%以上,降低发送成本

        2.3 精准统计

        每次短链跳转需经过服务器(基于302临时重定向),可记录点击时间,地域,来源等数据,用于数据分析

3.短链跳转原理

  1.         用户点击短链  --->  浏览器向短链服务器发送请求
  2.         服务器响应 : 返回302 Found状态码 + Location 头部 (包含原始长链接)
  3.         浏览器二次请求:根据Location 跳转至长链接,获取最终长度
 为什么选择302不选择301
特性301 永久重定向302 临时重定向
缓存策略浏览器永久缓存短链-长链映射每次请求需回源服务器(可配置弱缓存)
数据统计无法追踪后续点击(依赖缓存)可精准统计每次点击
适用场景永久不变的资源(如文件迁移)需动态统计的短链(如营销链接)

结论:短链服务必须使用302 ,否则会因浏览器缓存导致点击数据丢失,影响业务分析

4.短链生成技术

        4.1哈希算法(适合海量数据场景)

        核心流程

  1.         长链--->哈希值:使用MurmurHash 算法(非加密型哈希,速度快,冲突率低)生成32位或128位哈希值
  2.         进制转换:将十进制哈希值转换为62进制(使用字符0-9a-zA-Z,共62个字符),缩短长度
  3.         拼接域名:生成短链 http://sourl.cn/xxx

         优化

  •         数据库唯一索引:为短链字段添加唯一索引,插入时利用数据库特性自动判重
    • 流程:生成短链--->尝试插入数据库--->若报唯一冲突,则重新哈希
  •         布隆过滤器优化:提前将已生成的短链存入布隆过滤器,新短链生成时先过滤,减少90%以上的数据库查询
    • 优势:空间复杂度低(100万条数据仅需 1MB内存),查询时间O(1)
        4.2 ID 自增生成器(适合有序场景)

        核心流程

  1.         维护自增 ID :使用数据库自增字段或分布式 ID 生成器(如雪花算法)生成1,2,3....序列
  2.         进制转换:将 ID 转换为 62 进制,拼接域名生成短链

        优化

  •         多发号器架构:主服务器预分配 ID 段,各发号器无锁并发生成ID
  •         重复长链处理: 对长链做 MD5 哈希,存入数据库并建立唯一索引,确保相同长链生成同一短链。

5.进阶优化

        5.1缓存策略

        短链--->长链映射缓存:使用redis存储热点短链,减少数据库压力

        弱缓存机制:对302响应添加 Cache-control:max-age=60,允许浏览器缓存1分钟,降低回源压力

        5.2高可用设计

        分布式架构:短链服务,数据库,缓存均采用集群部署,避免单点故障

        异步写入:将短链---长链映射写入操作异步化,提升接口吞吐量

        5.3安全

        URL 过滤:生成短链前校验长链合法性,防止恶意链接接入

        权限控制:对管理后台添加认证,避免未授权用户生成短链

6.总结

哈希算法方案

ID 自增方案

短链长度固定长度(取决于哈希值进制)随 ID 增长可能变长
冲突处理依赖哈希算法与数据库 / 布隆过滤器天然无冲突(ID 唯一)
并发性能高(无锁计算)需解决 ID 生成器的并发瓶颈
重复长链可通过索引实现唯一映射需额外查询逻辑

短链设计本质是在 空间压缩性能数据唯一性 之间寻找平衡点。实际应用中,可结合业务规模选择方案:小型系统优先 ID 自增,海量数据场景则推荐哈希算法 + 布隆过滤器 + 分布式缓存的组合架构。通过合理的技术选型与优化,短链服务可支撑亿级点击量,成为现代互联网业务的基础设施之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升工作效率的可视化笔记应用程序

StickyNotes桌面便签软件介绍 StickyNotes是一款极为简洁的桌面便签应用程序,让您能够快速记录想法、待办事项或其他重要信息。这款工具操作极其直观,只需输入文字内容,选择合适的字体大小和颜色,然后点击添加按钮即可创建个性化…

11|省下钱买显卡,如何利用开源模型节约成本?

不知道课程上到这里,你账户里免费的5美元的额度还剩下多少了?如果你尝试着完成我给的几个数据集里的思考题,相信这个额度应该是不太够用的。而ChatCompletion的接口,又需要传入大量的上下文信息,实际消耗的Token数量其…

机器学习圣经PRML作者Bishop20年后新作中文版出版!

机器学习圣经PRML作者Bishop20年后新书《深度学习:基础与概念》出版。作者克里斯托弗M. 毕晓普(Christopher M. Bishop)微软公司技术研究员、微软研究 院 科学智 能 中 心(Microsoft Research AI4Science)负责人。剑桥…

吴恩达机器学习笔记:逻辑回归3

3.判定边界 现在说下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。 在逻辑回归中&#xff0c;我们预测&#xff1a; 当ℎθ (x) > 0.5时&#xff0c;预测 y 1。 当ℎθ (x) < 0.5时&#xff0c;预测 y 0 。 根据…

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel&#xff0c;第一个最大的原因&#xff0c;就是图方便&#xff0c;比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …

Java 中的 super 关键字

个人总结&#xff1a; 1.子类构造方法中没有显式使用super&#xff0c;Java 也会默认调用父类的无参构造方法 2.当父类中没有无参构造方法&#xff0c;只有有参构造方法时&#xff0c;子类构造方法就必须显式地使用super来调用父类的有参构造方法。 3.如果父类没有定义任何构造…

PCM音频数据的编解码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a…

Ubuntu 通过指令远程命令行配置WiFi连接

前提设备已经安装了无线网卡。 1、先通过命令行 ssh 登录机器。 2、搜索wifi设备&#xff0c;指令如下&#xff1a; sudo nmcli device wifi 3、输入需要联接的 wifi 名称和对应的wifi密码&#xff0c;指令如下&#xff1a; sudo nmcli device wifi connect wifi名称 passw…

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…

深度图数据增强方案-随机增加ROI区域的深度

主要思想&#xff1a;随机增加ROI区域的深度&#xff0c;模拟物体处在不同位置的形态。 首先打印一张深度图中的深度信息分布&#xff1a; import cv2 import matplotlib.pyplot as plt import numpy as np import seaborn as sns def plot_grayscale_histogram(image_path)…

两个mysql的maven依赖要用哪个?

背景 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency>和 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId> &l…

Kafka Consumer工作流程

Kafka Consumer工作流程图 1、启动与加入组 消费者启动后&#xff0c;会向 Kafka 集群中的某个 Broker 发送请求&#xff0c;请求加入特定消费者组。这个 Broker 中的消费者协调器&#xff08;Consumer Coordinator&#xff09;负责管理消费者组相关事宜。 2、组内分区分配&am…

大腾智能 PDM 系统:全生命周期管理重塑制造企业数字化转型路径

在当今激烈的市场竞争中&#xff0c;产品迭代速度与质量已成为企业生存与发展的核心命脉。面对客户需求多元化、供应链协同复杂化、研发成本管控精细化等挑战&#xff0c;企业亟需一套能够贯穿产品全生命周期的数字化解决方案。 大腾智能PDM系统通过构建覆盖设计、研发、生产、…

【短距离通信】【WiFi】WiFi7关键技术之4096-QAM、MRU

目录 3. 4096-QAM 3.1 4096-QAM 3.2 QAM 的阶数越高越好吗&#xff1f; 4. MRU 4.1 OFDMA 和 RU 4.2 MRU 资源分配 3. 4096-QAM 摘要 本章主要介绍了Wi-Fi 7引入的4096-QAM对数据传输速率的提升。 3.1 4096-QAM 对速率的提升 Wi-Fi 标准一直致力于提升数据传输速率&a…

线程池实战——数据库连接池

引言 作者在前面写了很多并发编程知识深度探索系列文章&#xff0c;反馈得知友友们收获颇丰&#xff0c;同时我也了解到友友们也有了对知识如何应用感到很模糊的问题。所以作者就打算写一个实战系列文章&#xff0c;让友友们切身感受一下怎么应用知识。话不多说&#xff0c;开…

基于moonshot模型的Dify大语言模型应用开发核心场景

基于moonshot模型的Dify大语言模型应用开发核心场景学习总结 一、Dify环境部署 1.Docker环境部署 这里使用vagrant部署&#xff0c;下载vagrant之后&#xff0c;vagrant up登陆&#xff0c;vagrant ssh&#xff0c;在vagrant 中使用 vagrant centos/7 init 快速创建虚拟机 安装…

华为OD机试真题——字符串序列判定(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

工商总局可视化模版-Echarts的纯HTML源码

概述 基于ECharts的工商总局数据可视化HTML模版&#xff0c;帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范&#xff0c;功能完善&#xff0c;适合各类工商监管场景使用。 主要内容 本套模版采用现代化设计风格&#xff0c;主要包含以下核心功能模块&…

Spring AI 和 Elasticsearch 作为你的向量数据库

作者&#xff1a;来自 Elastic Josh Long, Philipp Krenn 及 Laura Trotta 使用 Spring AI 和 Elasticsearch 构建一个完整的 AI 应用程序。 Elasticsearch 原生集成了业界领先的生成式 AI 工具和服务提供商。查看我们关于超越 RAG 基础或使用 Elastic 向量数据库构建生产级应用…

集群聊天服务器学习 配置开发环境(VScode远程连接虚拟机Linux开发)(2)

配置远程开发环境 第一步&#xff1a;Linux系统运行sshd服务 第二步&#xff1a;在vscode上安装Remote Deve I opment插件&#xff0c;其依赖插件会自动安装 第三步&#xff1a;配置远程Linux主机的信息 第四步&#xff1a;在vscode上开发远程连接Linux 第一步&#xff1a;…