java短链接_java短网址服务(TinyURL)生成算法

前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接。生成的短链接要求每个链接都是唯一的,并且长度尽可能短。在网上查了一下相关的思路,发现了一个不错的算法。这个算法的思路就是用[a-zA-Z0-9]建立一个长度为62的矩阵,然后把矩阵打乱,再生成一个全局唯一的数字,再把这个数字用矩阵内的元素表示转换成62进制,生成的链接长度最大才11位。所以短链接的生成关键点就变成了如何生成一个全局唯一的数字和实现进制的转换。

1、生成全局唯一的数字

这本质是一个分布式ID的问题。如果简单处理的话可以借用redis的incr操作这样每次取到的ID都是单调递增且唯一的。另外一种方式是借用mysql,这里不是借用mysql的主键的auto_incr特性。而是每一台应用来请求时分配一个范围比如 s1 [100-200], s2 来请求的时候就分配 [201-301],本质是利用乐观锁进行一个cas操作。

如果不想借助外部去生成ID的话,可以用UUID算法。UUID长度12个字节组成由,以下几个部分组成。

4个字节表示的Unix timestamp,

3个字节表示的机器的ID

2个字节表示的进程ID

3个字节表示的计数器

UUID是一类算法的统称,具体有不同的实现。优点是每台机器可以独立产生ID,理论上保证不会重复,所以天然是分布式的,缺点是生成的ID太长,不仅占用内存,而且索引查询效率低。

还有一个叫Twitter Snowflake算法,本质上看起来与UUID有些类似。

你可能感兴趣的:(java短链接)