Spring Boot 实战:从零设计短链系统
问题分析:为什么我们需要'短链'?
相信很多小伙伴在日常生活中都收到过一些营销短信,里面附带了一些链接地址。是否发现链接实际上很短,点击后会再次访问一个相对长的链接。
例如我们收到的短链可能是这样子:
https://www.example.com/aBcDeF
点开它,会跳转到以下原始长链接(甚至更长…参数更多):
https://www.example.com/product/detail?id=134985&from=share&ref=longtext&utm_source=wechat
那就有小伙伴问了,直接分享这个长链接不行么?为何多此一举通过短链条转长链?
那我们就来看看常见的短链应用场景:
- 社交平台分享:如微博、朋友圈、抖音简介中限制字符数;
- 短信营销:短链可以有效减少短信的字符数,从而减少短信费用;
- 营销追踪:每个渠道生成不同短链,统计访问量;
- 二维码应用:短链生成二维码更清晰、美观;
- 安全控制:短链服务可做访问限制、过期时间等策略。
系统设计分析
要实现一个简易的短链系统,我们至少需要解决以下问题:
| 模块 | 说明 |
|---|---|
| 短链生成策略 | 如何将长链接映射成短码?并保证唯一性和随机性 |
| 存储设计 | 如何保存短码与原始链接的映射关系? |
| 重定向服务 | 访问短链时,如何高效跳转到原始链接? |
| 过期策略(可选) | 是否允许短链设置有效期? |
| 统计分析(可选) | 统计点击量、来源等指标。 |
如果你要实现一个更高性能的短链系统,你还需要引入缓存设计,如 redis。本章节更多的是探讨短链系统,小伙伴们可以自行在业务层追加缓存来实现减少数据库的访问。
数据库设计
这里我们只实现最核心的短链映射功能。
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| short_code | varchar(10) | 短链编码(唯一索引) |
| original_url | varchar(500) | 原始长链接 |
| expire_time | datetime | 过期时间(可选) |
| create_time | datetime | 创建时间 |
SQL 建表语句:
CREATE TABLE short_link (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
short_code () ,
original_url () ,
expire_time DATETIME ,
create_time DATETIME
);


