网站首页 > java教程 正文
字节跳动一面,经常被问到,短链服务如何设计。问题看似简单,但很多设计细节处都能展开很多知识点,本文将对短链设计方案做详细的剖析,给大家提供几种不同的短链设计思路。
一、为什么要用短链
这种营销短信,大家一般都收到过因短信通道是超过一定字数会加收短信费用(文案总字数超过70个字,那就算两条短信计费,超过140个字就算三条短信计费),也为了更好的观看体验,营销短信中的链接一般都比较短,用户点击短链可跳转到对应的长链接
二、短链设计基本要求
1、通过长链接 生成短链接;点击短链,可重定位跳转到对应的长链
2、短链接满足安全性,即不会将商品id等信息漏出
3、支持有效期限制,例如活动链接,短链接只在有效期内有效
4、不可重复,不同长链接转换的短链接不允许重复
5、支持高并发高负载,防屏蔽防拦截稳定性(SLA)
三、转换算法
1、MD5/SHA算法
1)将原始长链接进行MD5/SHA加密,若防止算法泄露,可在原始链接上添加自定义密钥;
2)将128分成4组,每组32位对应一个候选短链接;
3)每一个候选短链接,将它与0x3FFFFFFF进行位与运算,取其低30位的数据。把得到的值与0x0000003D进行位与运算,再把得到的结果作为下标在字符表中选取字符,再把原数字右移5位进行相同操作,重复进行6次得到6个字符,即组成一个候选短链接地址;
4)在4个候选短链接中,选取一个作为最终短链接,并把长、短链接的映射关系存到数据库中。
对于MD5/SHA算法,这样做有点儿杀鸡用牛刀了。对于短链转换服务来说,由于加密会带来的性能损耗,其实我们并不关心解密的难度,反而我们更关心的是怎样提升哈希的运算速度和降低冲突概率。
2、MurmurHash算法
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。与其它流行的哈希函数相比,对于规律性较强的 key,MurmurHash 的随机分布特征表现更良好。非加密型哈希函数意味着着相比 MD5,SHA 这些函数它的性能更高(十倍以上),也正是由于它的这些优点,它目前已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。
为了让链接转换的尽量短,可选择32bit的Murmur哈希值,32bit能表示近43亿的最大值,对于中小型公司绰绰有余。我们可以直接将长链接做MurmurHash计算,得到哈希值,然后通过固定短链域名+哈希值的方式,得到短链接。
3、Base 62自增序列算法
短链接标识一般是 [0-9, a-z, A-Z] 随机组合而成的字符串,字符一共有 62 个,因此短链接标识可以用 62 进制的字符串表示。生成短链仅需要简单两步。1)维护一个自增id;2)将10进制的自增id转换成62进制字符串,这个字符串便可以标识唯一的长链接。
由于id是自增且唯一的,故62进制字符串也是不同的。62 进制字符串可支持6位长度的短链接558亿种组合。
维护自增 ID 主要有以下几种方式:
1)数据库主键自增
2)redis 自增
3)分布式自增主键 ID(雪花算法,存在 ID 浪费)
关于id自增详细介绍,可参照文章大厂分布式id生成策略揭秘
可做如下优化:
1)当自增主键很大时,生成的 62 进制字符串会变长,当主键大于 56亿+时,会生成 7 位长度的 62 进制字符串。我们可以通过控制自增主键的增长速度来解决,同时要避免主键浪费。
2)62 进制的顺序可以不严格按照
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 的顺序来表示,打乱这个顺序再生成短链接标识,可使短链更随机不易被破解。
3)为保证一个长链接对应唯一一个短链接需求,可以将长链接进行 md5 加密并存储在 DB /redis中,并设置有效期。每次生成短链接前都根据长链接 md5 值查询 DB/redis,如果存在,则直接返回短链接。
4)使用302重定向跳转。301 是永久重定向,302 是临时重定向。选择 302 虽然会增加服务器压力,但可统计到短链接被点击的次数,而这个数据是一个非常有用的大数据分析数据源。
5)如果短链接请求频繁,可以借助 redis 做对应的缓存优化。
总结
本文对短链设计方案作了详细地剖析,旨在给大家提供几种不同的短链设计思路,很多本文涉及到的知识点,文中没有展开讲,建议大家回头可以再详细了解一下。
猜你喜欢
- 2025-03-20 Java内存泄漏和CPU飙高问题排查全流程
- 2025-03-20 C语言strtoll函数详解:字符串到长长整型的「多进制翻译官
- 2025-03-20 线上问题解决:java的CPU100%问题分析,定位及解决
- 2025-03-20 JVM超神之路:年后跳槽需要的JVM知识点,都给你整理好了
- 2025-03-20 深入了解SHA-256算法及其Java实现
- 2025-03-20 Java程序性能调优步骤(java性能调优从哪几个方面入手)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)