目录

啥是短链

为啥需要短链

短链原理

301 和 302 的区别

短链系统

方案演进

直接记录 长链和短链映射表,直接查询

存储映射关系,用HashCode优化查询效率

Redis替代DB存储映射关系

长短1:1场景改进方案

百万高性能短链系统


啥是短链

短一点的链接

为啥需要短链

发送短信应该短一点,美观,节省空间 

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

链接太长无法发送

长链接在QQ微信或钉钉上中间断开了,很不友好

短链原理

访问短链 按照长链 给响应请求

访问短链,重定向到长链

一般使用,重定向302

301 和 302 的区别

301永久重定向,即浏览器只需要第一次请求拿到长链接后,下次再去访问这个短链就不会向短网址服务器请求了,而是直接从浏览器的缓存里拿。这样可以提高浏览器的访问速度,但是也有一个问题,就是如果我们想统计活动链接的访问数据的话就无从下手了。或者是这个活动结束了我想删除访问入口,但由于浏览器缓存可能还会导致有用户访问到。所以我们一般不使用301。

302 临时重定向,即每次访问短链都会去请求短网址服务器(除非响应中用 Cache-Control 或 Expired 暗示浏览器缓存),这样就便于 server 数据监控,所以虽然用 302 会给 server 增加一点压力,但明显是利大于弊的。

短链系统

基本能力:

  1. 生成短链:根据长链 获取 短链,并记录
  2. 找到长链:根据短链 映射 长链
  3. 查询是否已生成:根据长链 查短链
  4. 超时过期:短链 超时清理机制

调用流程:

方案演进

直接记录 长链和短链映射表,直接查询

方案分析:

  1. 短链 生成 跟 长链 关系不大,使用二维表记录映射关系
  2. 长链,短链 是字符串,创建索引性价比不高
  3. 并发有数据库查询效率为瓶颈
  4. 过期时间需要额外实现

解决痛点:

  1. 路径1:存储映射关系,将短链和长链 做Hash计算,而后简历索引。查询的时候,先根据HashCode查询,然后再根据文本查询
  2. 路径2:存储映射关系,可以使用redis实现
  3. 路径3:让长短链 有逻辑关系,可以使用短链直接还原出长链

存储映射关系,用HashCode优化查询效率

根据短链获取长链 或者 根据长链获取短链:使用类似HashMap的get算法,先根据HashCode查询,然后再根据短链文本查询

逻辑:

  1. 根据长找短场景:

    1. 长链 计算 得到HashCode值
    2. 根据HashCode值查询,然后在查询的列表,再根据 文本查询
  2. 根据短找长场景:
    1. 短链 计算 得到HashCode值
    2. 根据HashCode值查询,然后在查询的列表,再根据 文本查询

分析:

  1. 数据库性能瓶颈依然存在
  2. 过期时间需要额外逻辑保证

解决:使用redis能解决这两个问题

扩展:当然也可以使用MD5替代HashCode,也可以。

Redis替代DB存储映射关系

无论使用啥样的Hash算法,都可能会冲突。

为了这种冲突就需要解决,一个Code对应多文本场景。

根据长链找短链场景:

  1. 长链 计算Hash值
  2. 根据Hash值获取value,value应该是一个列表,且需要存储长短链
  3. 数据结构:

{

“HashCode”:[

{唯一ID,LongUrl,ShortUrl},

{唯一ID,LongUrl,ShortUrl}

],

}

  1. 1:M场景 超时机制稍微借助逻辑实现

    1. 唯一ID作为key设置expire过期时间
    2. 查询到“唯一ID”需要判断是否过期

优点是查询性能高,可以抗量,且自带过期机制

缺点是需要维护结构关系稍显繁琐复杂

如果能保障 URL和Hash值 1:1关系,数据结构稍微简单点,也需要维护多个kv关系

估计大部分会选择这种方法。

长短1:1场景改进方案

前提:

  1. URL和Hash值 1:1关系
  2. 只对长链做Hash值,短链比较短就直接查询吧
  3. 使用redis实现

分析:

  1. URL根据Hash算法直接计算
  2. 冲突解决:短链需要判重,如果重复则长链添加固定字符串后继续计算短链判重
  3. 判重优化:可以使用布隆过滤器判断短链是否已经有了
  4. hash算法可以是:MD5,SHA加密算法;非加密型MurmurHash 算法

存储kv对:

  1. 长 Code 》 短
  2. 短 》长

百万高性能短链系统

1. Web是局限

2. OpenResty直接请求Redis


END

