设计一个短链接系统
设计一个短链接系统
前言
在发送短信和微博等限定字数的场景下,短链接的需求就应运而生了。
原理
一张图概括了短链接干的事:

来源:孤独的烟
短链接设计关键在于:
短链接生成的算法:如何保证足够短且不冲突。
其中常用的算法有
- 1、基于哈希的MurmurHash 算法
- 2、十进制转62进制
- 3、自增序列(Snowflake、Mysql 自增主键、类 uuid、redis)
关于短链接的原理研究可以阅读这两位大佬的文章:
xbmchina.cn/AAAAAG
xbmchina.cn/AAAAAH
实践
基于上面的理论思想:
本文采用十进制转62进制的算法+Redis全局自增的方式实现短链接服务。

公众号:爱编码
1、十进制转62进制
短链接是由 a-z、A-Z 和 0-9 共 62 个字符。
我们可以讲十进制的数字id,转换为一个62进制的数,例如20201122就可以转换为WvOi。
十进制转62进制工具类如下:
public class Base62 {
private static final char[] toBase62 = {'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',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
private static final int[] fromBase62 = new int[128];
private static final int RADIX = 62;
static {
Arrays.fill(fromBase62, -1);
for (int i = 0; i < toBase62.length; i++) {
fromBase62[toBase62[i]] = i;
}
}
private Base62() {
}
public static String encode(Long l) {
StringBuilder stringBuilder = new StringBuilder();
while (l > 0) {
stringBuilder.append(toBase62[(int) (l % RADIX)]);
l /= RADIX;
}
return stringBuilder.reverse().toString();
}
public static long decode(String s) {
long l = 0L;
long d = 1L;
for (int i