生成短链接
今天介绍日常用的长链接转换短链接算法。
应用场景:
这里拿一个短链接做测试,当我们在浏览器里输入 https://bit.ly/2LGnewR 时:
1、首先在 DNS服务器解析域名的 IP 地址(67.199.248.10);
2、获得服务器IP地址后向服务器发送 HTTP-GET 请求,查询短码 2LGnewR;
3、此时服务器会通过短码 2LGnewR 获取对应的长链接;
4、请求通过 HTTP(301/302)转到对应的长链接响应用户。
https://www.elastic.co/guide/cn/elasticsearch/guide/2.x/bulk.html
实现原理讨论:
看了网上学者的介绍,原理可以采用发号策略完成,每次处理长地址时,发一个号即可。小型系统直接用mysql的自增索引即可,不仅保证唯一性也不会有太大服务压力。如果是请求量较大的话,可以考虑各种分布式KV系统做发号器,不停的自增。
第一个用户短链是 http://***/0,第二个是 http://***/1, 第11个就是 http://***/a,依次往后,实现了一个62进制的自增字段即可。当我们拿到kv系统给的自增的十进制的数字后,然后把数字转成62进制(数字+小写字母+大写字母)。
157284857781 => 2LGnewR
相关问题
1、长链接和短链接一对一
方案1:链接是保存db的,可以先查询,没有再插入,有就返回结果;
方案2:在方案1基础上增加一个 cache,在 kv 系统上面构建一个一定容量的长对短的 hash 表作为缓存,淘汰机制可以使用 LRU,虽不能够保证 100% 为一对一,但能减少db压力;
方案3:battle,tiff,就是不做这个需求。
2、高并发和高可用
发号器单点变多点,加几台。假设我有100个发号器,那个每个发号器的自增不再是1而是100。
3、存储
可以存在db中,也可以全部放在类似redis中,因为老东家将某个大省的一种数据全部放在redis中快上千万也没问题。主要还是看公司业务和常用的组件选择吧。
4、301还是302
301是永久重定向,好处能减少服务器压力但是缺点是无法统计链接点击数;302是临时重定向,好处是统计链接点击数,缺点是消耗服务器资源。一般会选择302,分析用户的数据比较重要。
https://gitee.com/mjTree/javaDevelop/tree/master/genShortURL
达尔文狐
达尔文狐:体长48-60厘米,平均肩高25厘米,尾长17-26厘米,体重1.9-3.9千克,是一种体形非常小的狐狸,和家猫差不多大小。毛色暗灰色,腿部和面部有红色。腹部、喉头、胸口和耳内有白色或奶油色毛。耳壳红毛特别鲜艳。
在1834年,查尔斯·达尔文在旅行经过奇洛埃岛时发现并命名了这种动物。 它们现生活在智利南部沿海温带森林里,杂食性的,主要食用小哺乳动物、鸟、爬行动物、两栖动物、甲虫、其他无脊椎动物和果实,也吃腐肉。
野犬对狐狸的生存是最大的威胁,家犬也是一样,温带森林的采伐和偷猎也威胁着它们的生存。偷猎的主要原因是将小狐抓来作为宠物出售。
列入 IUCN 2016年濒危物种红色名录ver 3.1——濒危
列入《华盛顿公约》CITES 附录Ⅱ级保护动物
https://zhuanlan.zhihu.com/p/34058827