长URL转换为短URL,核心是将形如:https://cloud.tencent.com/developer/article/1563962 的地址转换成 https://t.cn/Qgy5Fg 的形式; 要将长URL变短,要么给URL生成一个全局唯一的ID,要么将URL地址本身用算法加密后变短;
1、最开始考虑用数据库,天然顺序递增,新增的时候要根据短查长,根据长查短,有两次IO开销,存在瓶颈问题; 2、将URL使用HASH算法,但涉及到有HASH算法就会遇到HASH碰撞的问题; 3、雪花算法,全局唯一,天然支持分布式环境,但是缺陷受服务器时间的影响,如果时钟回调就会出现问题;
将给定的URL采用MD5加密,再将这个串转换成长度为16的字节数组;然后遍历数组,取得每个byte位的绝对值 ,然后转换成16进制字符串,如果长度不够则用0在前面来补位,将这些字符串相加得到一个长度为32的字符串;
目前短URL的规律是:里面只有字母(大小写)和数字组合而成,大小写字母一共52个,数字10个,一共62个; 根据算法生成的32位字符串,将其分割成4段,每段8个字符,将每一个字符当成16进制数字来处理,取得其长整形的数值,这样这个值就有32位,去掉高位的两位 ,保留30位,将其分割成6段,每段的长度为5,通过位运算取得index下标去字母数字表中取字符来拼接成短链接;
因为长、短链接是要保存在JVM内存中的,而且不能将JVM的内存撑爆,所以系统中设计了基于HASHMAP的LRU算法的缓存;实现思路借鉴了ConcurrentHashMap中分段 的思想,某个段中的保存的数据采用链表结构,链表头部存放最近最少访问的数据,热点数据放置于链表尾部,如果链表中数据满了且有新的数据加入,则删除链表头部的数据, 然后将新数据放置于链表尾部;
考虑到系统应用于公共服务,向内外部提供长链接转换短链接,需要对生成接口做流量保护,从而使系统稳定运行;所以系统中使用了流量限制策略,对具体的接口采用不同的限流 策略,达到限制后将拒绝短链接请求;
-Xms2048m -Xmx2048m -server -XX:+UseG1GC