如何设计短网址系统?

后端面试之系统设计-短网址(Short URL)服务怎么设计? 短网址生成算法数据库怎么设计怎么重定向高并发情况下的高可用数据量过大怎么处理【码农在新加坡】,有更多好的技术分享。【码农在新加坡】,欢迎关注。后端面试之系统设计-短网址(ShortURL)服务怎么设计?httpshttpshttpshttpshttps。......... 阅读详情

短网址的长度

短网址的长度该设计为多少呢? 当前互联网上的网页总数大概是 45亿(参考 http://www.worldwidewebsize.com),超过了 2 32 = 4294967296 2^{32}=4294967296 232=4294967296,那么用一个64位整数足够了。

一个64位整数如何转化为字符串呢?,假设我们只是用大小写字母加数字,那么可以看做是62进制数, l o g 62 ( 2 64 − 1 ) = 10.7 log_{62} {(2^{64}-1)}=10.7 log62​(264−1)=10.7,即字符串最长11就足够了。

实际生产中,还可以再短一点,比如新浪微博采用的长度就是7,因为 6 2 7 = 3521614606208 62^7=3521614606208 627=3521614606208,这个量级远远超过互联网上的URL总数了,绝对够用了。

现代的web服务器(例如Apache, Nginx)大部分都区分URL里的大小写了,所以用大小写字母来区分不同的URL是没问题的。

因此,正确答案:长度不超过7的字符串,由大小写字母加数字共62个字母组成

一对一还是一对多映射?

一个长网址,对应一个短网址,还是可以对应多个短网址? 这也是个重大选择问题

一般而言,一个长网址,在不同的地点,不同的用户等情况下,生成的短网址应该不一样,这样,在后端数据库中,可以更好的进行数据分析。如果一个长网址与一个短网址一一对应,那么在数据库中,仅有一行数据,无法区分不同的来源,就无法做数据分析了。

以这个7位长度的短网址作为唯一ID,这个ID下可以挂各种信息,比如生成该网址的用户名,所在网站,HTTP头部的 User Agent等信息,收集了这些信息,才有可能在后面做大数据分析,挖掘数据的价值。短网址服务商的一大盈利来源就是这些数据。

正确答案:一对多

如何计算短网址

现在我们设定了短网址是一个长度为7的字符串,如何计算得到这个短网址呢?

最容易想到的办法是哈希,先hash得到一个64位整数,将它转化为62进制整,截取低7位即可。但是哈希算法会有冲突,如何处理冲突呢,又是一个麻烦。这个方法只是转移了矛盾,没有解决矛盾,抛弃。

MySQL数据库有一个自增ID,能不能借鉴这个呢?每来一个长网址,就给它发一个号码,这个号码不断的自增。这个方法跟哈希相比,好处是没有冲突,不用考虑处理冲突的问题。如何实现单台的发号服务器呢?可以用一台MySQL服务器来做(一定要用 REPLACE INTO,不要存储所有ID),也可用一台Redis服务器(用INCR),一行代码也不用写;也可以自己写一个RESTful API,代码也很简单,就不赘述了。

单台发号器有什么缺点呢?它是一个单点故障(SPOF, Single Point Of Failure),也会成为性能瓶颈(其实,如果你的QPS能大到压垮这台MySQL,那说明你的短网址服务很成功,可以考虑上市了:D),所以它适合中小型企业,对于超大型企业(以及在面试显得追求高大上),我们还是要继续思考更好的方案,请接着往下看。

下面开始讲如何打造多台机器组成的分布式发号器。

  1. 使用UUID算法或者MongoDB产生的ObjectID。其实MongoDB的ObjectID也算是一种UUID,这类算法,每台机器可以独立工作,天然是分布式的,但是这类算法产生的ID通常都很长,那短网址服务还有什么意义呢?所以这个方法不行。

  2. 多台MySQL服务器。前面讲了单台MySQL作为发号服务器,那么自然可以扩展一下,比如用8台MySQL服务器协同工作,第一台MySQL初始值是1,每次自增8,第二台MySQL初始值是2,每次自增8,一次类推。前面用一个 round-robin load balancer 挡着,每来一个长网址请求,由 round-robin balancer 随机地将请求发给10台MySQL中的任意一个,然后返回一个ID。Flickr用的就是这个方案,仅仅使用了两台MySQL服务器。这个方法仅有的一个缺点是,ID是连续的,容易被爬虫抓数据,爬虫基本不用写代码,顺着ID一个一个发请求就是了,太方便了(手动斜眼)。

  3. 分布式ID生成器(Distributed Id Generator)。分布式的产生唯一的ID,比如 Twitter 有个成熟的开源项目,就是专门做这个的,Twitter Snowflake 。Snowflake的核心算法如下:

image

最高位不用,最高位不用,永远为0,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。

Instagram用了类似的方案,41位表示时间戳,13位表示shard Id(一个shard Id对应一台PostgreSQL机器),最低10位表示自增ID,怎么样,跟Snowflake的设计非常类似吧。这个方案用一个PostgreSQL集群代替了Twitter Snowflake 集群,优点是利用了现成的PostgreSQL,容易懂,维护方便。

因此,正确答案:分布式发号器(Distributed ID Generator),Flick, Twitter Snowflake 和 Instagram的方案都是不错的选择。

如何存储

如果存储短网址和长网址的对应关系?以短网址为 primary key, 长网址为value, 可以用传统的关系数据库存起来,例如MySQL, PostgreSQL,也可以用任意一个分布式KV数据库,例如Redis, LevelDB。

如果你手痒想要手工设计这个存储,那就是另一个话题了,你需要完整地造一个KV存储引擎轮子。当前流行的KV存储引擎有LevelDB何RockDB,去读它们的源码吧。

301还是302重定向

这也是一个有意思的问题。这个问题主要是考察你对301和302的理解,以及浏览器缓存机制的理解。

301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。但是如果用了301, Google,百度等搜索引擎,搜索的时候会直接展示真实地址,那我们就无法统计到短地址被点击的次数了,也无法收集用户的Cookie, User Agent 等信息,这些信息可以用来做很多有意思的大数据分析,也是短网址服务商的主要盈利来源。

所以,正确答案是302重定向。

可以抓包看看新浪微博的短网址是怎么做的,使用 Chrome 浏览器,访问这个URL http://t.cn/RX2VxjI,是我事先发微博自动生成的短网址。来抓包看看返回的结果是啥,

可见新浪微博用的就是302临时重定向。

预防攻击

如果一些别有用心的黑客,短时间内向TinyURL服务器发送大量的请求,会迅速耗光ID,怎么办呢?

首先,限制IP的单日请求总数,超过阈值则直接拒绝服务。

光限制IP的请求数还不够,因为黑客一般手里有上百万台肉鸡的,IP地址大大的有,所以光限制IP作用不大。

可以用一台Redis作为缓存服务器,存储的不是 ID->长网址,而是 长网址->ID,仅存储一天以内的数据,用LRU机制进行淘汰。这样,如果黑客大量发同一个长网址过来,直接从缓存服务器里返回短网址即可,他就无法耗光我们的ID了。

参考资料

转载http://cn.soulmachine.me/2017-04-10-how-to-design-tinyurl/

补充

1、书籍项目:

codeGoogler/ProgramBooks

2:视频教程:

程序员必读Java书籍SpringBoot、Spring、Mybatis、Redis、RabbitMQ、SpringCloud、高并发

觉得不错的小伙伴记得点赞和搜藏哦,后续会持续更新精选技术文章!

全网最精简的短网址系统设计与 Redis 短网址系统的主要目标是将一个长的URL映射到一个短的URL,并能够在用户请求短URL时将其重定向到原始长URL。URL生成器负责生成短的URL,并将其与原始URL进行映射存储。短网址系统的主要目标是将长URL转换为短URL,并在用户请求短URL时将其重定向到原始URL。URL生成器负责生成短URL并将其与长URL进行映射存储,URL解析器负责接收用户请求的短URL并将其重定向到原始URL。为了实现高效的短网址系统,我们可以使用基于自增计数器的方法来生成短URL,并使用Redis来存储URL映射关系。 阅读详情

相关推荐

288be短网址系统 v1.0

288be短网址系统 该短网址系统超级简洁,麻雀虽小,五脏俱全,可以自定义生成你所想要的短网址安装步骤: 1,要有个PHP空间和Mysql数据库 2,解压288.be短网址系统并上传到空间,并创建个空数据库 3,访问你的域名然后安装 4,修改application\config\config.php文件的site_title字段,把288.BE短网址修改成你的网站名。 5,修改根目录下的htaccess.txt文件为.htaccess

短域名系统设计详解(全)

某些输入框的限制,导致域名本身不需要那么冗余等,短域名的可观性非常好在设计这种系统的时候,需要明白输入输出是什么,以及限制条件如何调优等短网址系统设计记笔记的同时融入了一些自已的见解和拓展。

码农研究僧的博客 2498

短网址压缩系统 v0.1.zip

短网址压缩系统 ,缩短网址 短网址服务可以帮助你把一个长网址缩短,方便你在社交网络和微博上分享链接。 支持长网址压缩 短网址还原 系统构架 php txtcached (文本缓存库) 支持千万级 数据 短网址生成形式根据十六进制递进增加     最大值 7FFFFFFF 2147483647 个网址压缩 API 接口   1.生成短网址 请求:向 http://13yd.cn/ 发送post请求 ,发送数据包括 url=长网址 返回:txt文本 2. 显示原网址 请求:向 http://13yd.cn/ 发送post请求 ,发送数据包括 yuan=短网址 返回:txt文本

短网址系统设计

短网址系统设计

m0_53157173的博客 987

短网址管理系统源码.rar

搭建简单 欢迎大家一起学习。 PHP 导入数据库 后台 admin目录 账号 密码 admin 123456 修改关键字和账号密码 确认即可。

ShortURL:URL缩短服务短网址系统

短网址生成服务 提供短网址生成和短网址重启服务 设计 一个网址可能对应多个id,为了减少空间浪费,采用Redis缓存最近经常被转换的长网址。 id生成 参考分布式id生成思想,id由时间序列+随机数+机器标识组成 缓存 使用两个缓存,一个是short url转long url的时候的缓存。另一个是long url转short url的缓存,减少一个长网址可能对应多个短网址所造成的空间浪费 接口 提供long url转short url的api接口: url: http://u.liuin.cn method: POST param: url: string required # 需要转换的长网址 response: { "code": integer, # 状态码,0为成功,其他为失败 "message": string, # 解释 "id_str": string

如何设计一个短URL地址系统

一、短URL系统的原理: 短URL系统的核心是将长的 URL 转化成短的 URL;在访问系统时,先使用短地址A访问短URL系统,由短URL系统映射到对应的长地址B,然后客户端再重定向(301或者302)到B网址,如下图所示: 二、短 URL 的好处: 1、链接变短,对于有长度限制的平台发文,可编辑的文字就变多了 2、短链接生成的二维码更易于识别,而长链接的二维码密集难识别 3、短链接更加简洁好看且安全,不暴露访问参数。 4、能规避关键词、域名屏蔽等手段 5、链接太长在...

张维鹏的博客 4136

RV1126 MIPI CSI-2驱动RGB888图像采集的V4L2实战解析

本文详细解析了在RV1126平台上通过MIPI CSI-2接口采集RGB888格式图像的完整V4L2实战流程。核心内容包括设备树(DTS)配置、内核驱动适配、Media Controller链路调试,以及使用v4l2-ctl工具进行图像抓取与验证的方法,旨在帮助开发者打通从硬件连接到稳定采集RGB888图像数据的关键环节。

weixin_29161719的博客 166

短网址系统介绍

可以使用自定义短网址,如。

m0_74918980的博客 994

Django Cookie/Session

Cookie是一种小型的文本文件,通常由Web服务器发送到用户浏览器,并存储在用户的本地计算机上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,从而实现用户身份验证、个性化设置等功能。Session是一种在服务器端存储用户会话信息的方式。与Cookie不同,Session数据存储在服务器上,而不是客户端。Django框架通过在客户端存储一个Session ID来实现Session的跟踪。Django框架的Cookie/Session机制为开发者提供了方便的数据存储和会话管理功能。

froginwe11的博客 467

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 397

Flask-[项目]-搭建短网址系统:flask实现短网址系统,短网址系统,构建短网址系统

flask实现短网址系统,短网址系统,如何实现短网址系统,搭建短网址系统,构建短网址系统,python搭建短网址系统,flask搭建短网址系统,flask构建短网址系统,flask创建短网址系统

weixin_46371752的博客 1252

Zotero搭配CNKI.js插件:一键批量下载知网文献的完整教程(附常见问题解决)

本文提供Zotero搭配CNKI.js插件实现知网文献批量下载的完整教程。详细介绍了从环境准备、插件安装到实战操作的全流程,并针对常见问题提供解决方案,旨在帮助科研人员高效构建自动化文献管理工作流,显著提升文献收集与整理效率。

e4f5g6h7的博客 1198

短网址系统设计与实现

把一个长网址转成短网址的服务 比如https://bitly.com/ 转换之后网址的后缀不超过7位(字符或者数字) 关于系统设计的第一个要素:场景和限制 使用场景:提供短网址服务位公司其它各业务服务 功能:一个长网址转成短网址并存储;根据短网址还原长url 要求短网址的后缀不超过7位(大小写字母和数字 ) 在https://bitly.com/中 的qps中预估峰值插入请求数...

weixin_44091709的博客 496

【NVIDIA-GB200-1】国内第一份生产环境实战安装配置教程,配置安装脚本,nvidia gb200配置教程-复制即用;gb200驱动安装

GB200 的高性能通信依赖。

jundao1997的专栏 704

[QMT量化交易小白入门]-九、如何用Python记录每一笔交易和调试,报错信息?

定义一个函数来获取日志记录器。: 返回全局的日志记录器,以便在其他地方调用。

木头大左的博客 2143

Java面试-如何设计一个短网址系统?

本文《如何设计一个短网址系统?》系统性地介绍了短网址服务的设计要点与实现方案。主要内容包括: 需求分析:从短码生成、解析到高并发、低延迟等核心需求 设计原则:强调唯一性、无序性、短小精悍和高性能四大要点 核心方案对比:重点推荐自增ID+Base62编码方案,分析其优势及实现方式 架构设计:从单机到分布式系统的演进思路 关键技术: 使用Redis缓存提升性能 布隆过滤器实现高效去重 Base62编码工具类实现 面试要点:涵盖系统设计、优化策略等高频考点 文章通过代码示例和架构图,完整呈现了一个高可用短网址系统

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

SAP NetWeaver Business Client (NWBC) 的深入解析

SAP NetWeaver Business Client(NWBC)作为 SAP 提供的一种用户界面,旨在为终端用户提供无缝集成传统 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序的体验。SAP NetWeaver Business Client(NWBC)是 SAP 推出的用户界面,旨在为终端用户提供单一入口,集成传统的 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序。在实际业务场景中,NWBC 的应用提升了用户的工作效率和体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1601

短网址系统的设计与实现

短网址介绍 想必大家也经常收到垃圾短信吧…短信中的链接一般都是短链接,类似于下图这样: 为什么这里面的URL都是短的呢?有什么好处呢?怎么做到的呢? 短URL的好处 短信和许多平台(微博)有字数限制 ,太长的链接加进去都没有办法写正文了. 好看。 比起一大堆不知所以的参数,短链接更加简洁友好. 方便做一些统计。 你点了链接会有人记录然后分析的. 安全。 不暴露访问参数. 这就是为什么我们现在收到的垃圾短信大多数都是短URL的原因了. 短URL基础原理 短URL从生成到使用分为以下几步

王国隆的技术博客 991

手把手教你学Simulink--基于微电网的建模与仿真场景实例:独立运行模式下微电网的能量管理系统设计

本文详细介绍了使用Simulink对独立运行微电网能量管理系统进行建模与仿真的完整流程。主要包括:系统结构设计(分布式能源、储能系统、负荷等模块)、建模步骤(从创建项目到实现能量管理策略)、仿真设置与结果分析。通过建立基于规则的控制逻辑和优化调度算法,实现微电网的自主运行和能量优化管理。文章还提供了参数优化和多目标改进建议,为新能源和智能电网领域的研究与应用提供了实用指导。

MHD0815的博客 8581

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Go 中的 IEEE 754 半精度浮点库 float16 深入解读:转换、API 与精度保障

> 本仓库(moby)以 `v0.8.4` 版本将 [vendor/github.com/x448/float16](https://link.gitcode.com/i/0491e9b9c50e6f886e84d4b899cd9106) 作为第三方依赖 vendored 进来(见 [go.mod](https://link.gitcode.com/i/d4d997003db803aca12a25

gitblog_00556的博客 1103

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

10-2 系统设计真题解析:短网址系统的设计与实现

一、考点聚焦 如何设计与实现一个短网址系统 1.什么是短网址系统?包含哪些功能(接口) 2.短网址系统的存储设计?需要存储哪些字段? 3.如何设计算法生成短网址? 二、什么是短网址系统? TinyUrl Service 1.把一个长网址转成短网址的服务 2.比如 https://bitly.com/ 3.转换之后网址的后缀不超过7位(字符或者数字) 场景和限制 使用场景:提供短网址服务为公司其他各业务服务 1.功能:一个长网址转成短网址并存储;根据短网址还原长url 2.要求短网址的后缀不超过7位(大小写字

元文的博客 372

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

url编码表_URL短网址系统的设计与实践

导读:在本文中,我们讨论怎样使用Zookeeper、Redis和DynamoDB实现URL短网站服务。关于短网址服务在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密。当人们要分享某个URL,比如短信,邮件,社交媒体(如微博,微信,抖音等),这就需要短URL。最开始时,URL短网址服务听起来是一个很简单的服务,当运行一段时间就会带来一些挑战,这...

weixin_39611506的博客 446

系统设计实战:高可用短网址服务设计

通过混沌工程工具(ChaosBlade)模拟机房故障、网络分区等场景,确保系统韧性满足SLA要求。

aaisjhsgxksgdj的博客 884

如何设计一个短网址系统

网址短链接就是一些长链接的别名,比如 bit.ly, goo.gl, qlink.me,输入这些链接会跳转到对应的长链接。1.为什么需要短链接短链接主要用来为长链接生成更短的别名,用户点击...

somenzz的博客 1632
上一篇: 30k的大佬告诉你怎么入门编程行业?
下一篇: HashMap的负载因子为什么默认是0.75?这篇文章告诉你答案
84696zuoguwz
博客等级 码龄5年 12粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值