生成短链接

扫描二维码 上传二维码
选择防红平台类型,避免链接被拦截
选择允许访问的平台类型

Java实现高并发短链系统

一条短信,寥寥数字,却能在指尖与云端之间完成一次优雅的时空折叠——这,便是短链接的魔法。
今天,让我们循着「suo.run」的轨迹,拆解这场魔术背后的精密机关,并亲手设计一套可支撑亿级调用的「快缩短网址」系统。

一、为什么必须短?
1. 运营商单条短信 70 字红线,长链一出场就占掉大半。
2. 参数若裸奔,不仅丑陋,更泄露业务机密。
3. 短链自带品牌属性——suo.run/xxxx,一眼即知出处,天然可信。



二、一次点击的旅程
浏览器敲下 suo.run/tzHLFw 的刹那,暗流涌动:
1. DNS 将域名映射到最近的边缘节点。
2. 边缘节点查询内存映射表:tzHLFw → https://gmccapp/webpage/...
3. 返回 HTTP 302(临时重定向),Location 指向真实地址。
- 302 而非 301:避免浏览器缓存导致统计失真。
4. 浏览器再次起飞,抵达最终落地页。
全程 < 30 ms,用户无感,后台却已记录 UV、PV、设备指纹、地理位置。



三、核心数据结构
表:short_url
id bigint // 雪花算法全局唯一
code varchar(8) // 62 进制短码,唯一索引
long_url text // 原始长链
expired_at datetime // 过期时间戳
created_by bigint // 创建者


四、62 进制压缩算法
把 10 进制 id 映射为 [0-9a-zA-Z] 的 62 进制字符串,7 位即可容纳 62⁷ ≈ 3.5 万亿条记录。

优雅实现:

private static final String BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String toBase62(long num) {
StringBuilder sb = new StringBuilder();
do {
sb.append(BASE62.charAt((int)(num % 62)));
num /= 62;
} while (num > 0);
return sb.reverse().toString();
}


五、防碰撞、防遍历
1. 雪花算法保证 id 递增,但短码可再混洗——把 BASE62 字符随机置换,外人再难猜。
2. 插入前 SELECT … FOR UPDATE 校验 code 唯一,冲突即重试。
3. 敏感业务可再加一次性 token:suo.run/tzHLFw?key=xxxx,用完即焚。

六、性能与扩展
- 缓存:短码 → 长链 写入 Redis,TTL 与 expired_at 对齐,命中率 99% 以上。
- 布隆过滤器:拦截明显伪造的短码,防止缓存穿透。
- 水平分片:按 code 首字符 62 分表,或按 id 取模 1024 分库,线性扩容。
- 异步落库:写请求先写 Kafka,消费者批量刷盘,削峰填谷。
- 监控:Prometheus 统计 QPS、P99 延迟、302 比例,异常即熔断。

七、优雅收尾
当 62⁷ 空间告急,可:
1. 回收已过期的 code;
2. 升级 8 位短码;
3. 开放自定义短码,让品牌词永不枯竭。

至此,一套高并发、高可用、可演进的「快缩短网址」系统已跃然纸上。
打开 suo.run,亲手缩短一条长链,让冗长归于简洁,让复杂隐于无形——
这就是技术的诗意。