短链接生成

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 短连接生成推荐

项目地址

https://github.com/TheLandscapeBe/tinyurl.git
项目地址

短连接生成服务

# 什么是短连接生成?
短连接生成就是把普通网址转换成比较换的地址。
例如:一个很长的链接地址:https://developer.aliyun.com/article/829833?spm=a2c6h.13148508.0.0.67134f0ewKO0ri需要发发布给用户,而用户不能接收这么长的内容,那么就需要将这个很长的链接地址转换为用户能够接收的长度,这就是短连接生成,其实就是一个转换。
# 适用场景

  1. 短信

短信中带有链接不能过长,因为可能会截断为几条短信,将原长链接转换为短连接可以在一条短信内向用户展示全部文件和连接内容。

  1. 二维码

链接生成二维码。如果连接过长会导致扫码速度和成功率下降,将长链接转换为短连接再生成二维码将大大提高扫码速度和成功率。

短链接生成算法

  1. ID自增算法

ID自增算法目前使用MySQL数据库自增ID实现,所以生成的短连接会表现出顺序增加特点:
比如:
根据请求顺序,短连接生成会为以下地址:
https://xxx.xx.com/a
https://xxx.xx.com/b
https://xxx.xx.com/c
...

  1. snowflake算法

生成ID后,使用62进制进行编码得到短链接key,一般会获得9位字符串

算法对比

1 ID自增算法
目前ID自增算法基于MySQL ID自增算法,不利于扩展,适用于小型应用
2 snowflake算法
snowflake算法为twitter设计,特点ID有序且为数字,适合中大型应用

进制算法

编码核心计算

1 选取字母表ALPHABET=[0-9a-zA-Z],字母表长度ALPHABET_LENGTH=62,所有使用62进制,

private static String encode(long number) {
        StringBuilder chip = new StringBuilder(9);
        while (number > 0) {
            int mod = (int)(number % ALPHABET_LENGTH);
            chip.append(ALPHABET.charAt(mod));
            number -= mod;
            number /= ALPHABET_LENGTH;
        }

        return chip.reverse().toString();
    }

解码核心计算

private static long decode(String key) {    
    long number = 0L;   
    for (int i = 0; i < key.length(); i++) {        
        long pow = pow(key, i);        
        number += pow * ALPHABET.indexOf(key.charAt(i));    
    }    
    return number;
}

private static long pow(String key, int i) {   
    long pow = 1L;   
    for (int j = 0; j < key.length() - i - 1; j++) {        
        pow *= ALPHABET_LENGTH;    
    }    
    return pow;
}

## 如何使用?
### 数据库初始化
数据库初始化脚本

CREATE DATABASE `tiny_urldb` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

