将长链接转短连接的系统。一开始答得不是很好,后来通过自己的思考和阅读资料整理了这篇文章的内容。
短网址(也叫短网址:Short URL)是将很长的网站链接缩短为短链接,因为微博有字数限制,所以生成短网址就是为了这个目的。微博、短信提醒等大部分地方已经有了很多应用。
1、在内容长度有限的平台发帖时,链接变短,可编辑文字增加
最典型的是微博,限制在140字以内。如果直接连接一个长链,比如连接后像“has11nut06bab2y3”这样的100个字符,剩下的其他可编辑内容就很少了。如果使用短链接,链接长度会大大减少,自然可编辑的文本会更多。另一个例子是短信的长度有限制。如果使用长链,一条短信很可能被拆分成两三条短信,原本一分钱的短信费变成了两三分钱。此外,使用短链在内容布局上也更加美观。
2、我们经常需要将链接转换成二维码分享给他人。如果是长链,二维码密集,难以识别,但短链则没有这个问题。
跳跃原理
我们可以将其视为整个交互过程。具体流程详情如下:
(1)用户访问短链接
(2)短链接服务器dwz.date收到请求,根据URL路径fn4w获取原始长链接(在KV缓存数据库中搜索)
(3)服务器返回302状态码,并将响应头中的Location设置
(4)浏览器重新发送请求到
(5)返回响应
具体方案
优化方案算法优化
短链接标识一般是[0-9,az,AZ]的随机组合,共62个字符,所以短链接标识可以用16进制字符串表示。
首先维护一个自动递增的 ID。生成短链接时,将十进制自增ID转换为62位十六进制字符串,可以唯一标识长链接。由于ID是自增的,对应的62位字符串是不同的长链接转短连接设计,所以不会出现一个短链接对应多个长链接的问题。62个字符的排列组合可以保证短链接取之不尽用之不竭。即使仅限于 6 位长度标识的短链接,也有超过 558 亿个案例。这种算法在网上被称为自增序列算法。
1、16进制的顺序不一定严格按照0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ的顺序,这个顺序可以打乱,这样生成的短链接logo比较随意,不容易被破解。
2、长链接和短链接是否需要一对多的关系?自增主键ID算法对同一个长链接生成的短链接是不同的。因为自增主键ID不同,生成的62位字符串自然也不同。如果我们有一个长链接只对应一个短链接需求,我们可以用md5加密长链接,将加密后的md5值存入DB,根据长链接的md5值查询DB,再生成短链接关联。短链接是直接返回的,当然也可以用其他方法来维护这种关系。
短地址发送者优化方案
1、算法优化
使用上述算法,如果不做判断,即使是相同的原始URL,每次生成的短链接也会不同短链接设计,会浪费存储空间(因为需要存储多个短链接到同一个URL的映射) . 如果同一个URL可以映射到同一个短链接,这样可以节省存储空间。主要思想如下:
选项1:查表
每次生成短链接时,首先检查映射表中是否存在原始URL的映射关系,如果有则直接返回结果。显然,这种方法效率低下。
选项2:使用LRU本地缓存,空间换时间
一个固定大小的 LRU 缓存用于存储最新的 N 个映射结果。这样,如果一个链接的生成非常频繁,可以在LRU缓存中找到结果短链接设计,直接返回。这是存储空间和性能之间的折衷。
2、可扩展且高度可用
如果短链接生成服务部署在单机上,缺点是性能不足以承受海量并发访问,二是成为系统的单点。如果机器宕机,整套服务都不可用。为了解决这个问题,系统可以进行Clustering,“sharding”。
在上面描述的系统架构中,如果发送端是用 Redis 实现的,那么 Redis 就是系统的瓶颈和单点。因此,利用数据库分片的设计思想完美:设计一个将长链接地址转换为短链接地址的系统,可以部署多个发送者实例,每个实例负责一个特定的ID号。对于Segment的编号,例如,部署10个Redis单元,每个单元负责对以0-9结尾的Segment的编号。请注意,编号设备的步长应设置为 10(实例数)。
另外,长链接和短链接的映射关系的存储也可以分片。由于没有集中存储位置,因此需要开发额外的服务来找到短链接对应的原始链接的存储节点。找到正确节点上的映射关系。