短链系统设计

什么是短链接?

短链接就是就是把普通的链接转换为较短的网址。比如常见的我们收到的营销短信中链接hm.tb.cn/x.V8VgyA
短链接优点:短,字符少,美观,便于发布传播。

image.png

百度短网址: dwz.cn/

谷歌短网址: goo.gl/

实现原理

image.png
基本原理大概可以分为下面5步

  1. 用户输入短链接网址hm.tb.cn/x.V8VgyA
  2. DNS解析hm.tb.cn IP地址
  3. 解析出来IP地址,发送HTTP GET请求,查询短码x.V8VgyA
  4. 服务器通过短码查询对应长URL
  5. 通过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少了两个字符’/‘,’+’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
java复制代码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等等。具体的业务选型还需要考虑你们公司所在的技术栈和运维成本等等。

如何支持高并发?如何防止缓存穿透等等?

参考:

www.cnblogs.com/rjzheng/p/1…

time.geekbang.org/column/arti…

zhuanlan.zhihu.com/p/91947139

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%