前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接。生成的短链接要求每个链接都是唯一的,并且长度尽可能短。在网上查了一下相关的思路,发现了一个不错的算法。这个算法的思路就是用[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有些类似。
总的来说redis,mysql解决方案就比较简单直接可以满足大部分的场景,如果要保证高性能和高可用的话uuid和twitter snowflake算法就更合适,实现起来相对复杂一些。
2、进制转换
这个操作就相对简单了。直接上代码:
相关文章
猜你喜欢
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10


