短链用途
- 便于有长度限制的平台发文,如微博、短信
- 短链转的二维码稀疏易识别
短链组成
固定短链域名 + 长链映射成的随机串,如gk.link/a/10gp8
接口设计
- 根据长链生成短链
- 根据短链查询长链
架构设计
长链生成短链
设计要点
- 幂等性
- 高性能
- 足够短
- 冲突率低
Hash算法
选择要点:不关心解密难度,注重运算速度和冲突率 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,我们就无法统计到短地址被点击的次数了,而这个点击次数是一个非常有意思的大数据分析数据源。
点击数据处理
离线数仓:disk->kafka->HDFS->Hive 实时数仓:disk->kafka->flink->clickhouse
场景:低并发千万级数据量
架构图
流程图
场景:高并发亿级数据量
架构图
流程图【短链生成】
流程图【短链查长链】
短链生成
- Hash分布式计算,短网址服务集群
短链判重
- 布隆过滤器。布隆过滤器是一种非常省内存的数据结构,长度为 10 亿的布隆过滤器,只需要 125 M 的内存空间。
短链存储
- 分库分表
- TiDB
短链查询长链
- 使用Redis集群缓存热点Key,设置合理过期时间,每次命中更新过期时间,降低mysql读压力。