ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

长链生成短链的思考

2020-01-08 19:03:26  阅读:357  来源: 互联网

标签:长链 映射 36 生成 思考 短链 randomNumber


一些业务场景,比如说短信、push需要带上跳转链接,这个时候就需要把长链转换为短链

长链如何转短链?其实长链和生成短链的过程是没有任何关系的,唯一的联系就是生成以后做关联

1:短链生成

结合实际工作中以及网上,大概两种比较常规的方式,默认生成六位短链

方式一:通过移位+简单的算法生成一个随机数

第一步:做位移,并加上一个0,1随机数

for (int i = 0; i < 36; i++) {
    int random = random.nextInt(2);
    randomNumber = random  + (randomNumber << 1);
}

加上0,1随机数,是为了防止碰撞,这样碰撞的几率就差不多是1/2的36次方,属于接收范围

至于为什么循环36次,后面会说;至此,一个随机数randomNumber已经生成 

第二步:用随机数映射到6位的短链

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个数字

然后randomNum右移6位,这就和上面的36次循环生成随机数对应了

36次循环分成6份,每份随机出来的0,1组合对应一个符号

方式二:信号发射器

这种方式借助于数据库的自增主键id,然后把ID映射为62进制数的6位,这篇文章介绍

https://blog.csdn.net/xlgen157387/article/details/80026452 

这种方式,要考虑分布式生成的情况,还有数据压力。个人想法可以参考美团的leaf生成器,分段拿

到这里,已经生成了短链,但是短链和长链如何映射?

2:长链和短链的映射

对应关系肯定是要持久化到数据库的,但是一旦并发量大的时候,数据库压力比较大,就需要考虑用缓存了;优先使用redis的时候,又没法把全部的映射关系存起来,

觉得底层还是需要依赖分表来解决部分问题,用长链的md5和短链分表,分别做唯一键。这里唯一键的作用就是防止短链碰撞,在短链碰撞的时候可以进行重试。

还有就是长链和短链的映射关系我们在缓存的时候,可以认为是符合最近使用的原则,也就是我们只保留“热点”的长链和短链在缓存的映射关系,这样可以大大减少缓存的大小

标签:长链,映射,36,生成,思考,短链,randomNumber
来源: https://www.cnblogs.com/at20191018/p/12168241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有