一些业务场景,好比说短信、push须要带上跳转连接,这个时候就须要把长链转换为短链redis
长链如何转短链?其实长链和生成短链的过程是没有任何关系的,惟一的联系就是生成之后作关联算法
结合实际工做中以及网上,大概两种比较常规的方式,默认生成六位短链数据库
for (int i = 0; i < 36; i++) { int random = random.nextInt(2); randomNumber = random + (randomNumber << 1); }
加上0,1随机数,是为了防止碰撞,这样碰撞的概率就差很少是1/2的36次方,属于接收范围数组
至于为何循环36次,后面会说;至此,一个随机数randomNumber已经生成 缓存
for (int i = 0; i < 6; i++) { charList.append(char62[(int) (k & randomNumber )]);
randomNum = (randomNum >> 6);
}
K是什么?K是63,16进制0x3F,和randomNumber作操做,获得一个62进制的数,而后取出来对应的那一位并发
62进制数组成:26位大写字母+26位小写字母+10个数字app
而后randomNum右移6位,这就和上面的36次循环生成随机数对应了dom
36次循环分红6份,每份随机出来的0,1组合对应一个符号分布式
这种方式借助于数据库的自增主键id,而后把ID映射为62进制数的6位,这篇文章介绍spa
https://blog.csdn.net/xlgen157387/article/details/80026452
这种方式,要考虑分布式生成的状况,还有数据压力。我的想法能够参考美团的leaf生成器,分段拿
到这里,已经生成了短链,可是短链和长链如何映射?
对应关系确定是要持久化到数据库的,可是一旦并发量大的时候,数据库压力比较大,就须要考虑用缓存了;优先使用redis的时候,又无法把所有的映射关系存起来,
以为底层仍是须要依赖分表来解决部分问题,用长链的md5和短链分表,分别作惟一键。这里惟一键的做用就是防止短链碰撞,在短链碰撞的时候能够进行重试。
还有就是长链和短链的映射关系咱们在缓存的时候,能够认为是符合最近使用的原则,也就是咱们只保留“热点”的长链和短链在缓存的映射关系,这样能够大大减小缓存的大小