CREATE TABLE `application` (
  `id` int NOT NULL AUTO_INCREMENT,
  `access_key` varchar(256) NOT NULL DEFAULT '' COMMENT '密钥',
  `name` varchar(256) NOT NULL DEFAULT '' COMMENT '应用名称',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `app_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '应用ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='应用';

CREATE TABLE `domain` (
  `id` int NOT NULL AUTO_INCREMENT,
  `domain` varchar(256) NOT NULL DEFAULT '' COMMENT '域名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='域名';

CREATE TABLE `url` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `origin_url` varchar(5000) NOT NULL DEFAULT '' COMMENT '原始URL',
  `hash` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '原始URL MD5哈希值',
  `create_time` datetime NOT NULL,
  `expire_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='URL记录';

增加测试应用

 INSERT INTO `application` VALUES ('1', '1594708959736', '测试应用', '2020-07-14 14:43:12', '1594708959736');

增加测试域名

INSERT INTO `domain` VALUES ('1', 'e.example.com');

服务部署

服务数据可以使用jar部署,docker镜像部署

  1. 使用jar包部署

1.1 代码克隆

git clone https://github.com/fofcn/tinyurl.git

1.2 代码打包为jar

cd tinyurl
mvn clean package -Dmaven.test.skip=true
cd target
java -jar -Xms128M -Xmx256M tinyurl.jar
  1. 编译docker镜像部署

2.1 代码下载

git clone https://github.com/fofcn/tinyurl.git

2.2 代码打包为镜像

docker login
docker build -t tinyurl .
docker tag tinyurl ${registry}/name/image-name:${tag}
docker push ${registry}/name/image-name:${tag}

#例如在我的环境中执行命令
docker login 
docker build -t tinyurl .
docker tag tinyurl fofcn/tinyurl:v0.2.0
docker push fofcn/tinyurl

2.3 使用docker镜像部署 (目前docker镜像已经上传到doker hub,直接使用fofcn/tinyurl获取镜像即可)
2.3.1 编写docker-compose.yml

# MAINTAINER: errorfatal89@gmail.com
version: '3'

networks:
  your-network-name:
    driver: bridge

services:
  tinyurl:
    container_name: tinyurl
    image: fofcn/tinyurl:v1.3.0
    restart: always
    ports:
      - "53000:53000"
    
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /app/applog/tinyurl:/app/applog/tinyurl

    networks:
      your-network-name:
        
    environment:
      - SERVER_PORT=53000
      # 目前支持dev:开发人员使用,test:测试人员使用,prod:生产环境使用 
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_SHARDINGSPHERE_DATASOURCE_MASTER_URL=jdbc:mysql://localhost:3306/tiny_urldb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
      - SPRING_SHARDINGSPHERE_DATASOURCE_MASTER_USERNAME=tinyurl_user
      - SPRING_SHARDINGSPHERE_DATASOURCE_MASTER_PASSWORD=Yy123456.
      - SPRING_SHARDINGSPHERE_DATASOURCE_SLAVE0_URL=jdbc:mysql://localhost:3306/tiny_urldb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
      - SPRING_SHARDINGSPHERE_DATASOURCE_SLAVE0_USERNAME=tinyurl_user
      - SPRING_SHARDINGSPHERE_DATASOURCE_SLAVE0_PASSWORD=Yy123456.
      
      # v1.3.0新增配置
      # dataCenterId与WorkerId在多节点部署时必须指定且组合唯一
      - TINYURL_SNOWFLAKE_DATACENTERID=0
      - TINYURL_SNOWFLAKE_WORKERID=0
      # 配置域名http或https
      - TINYURL_HTTPSCHEME=https

2.3.2 docker-compose启动

docker-compose up -d

# 接口列表

  1. 生成短链接
  2. 打开短链接
目录
相关文章
|
测试技术 网络安全 数据安全/隐私保护
【Docker项目实战】使用Docker部署Mininote轻量级笔记工具
【4月更文挑战第7天】使用Docker部署Mininote轻量级笔记工具
891 2
|
自然语言处理 NoSQL Redis
短链平台设计
一种生产环境可用的短链生成方法,将长度较长、难以识别的长链转换成长度可控的短链,点击短链再跳转回长链的方法
837 0
|
SQL 缓存 NoSQL
高性能短链设计
高性能短链设计
|
5月前
|
弹性计算 自然语言处理 数据库
2026年阿里云最新优惠券参考,适合普通用户的新用户满减券与165元优惠券领取及使用教程分享
2026年截至目前,阿里云有哪些优惠券呢?除了学生优惠券和企业出海扶持优惠券等之外,适合普通个人和企业用户的优惠券目前主要有新用户满减券与165元优惠券,满减券金额虽然只有10元,但是使用门槛较低,165元优惠券相对金额更大,完成实名认证即可参与领取上云礼包,最高可减100元。有的新手用户可能不知道领券入口和使用教程,本文将详细介绍这两项活动的具体内容、领取方式和使用教程,以供参考。
|
8天前
|
人工智能 API 语音技术
阿里云百炼CLI是什么?如何安装使用百炼CLI命令行工具?
阿里云百炼CLI是百炼AI大模型平台的命令行工具,支持全模态对话、图像/视频生成与编辑、语音合成识别、联网搜索、知识库检索等10+能力,深度集成AI Agent与Skills技能扩展,助力高效开发电商图、播客等内容。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY
226 0
|
SQL 数据可视化 安全
通义灵码进阶指南:解锁智能编程的深度技巧与高阶场景实战
本文深入探讨了通义灵码从基础代码补全到全流程研发加速器的升级路径,揭秘企业级深度集成方案。内容涵盖核心能力再认知(如智能维度拆解与硬件级优化)、精准控制技术(如结构化指令模板与上下文锁定)、企业级应用(私有知识库构建与研发流水线增强)以及高阶场景实战(架构可视化重构与多模态交互)。同时提供避坑指南、效能度量体系,并展望研发智能体的未来影响,助你实现编码效率300%提升。
635 39
|
传感器 监控 网络协议
OSI 物理层详解
本文介绍了多种传输介质及其特性,包括双绞线、光纤、同轴电缆和无线介质。双绞线成本低、易于安装,适合短距离传输;光纤具有大带宽、远距离传输和高安全性,适用于数据中心互联和广域网;同轴电缆抗干扰能力强,但安装复杂;无线介质通过电磁波传输,2.4GHz覆盖广但速度慢,5GHz速度快但穿墙能力弱。此外,文章还提及了曼彻斯特编码的特点与应用,以及传输速率单位bps的定义与换算方法,为网络规划提供了理论依据。
596 5
|
JSON 监控 API
深度剖析:淘宝商品详情API返回值结构及高效使用方法
本文详解了淘宝商品详情API(taobao.item.get)的使用方法与返回值解析,涵盖接口基础认知、返回值结构及核心字段说明。通过四步调用流程(注册-认证-请求-解析),开发者可高效获取商品信息,包括基础数据、库存销量、SKU详情、促销活动等。文章还提供了Python实战代码示例,助您实现商品展示、价格监控、智能选品等场景应用。最后提醒注意权限认证、调用频率限制及错误处理,助力电商业务创新。
|
SQL 存储 Java
Java中使用ClickHouseDriver连接和基本操作
通过上述步骤,你可以轻松地在Java应用中集成ClickHouse数据库,执行基本的CRUD操作。需要注意的是,实际开发中应当根据实际情况调整数据库连接配置(如URL中的主机、端口、数据库名等),并根据应用需求选择合适的异常处理策略,确保代码的健壮性和资源的有效管理。此外,对于复杂查询和大批量数据处理,建议充分利用ClickHouse的特性(如分布式处理、列式存储优化等),以进一步提升性能。
1563 2
|
弹性计算 监控 网络协议
短连接服务部署
【9月更文挑战第20天】
356 2

热门文章

最新文章