什么是短链接?
短链接就是就是把普通的链接转换为较短的网址。比如常见的我们收到的营销短信中链接hm.tb.cn/x.V8VgyA 短链接优点:短,字符少,美观,便于发布传播。
百度短网址: dwz.cn/
谷歌短网址: goo.gl/
实现原理
基本原理大概可以分为下面5步
- 用户输入短链接网址hm.tb.cn/x.V8VgyA
- DNS解析hm.tb.cn IP地址
- 解析出来IP地址,发送HTTP GET请求,查询短码x.V8VgyA
- 服务器通过短码查询对应长URL
- 通过301重定向跳转到对应的长URL 注:这里我们要区分301和302重定向的区别,看具体自己应用场景。 HTTP响应状态代码,301 是永久重定向, 302 是临时重定向 301 永久重定向,GET请求301跳转会默认被浏览器缓存起来。302 GET请求默认不会被缓存
短链接转换核心算法
如何将长链接转换为短链接,我们一般的应用场景比如短信营销,用户通过短链接跳转到对应的营销活动落地页面,短链接长链接转换的核心其实就是长链短链的映射关系,以及如何将长链接转换为短链接。
一般常用的有两种算法1. 哈希 2. 全局唯一ID算法
- 1. MurmurHash 哈希算法 哈希算法有很多种,应用广泛且性能较高的MurmurHash算法,比如我们常见的Redis一致性Hash算法就是基于MurmurHash实现的。
MurmurHash 提供了两种长度的哈希值,128bits和32bits,
- 2. 全局唯一ID 全局唯一ID,其实我们能想到的就有很多,比如手机号码,会员ID等,或者代码生成比如雪花算法,MySQL自增ID。
获取唯一的短码之后,我们需要短码尽可能的短,还需要将long型id转换为BASE62字符,Base62比BASE64少了两个字符'/','+'
public class Base62Utils {
private static final char[] toBASE62 = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
public static String toBase62(long num) {
StringBuilder sb = new StringBuilder();
do {
int i = (int) (num % 62);
sb.append(toBASE62[i]);
num /= 62;
} while(num > 0);
return sb.reverse().toString();
}
}
数据存储设计
数据存储设计,主要还是看具体的业务场景,比如数据量在百亿级别,MySQL估计是搞不定了。那么如何选型NoSQL数据库?常见的NoSQL数据库MongoDB, Hbase,ES,DynamoDB, Cassandra 或者 Riak等等。具体的业务选型还需要考虑你们公司所在的技术栈和运维成本等等。
如何支持高并发?如何防止缓存穿透等等?
参考: