短链技术方案
一、需求评估
1.1短链使用范围
1) 站内链接。
2) 站外链接。
1.2数据量评估
1) 短链数量,预估一年内500万,两年2000万,并且可扩展至百亿级别。
2) 短链点击流量,预估30000K每天,高峰300K每分钟.
二、方案选择
目前短链生成算法主流有两种:
1) 基于运算的短链生成:使用算法进行字符压缩。优点是不需要通过存储,响应快、使用方便。缺点是很难支持大数据量的短链生成,而且有可能会重复。
2) 基于存储的长短链对应:将所有需要转换的长链接进行存储,然后将数据的id进行转换,作为短链地址。优点是支持大量的长短链接转换,并且不会出现重复的数据。缺点是需要消耗一定的存储和获取时间。
这次的需求,因为要支撑的短链数量会很大,而且要支持以后的无限制扩展,此次ADP短链方案采用第二种,基于存储的长短链对应转换。存储方式的时间和性能消耗可以使用MC缓存来解决。
三、详细设计
3.1 系统架构设计
采用服务化的方式,构建短链服务中心,负责长短链的转换,缓存的管理等功能。其它系统需要使用相关功能时,统一调用短链服务。
3.2 短链跳转时序图:
3.3 缓存设计:
1)因为缓存只用来查询,而且需要满足高流量要求,所以采用MC来存储数据
2)数据结构:key=前缀_短链码 value=原始链接
3)因为长短链对照数据不存在修改,所以正常数据有效期设置为永久存在。
4)缓存更新模式使用主动推送,在数据新增的时候直接推送到MC集群;同时提供数据全量更新的接口,以供手动推送缓存数据或者每天自动更新。
3.4 数据库设计
主键id
短链码
特征码
长链码
3.5 短链生成方式:
1)将长链进行MD5获取特征码,传入数据库进行查询,如果存在则直接返回对应的记录,再进行长链匹配。
2)如果不存在,则将长链直接insert到数据库中,同时返回主键id。长链信息在存储和获取的过程中需要做防SQL注入转码。
3)将主键id加密成密文,密文作为短链码写入数据库,并且拼接为短链链接返回给用户。
4)短链信息推送到Redis中,永久存在。
5)流程图如下:
3.5 短链码加密方式:
1)将主键id进行Feistel数字变换,变换后可以实现隐藏数字递增的效果。再使用多进制转换的方式进行长度压缩。(具体的代码实现请见我的另一篇文章《另辟蹊径-自增短链id设计》)
2)压缩后的多进制对象再进行多维矩阵加密,得到密文。
3)在密文里加入随机字符进行第二次非对称加密,最终得到的密文,作为短链码来使用。
4)此方法生成的密文一般请况不可破解,保证了主键id不被暴露出去,同时因为是采用顺序id的方式作为短链,所以支持的链接数量非常大。