系统设计.短链系统设计相关推荐

  1. 短链系统设计-服务设计

    2 Service 服务 - 逻辑块聚类与接口设计 该系统其实很简单,只需要有一个 service即可:URL Service.由于 tiny url只有一个 UrlService: 本身其实就是个小 ...

  2. 短链系统设计-场景需求及性能要求分析

    如脉脉,不会纵容你发太长的网址,会给你转成短链. 1 Scenario 场景 根据一个 long url 生成一个short url. 如 http://www.javaedge.com => ...

  3. 记一次短链系统设计:

    遇到的问题: 发号器选择(最终选择为使用乐观锁方式实现的数据库发号) 数据存储(mysql) 为什么不使用雪花算法发号 发号器并发测试tps不高怎么解决 mysql数据库字段值默认不区分大小写,导致短 ...

  4. 短链系统设计-用户自定义短链

    5 用户自定义短链接 实现一个顾客短网址,使得顾客能创立他们自己的短网址.即你需要在前文基础上再实现一个 createCustom. 需实现三个方法: long2Short(url) 把一个长网址转换 ...

  5. 短链系统设计-存储设计

    3 Storage 数据存取(最能体现实践经验) select 选存储结构 scheme 细化数据表 3.1 SQL V.S NoSQL 需要事务吗?No,nosql+1 需要丰富的 sql quer ...

  6. 面试系统设计_系统设计面试问题–您应该知道的概念

    面试系统设计 You may have heard the terms "Architecture" or "System Design." These com ...

  7. 什么嵌入式计算机系统设计,嵌入式系统设计分为哪些方向

    原标题:嵌入式系统设计分为哪些方向 嵌入式系统设计包括硬件系统设计与软件系统设计,其中硬件系统设计分为:器件及芯片的选型.原理图设计.PCB板设计,然后制板.焊接. 这其中遇到的问题不是很复杂,因为芯 ...

  8. 系统设计——如何设计一个高性能的短链接系统?

    短链系统设计看起来很简单,但如何设计一个高性能短链系统呢,这也是面试中非常常见的一道设计题. 首先,为什么要用短链? 短链跳转的基本原理是什么? 短链生成的几种方法你知道吗? 高性能短链的架构如何设计 ...

  9. stm32f103r6最小系统原理图_电气工程师电气系统设计与电气设备的选择

    随着国家的发展,电气系统也随着改变,日益复杂,而电气系统的设计也变得非常繁琐,电气主接线设计,元件选择,电气设备选择,配电装置设计,每个环节都是需要综合考虑现场的情况和用户的需求,电气系统中的计算,继 ...

最新文章

  1. ai条码插件免安装_ai条码插件2款下载|Barcode Toolbox插件+Barcode条码插件下载 - 偶要下载站...
  2. python 漂亮打印 pprint 简写
  3. 网站优化助力网站在同行中更加出类拔萃
  4. python安装库-python 安装库
  5. Go 语言读写 Excel
  6. Spring Cloud:指定Eureka Serverd IP地址
  7. 分布式版本控制系统Git的安装和使用
  8. 多丽丝·莱辛获今年诺贝尔文学奖
  9. 理解依赖注入(IOC)和学习Unity
  10. [css] 你有去看过或者了解过css的标准文档吗?
  11. 时域补零对于DFT谱的影响
  12. Android View框架总结(三)View工作原理
  13. mysql事务和锁 SELECT FOR UPDATE
  14. python实现小写金额转换成大写
  15. 如何把视频压缩到最小?请看详细步骤
  16. 转:最详细的JavaScript 教程,入门级都能看懂
  17. 《动手学深度学习》(PyTorch版)代码注释 - 3 【Softmaxs_regression_with_zero】
  18. (每日一练c++)CC113 数独
  19. 2021-09:Java的框架甲骨文面试题(自己总结的)
  20. QTreeWidget使用整理

热门文章

  1. 独家 | 围绕DeepMind最新AI模型的炒作,忽视了它真正值得注意的地方(附链接)...
  2. 星露谷物语部分攻略图
  3. 基于MDKA5D31-EK_T70开发板的QT示例-demo12:pcf8562演示
  4. 愿做一颗螺丝钉 灵宝西所第一警务区 焦帅宾
  5. win7计算机电源设置在哪里设置,windows7电源管理设置在哪里_win7的电源管理在哪里打开-win7之家...
  6. BUG 和 BUG_ON
  7. html相对路径例子,相对路径
  8. 车载Camera术语大全
  9. Nginx配置同时支持http和https两种方式访问
  10. 巧用便签里的待办列表 让工作更有效率