当前位置:网站首页>系统设计.短链系统设计
系统设计.短链系统设计
2022-07-31 00:50:00 【闲猫】
目录
啥是短链
短一点的链接

为啥需要短链
发送短信应该短一点,美观,节省空间

短链生成的二维码密集度更低,更容易被识别。如图示:

链接太长无法发送
长链接在QQ微信或钉钉上中间断开了,很不友好
短链原理
访问短链 按照长链 给响应请求
访问短链,重定向到长链
一般使用,重定向302
301 和 302 的区别
301永久重定向,即浏览器只需要第一次请求拿到长链接后,下次再去访问这个短链就不会向短网址服务器请求了,而是直接从浏览器的缓存里拿。这样可以提高浏览器的访问速度,但是也有一个问题,就是如果我们想统计活动链接的访问数据的话就无从下手了。或者是这个活动结束了我想删除访问入口,但由于浏览器缓存可能还会导致有用户访问到。所以我们一般不使用301。
302 临时重定向,即每次访问短链都会去请求短网址服务器(除非响应中用 Cache-Control 或 Expired 暗示浏览器缓存),这样就便于 server 数据监控,所以虽然用 302 会给 server 增加一点压力,但明显是利大于弊的。
短链系统
基本能力:
- 生成短链:根据长链 获取 短链,并记录
- 找到长链:根据短链 映射 长链
- 查询是否已生成:根据长链 查短链
- 超时过期:短链 超时清理机制
调用流程:

方案演进
直接记录 长链和短链映射表,直接查询

方案分析:
- 短链 生成 跟 长链 关系不大,使用二维表记录映射关系
- 长链,短链 是字符串,创建索引性价比不高
- 并发有数据库查询效率为瓶颈
- 过期时间需要额外实现
解决痛点:
- 路径1:存储映射关系,将短链和长链 做Hash计算,而后简历索引。查询的时候,先根据HashCode查询,然后再根据文本查询
- 路径2:存储映射关系,可以使用redis实现
- 路径3:让长短链 有逻辑关系,可以使用短链直接还原出长链
存储映射关系,用HashCode优化查询效率

根据短链获取长链 或者 根据长链获取短链:使用类似HashMap的get算法,先根据HashCode查询,然后再根据短链文本查询
逻辑:
- 根据长找短场景:
- 长链 计算 得到HashCode值
- 根据HashCode值查询,然后在查询的列表,再根据 文本查询
- 根据短找长场景:
- 短链 计算 得到HashCode值
- 根据HashCode值查询,然后在查询的列表,再根据 文本查询
分析:
- 数据库性能瓶颈依然存在
- 过期时间需要额外逻辑保证
解决:使用redis能解决这两个问题
扩展:当然也可以使用MD5替代HashCode,也可以。
Redis替代DB存储映射关系
无论使用啥样的Hash算法,都可能会冲突。
为了这种冲突就需要解决,一个Code对应多文本场景。
根据长链找短链场景:
- 长链 计算Hash值
- 根据Hash值获取value,value应该是一个列表,且需要存储长短链
- 数据结构:
{ “HashCode”:[ {唯一ID,LongUrl,ShortUrl}, {唯一ID,LongUrl,ShortUrl} ], } |
- 1:M场景 超时机制稍微借助逻辑实现
- 唯一ID作为key设置expire过期时间
- 查询到“唯一ID”需要判断是否过期
优点是查询性能高,可以抗量,且自带过期机制
缺点是需要维护结构关系稍显繁琐复杂
如果能保障 URL和Hash值 1:1关系,数据结构稍微简单点,也需要维护多个kv关系
估计大部分会选择这种方法。
长短1:1场景改进方案
前提:
- URL和Hash值 1:1关系
- 只对长链做Hash值,短链比较短就直接查询吧
- 使用redis实现
分析:
- URL根据Hash算法直接计算
- 冲突解决:短链需要判重,如果重复则长链添加固定字符串后继续计算短链判重
- 判重优化:可以使用布隆过滤器判断短链是否已经有了
- hash算法可以是:MD5,SHA加密算法;非加密型MurmurHash 算法
存储kv对:
- 长 Code 》 短
- 短 》长

百万高性能短链系统
1. Web是局限

2. OpenResty直接请求Redis

END
边栏推荐
- ros2知识:在单个进程中布置多个节点
- 过滤器(Filter)
- typescript17 - function optional parameters
- ELK deployment script---pro test available
- WMware Tools installation failed segmentation fault solution
- Go study notes (84) - Go project directory structure
- MySQL notes under
- GO GOPROXY代理设置
- Shell programming of conditional statements
- 【952. 按公因数计算最大组件大小】
猜你喜欢
随机推荐
Yolov7实战,实现网页端的实时目标检测
Understand from the 11 common examples of judging equality of packaging types in the written test: packaging types, the principle of automatic boxing and unboxing, the timing of boxing and unboxing, a
Method for deduplication of object collection
API 网关 APISIX 在Google Cloud T2A 和 T2D 的性能测试
typescript18-对象类型
过滤器(Filter)
Filter (Filter)
[C language course design] C language campus card management system
Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv
小程序-全局数据共享
[Tang Yudi Deep Learning-3D Point Cloud Combat Series] Study Notes
Common network status codes
ShardingSphere之读写分离(八)
Neural Network (ANN)
人工智能与云安全
MySQL table design for message queue to store message data
unity2D横版游戏教程4-物品收集以及物理材质
typescript14-(单独指定参数和返回值的类型)
解决:Parameter 0 of method ribbonServerList in com.alibaba.cloud.nacos.ribbon.NacosRibbonClientConfigu
Unity2D horizontal version game tutorial 4 - item collection and physical materials








