系统设计.短链系统设计
目录
啥是短链
为啥需要短链
短链原理
301 和 302 的区别
短链系统
方案演进
直接记录 长链和短链映射表,直接查询
存储映射关系,用HashCode优化查询效率
Redis替代DB存储映射关系
长短1:1场景改进方案
百万高性能短链系统
啥是短链
短一点的链接
为啥需要短链
发送短信应该短一点,美观,节省空间
短链生成的二维码密集度更低,更容易被识别。如图示:
链接太长无法发送
长链接在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
系统设计.短链系统设计相关推荐
- 短链系统设计-服务设计
2 Service 服务 - 逻辑块聚类与接口设计 该系统其实很简单,只需要有一个 service即可:URL Service.由于 tiny url只有一个 UrlService: 本身其实就是个小 ...
- 短链系统设计-场景需求及性能要求分析
如脉脉,不会纵容你发太长的网址,会给你转成短链. 1 Scenario 场景 根据一个 long url 生成一个short url. 如 http://www.javaedge.com => ...
- 记一次短链系统设计:
遇到的问题: 发号器选择(最终选择为使用乐观锁方式实现的数据库发号) 数据存储(mysql) 为什么不使用雪花算法发号 发号器并发测试tps不高怎么解决 mysql数据库字段值默认不区分大小写,导致短 ...
- 短链系统设计-用户自定义短链
5 用户自定义短链接 实现一个顾客短网址,使得顾客能创立他们自己的短网址.即你需要在前文基础上再实现一个 createCustom. 需实现三个方法: long2Short(url) 把一个长网址转换 ...
- 短链系统设计-存储设计
3 Storage 数据存取(最能体现实践经验) select 选存储结构 scheme 细化数据表 3.1 SQL V.S NoSQL 需要事务吗?No,nosql+1 需要丰富的 sql quer ...
- 面试系统设计_系统设计面试问题–您应该知道的概念
面试系统设计 You may have heard the terms "Architecture" or "System Design." These com ...
- 什么嵌入式计算机系统设计,嵌入式系统设计分为哪些方向
原标题:嵌入式系统设计分为哪些方向 嵌入式系统设计包括硬件系统设计与软件系统设计,其中硬件系统设计分为:器件及芯片的选型.原理图设计.PCB板设计,然后制板.焊接. 这其中遇到的问题不是很复杂,因为芯 ...
- 系统设计——如何设计一个高性能的短链接系统?
短链系统设计看起来很简单,但如何设计一个高性能短链系统呢,这也是面试中非常常见的一道设计题. 首先,为什么要用短链? 短链跳转的基本原理是什么? 短链生成的几种方法你知道吗? 高性能短链的架构如何设计 ...
- stm32f103r6最小系统原理图_电气工程师电气系统设计与电气设备的选择
随着国家的发展,电气系统也随着改变,日益复杂,而电气系统的设计也变得非常繁琐,电气主接线设计,元件选择,电气设备选择,配电装置设计,每个环节都是需要综合考虑现场的情况和用户的需求,电气系统中的计算,继 ...
最新文章
- ai条码插件免安装_ai条码插件2款下载|Barcode Toolbox插件+Barcode条码插件下载 - 偶要下载站...
- python 漂亮打印 pprint 简写
- 网站优化助力网站在同行中更加出类拔萃
- python安装库-python 安装库
- Go 语言读写 Excel
- Spring Cloud:指定Eureka Serverd IP地址
- 分布式版本控制系统Git的安装和使用
- 多丽丝·莱辛获今年诺贝尔文学奖
- 理解依赖注入(IOC)和学习Unity
- [css] 你有去看过或者了解过css的标准文档吗?
- 时域补零对于DFT谱的影响
- Android View框架总结(三)View工作原理
- mysql事务和锁 SELECT FOR UPDATE
- python实现小写金额转换成大写
- 如何把视频压缩到最小?请看详细步骤
- 转:最详细的JavaScript 教程,入门级都能看懂
- 《动手学深度学习》(PyTorch版)代码注释 - 3 【Softmaxs_regression_with_zero】
- (每日一练c++)CC113 数独
- 2021-09:Java的框架甲骨文面试题(自己总结的)
- QTreeWidget使用整理
热门文章
- 独家 | 围绕DeepMind最新AI模型的炒作,忽视了它真正值得注意的地方(附链接)...
- 星露谷物语部分攻略图
- 基于MDKA5D31-EK_T70开发板的QT示例-demo12:pcf8562演示
- 愿做一颗螺丝钉 灵宝西所第一警务区 焦帅宾
- win7计算机电源设置在哪里设置,windows7电源管理设置在哪里_win7的电源管理在哪里打开-win7之家...
- BUG 和 BUG_ON
- html相对路径例子,相对路径
- 车载Camera术语大全
- Nginx配置同时支持http和https两种方式访问
- 巧用便签里的待办列表 让工作更有效率