短网址系统

760 阅读2分钟

短链用途

  • 便于有长度限制的平台发文,如微博、短信
  • 短链转的二维码稀疏易识别

短链组成

固定短链域名 + 长链映射成的随机串,如gk.link/a/10gp8

接口设计

  • 根据长链生成短链
  • 根据短链查询长链

架构设计

长链生成短链

设计要点

  • 幂等性
  • 高性能
  • 足够短
  • 冲突率低

Hash算法

image.png

选择要点:不关心解密难度,注重运算速度和冲突率 SHA、MD5:加密哈希,性能和冲突率不够好 MurmurHash:Google 出品,是一种非加密型哈希函数,适用于一般的哈希检索操作,比 MD5、SHA 性能高十倍以上,对于规律性较强的 key,MurmurHash 的随机分布特征表现更良好。

  • MurmurHash 提供了两种长度的哈希值,32 bit,128 bit,为了让网址尽可通地短,我们选择 32 bit 的哈希值,32 bit 能表示的最大值近 43 亿。

短链缩短

十进制转62进制,6 位 62 进制数可表示 568 亿的数

短链存储

Mysql

CREATE TABLE `short_url_map` ( 
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`lurl` varchar(160) DEFAULT NULL COMMENT '长地址', 
`surl` varchar(10) DEFAULT NULL COMMENT '短地址', 
`gmt_create` int(11) DEFAULT NULL COMMENT '创建时间', 
PRIMARY KEY (`id`) ) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

写加速:插入一条记录居然要经过执行两次网络通信和两次sql (根据短链查记录,将长短链对应关系插入数据库中),可以给surl加唯一索引,如果冲突了,给lurl加固定串重新hash插入,正常冲突率很低

短链查询长链

查询Mysql,走lurl唯一索引

短链跳转

301还是302 301是永久重定向,浏览器缓存,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的,同时对服务器压力也会有一定减少,但是如果使用了301,我们就无法统计到短地址被点击的次数了,而这个点击次数是一个非常有意思的大数据分析数据源。

image.png

点击数据处理

离线数仓:disk->kafka->HDFS->Hive 实时数仓:disk->kafka->flink->clickhouse

场景:低并发千万级数据量

架构图

image.png

流程图

image.png

场景:高并发亿级数据量

架构图

image.png

流程图【短链生成】

image.png

流程图【短链查长链】

image.png

短链生成

  • Hash分布式计算,短网址服务集群

短链判重

  • 布隆过滤器。布隆过滤器是一种非常省内存的数据结构,长度为 10 亿的布隆过滤器,只需要 125 M 的内存空间。

短链存储

  • 分库分表
  • TiDB

短链查询长链

  • 使用Redis集群缓存热点Key,设置合理过期时间,每次命中更新过期时间,降低mysql读压力。