`

短 URL 系统是怎么设计的?

阅读更多
摘要: 实现一个算法,将长地址转成短地址。实现长和短一一对应。然后再实现它的逆运算,将短地址还能换算回长地址。这个回答看起来挺完美的,然后候选人也会说现在时间比较短,如果给我时间我去找这个算法就解决问题了。但 ...
 
 
实现一个算法,将长地址转成短地址。实现长和短一一对应。然后再实现它的逆运算,将短地址还能换算回长地址。
 
这个回答看起来挺完美的,然后候选人也会说现在时间比较短,如果给我时间我去找这个算法就解决问题了。但是稍微有点计算机或者信息论常识的人就能发现,这个算法就跟永动机一样,是永远不可能找到的。即使我们定义短地址是100位。那么它的变化是62的100次方。62=10数字+26大写字母+26小写字母。无论这个数多么大,他也不可能大过世界上可能存在的长地址。所以实现一一对应,本身就是不可能的。
 
再换一个说法来反驳,如果真有这么一个算法和逆运算,那么基本上现在的压缩软件都可以歇菜了,而世界上所有的信息,都可以压缩到100个字符。这~可能吗。
短 URL 系统是怎么设计的?
短 URL 系统是怎么设计的?
 
另一个很烂的回答
和上面一样,也找一个算法,把长地址转成短地址,但是不存在逆运算。我们需要把短对长的关系存到DB中,在通过短查长时,需要查DB。
 
怎么说呢,没有改变本质,如果真有这么一个算法,那必然是会出现碰撞的,也就是多个长地址转成了同一个短地址。因为我们无法预知会输入什么样的长地址到这个系统中,所以不可能实现这样一个绝对不碰撞的hash函数。
 
比较烂的回答
那我们用一个hash算法,我承认它会碰撞,碰撞后我再在后面加1,2,3不就行了。
 
ok,这样的话,当通过这个hash算法算出来之后,可能我们会需要做btree式的大于小于或者like查找到能知道现在应该在后面加1,2,或3,这个也可能由于输入的长地址集的不确定性。导致生成短地址时间的不确定性。同样烂的回答还有随机生成一个短地址,去查找是否用过,用过就再随机,如此往复,直到随机到一个没用过的短地址。
 
正确的原理
上面是几种典型的错误回答,下面咱们直接说正确的原理。
 
正确的原理就是通过发号策略,给每一个过来的长地址,发一个号即可,小型系统直接用mysql的自增索引就搞定了。如果是大型应用,可以考虑各种分布式key-value系统做发号器。不停的自增就行了。第一个使用这个服务的人得到的短地址是 http://xx.xx/0 第二个是 http://xx.xx/1 第11个是 http://xx.xx/a 第依次往后,相当于实现了一个62进制的自增字段即可。
 
几个子问题
1. 62进制如何用数据库或者KV存储来做?
其实我们并不需要在存储中用62进制,用10进制就好了。比如第10000个长地址,我们给它的短地址对应的编号是9999,我们通过存储自增拿到9999后,再做一个10进制到62进制的转换,转成62进制数即可。这个10~62进制转换,你完全都可以自己实现。
 
2. 如何保证同一个长地址,每次转出来都是一样的短地址
上面的发号原理中,是不判断长地址是否已经转过的。也就是说用拿着百度首页地址来转,我给一个http://xx.xx/abc 过一段时间你再来转,我还会给你一个 http://xx.xx/xyz。这看起来挺不好的,但是不好在哪里呢?不好在不是一一对应,而一长对多短。这与我们完美主义的基因不符合,那么除此以外还有什么不对的地方?
 
有人说它浪费空间,这是对的。同一个长地址,产生多条短地址记录,这明显是浪费空间的。那么我们如何避免空间浪费,有人非常迅速的回答我,建立一个长对短的KV存储即可。嗯,听起来有理,但是。。。这个KV存储本身就是浪费大量空间。所以我们是在用空间换空间,而且貌似是在用大空间换小空间。真的划算吗?这个问题要考虑一下。当然,也不是没有办法解决,我们做不到真正的一一对应,那么打个折扣是不是可以搞定?
 
这个问题的答案太多种,各有各招。这个方案最简单的是建立一个长对短的hashtable,这样相当于用空间来换空间,同时换取一个设计上的优雅(真正的一对一)。实际情况是有很多性价比高的打折方案可以用,这个方案设计因人而异了。那我就说一下我的方案吧。
 
我的方案是:用key-value存储,保存“最近”生成的长对短的一个对应关系。注意是“最近”,也就是说,我并不保存全量的长对短的关系,而只保存最近的。比如采用一小时过期的机制来实现LRU淘汰。
 
这样的话,长转短的流程变成这样:
 
在这个“最近”表中查看一下,看长地址有没有对应的短地址
有就直接返回,并且将这个key-value对的过期时间再延长成一小时
如果没有,就通过发号器生成一个短地址,并且将这个“最近”表中,过期时间为1小时
所以当一个地址被频繁使用,那么它会一直在这个key-value表中,总能返回当初生成那个短地址,不会出现重复的问题。如果它使用并不频繁,那么长对短的key会过期,LRU机制自动就会淘汰掉它。
 
当然,这不能保证100%的同一个长地址一定能转出同一个短地址,比如你拿一个生僻的url,每间隔1小时来转一次,你会得到不同的短地址。但是这真的有关系吗?
 
3. 如何保证发号器的大并发高可用
上面设计看起来有一个单点,那就是发号器。如果做成分布式的,那么多节点要保持同步加1,多点同时写入,这个嘛,以CAP理论看,是不可能真正做到的。其实这个问题的解决非常简单,我们可以退一步考虑,我们是否可以实现两个发号器,一个发单号,一个发双号,这样就变单点为多点了?依次类推,我们可以实现1000个逻辑发号器,分别发尾号为0到999的号。每发一个号,每个发号器加1000,而不是加1。这些发号器独立工作,互不干扰即可。而且在实现上,也可以先是逻辑的,真的压力变大了,再拆分成独立的物理机器单元。1000个节点,估计对人类来说应该够用了。如果你真的还想更多,理论上也是可以的。
 
4. 具体存储如何选择
这个问题就不展开说了,各有各道,主要考察一下对存储的理解。对缓存原理的理解,和对市面上DB、Cache系统可用性,并发能力,一致性等方面的理解。
 
5. 跳转用301还是302
这也是一个有意思的话题。首先当然考察一个候选人对301和302的理解。浏览器缓存机制的理解。然后是考察他的业务经验。301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。同时对服务器压力也会有一定减少。
 
但是如果使用了301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。
 
大概就是这样。
 
 
http://bi.dataguru.cn/article-7077-1.html
分享到:
评论

相关推荐

    .NET短URL压缩算法

    7. **安全性考虑**:短URL系统应防止恶意用户通过猜测或遍历短码来访问未授权的资源。可以通过限制短码尝试次数、设置短码过期时间、使用安全的哈希算法等措施来增强安全性。 8. **可扩展性**:随着业务的增长,短...

    短链接生成系统源码-网址生成系统-短链防红域名系统.zip

    这种系统的核心在于其背后的算法和技术实现,包括URL编码、哈希函数、数据库管理和分布式系统设计等。接下来,我们将详细探讨这些知识点。 1. **URL编码**:在短链接生成过程中,原始的长网址需要被转化为可存储的...

    如何设计一个短链系统?.rar

    短链系统的设计是实现高效、可靠且易于管理的URL缩短服务的关键。本篇文章将深入探讨如何设计这样一个系统。 首先,我们需要理解短链系统的基本工作原理。当用户输入长链URL时,系统会将其映射到一个简短的字符串,...

    Go实现短url项目的方法示例

    实现短URL系统主要需要完成以下功能: 1. **长URL转短URL**:用户提交长URL,系统生成对应的短URL并返回。 2. **短URL转长URL**:用户访问短URL,系统根据短URL找到对应的长URL并进行重定向。 3. **短URL去重**:...

    URL 长连接变短链接的方法

    如果你不想依赖第三方服务,可以自己搭建一个URL短链接系统。这个系统通常包含两部分:URL存储和短码生成。URL存储用于保存原始长链接和对应的短码;短码生成则负责创建独一无二的短码,可以使用哈希函数(如MD5或...

    2021全新PHP短网址生成系统短链接生成系统URL缩短器系统源码站长亲测.rar

    5. **可扩展性**:考虑到未来可能的增长,系统设计应考虑负载均衡、缓存策略以及API接口的扩展性。 6. **性能优化**:通过缓存、数据库索引等方式提升系统处理短链接请求的速度。 7. **统计功能**:可以添加统计分析...

    short-url 是基于 webman 的短链接服务系统.zip

    在short-url系统中,PHP用于实现用户接口、短链接生成算法、API接口等功能,确保服务的稳定性和高效性。 三、MySQL数据库 MySQL是世界上最流行的开源关系型数据库管理系统之一。在short-url项目中,MySQL存储了长...

    系统设计面试题精选.pdf

    短网址系统则是另一个常见的系统设计问题,需要考虑到URL的短化、重定向和缓存等问题。信息流和定时任务调度器也是系统设计中常见的问题,需要考虑到数据的实时性和处理能力。 API限速和线程安全的HashMap是系统...

    -短链接管理系统,为企业和个人用户提供便捷的URL压缩和转换服务 系统通过非加密算法将长链接转换-shortrink.zip

    系统通过非加密算法将长链接转换_shortrink.zipC++】项目设计资源_短链接管理系统,为企业和个人用户提供便捷的URL压缩和转换服务。系统通过非加密算法将长链接转换_shortrink.zipC++】项目设计资源 _短链接管理系统...

    最新PHP短网址生成系统源码短链接生成系统源码URL缩短器系统源码.txt

    - **存储结构**:通常情况下,短网址系统会设计一个数据库表来存储长网址与短网址之间的映射关系。 - **字段说明**:常见的字段包括`id`(自增长主键)、`long_url`(原始长网址)、`short_code`(短网址的编码部分)、`...

    PHP短链接系统源码.zip

    1. **URL编码与解码**:系统需要对原始URL进行编码,生成一个唯一的短码,然后在用户访问短链接时解码这个短码以找到原始URL。 2. **数据库存储**:短码和对应的原始URL会被存储在数据库中,以便于后续查询。这通常...

    毕业设计:基于PHP短链接系统.zip

    2. **数据库设计**:系统通常需要一个数据库表来存储长链接和短码的对应关系。表结构可能包括`id`(主键),`original_url`(原始URL),`short_code`(短码)和`timestamp`(创建时间)等字段。 3. **哈希算法**:选择合适...

    短网址工具 ShortURL

    总的来说,ShortURL 是一款实用性极强的短网址生成工具,它通过高效的算法和人性化的界面设计,帮助用户轻松管理和分享网址,提升网络交流的效率和体验。对于个人用户、博主、网络营销人员来说,都是不可或缺的工具...

    系统设计与实践实战视频教程 董飞老师带你全程实战学习系统设计与实践 超经典

    实战演练(短URL设计).mp4 │ ├3.系统设计七剑客(上).mp4 │ ├4.系统设计七剑客(下).mp4 │ ├5.案例分析.mp4 │ ├6.搭建大规模可扩展系统(一).mp4 │ ├7.搭建大规模可扩展系统(二).mp4 │ ├8.搭建大...

    url-shortenerurl 短网址,短链

    通过学习和理解这个开源项目,开发者不仅可以掌握URL短网址服务的实现,还能提升自己的Web开发技能,包括数据库操作、路由设计、前后端交互等。此外,对于想要创建自定义短网址服务的人来说,这是一个很好的起点。总...

    闪灵短链-微信QQ域名防拦截系统 v1.0 build20231202.zip

    这个系统的核心功能是创建短链接,以绕过这些平台的过滤机制,确保信息能够正常传递。以下是对这个系统涉及的知识点的详细解释: 1. **短链接技术**:短链接是一种将长网址转化为较短形式的技术,常用于社交媒体...

    短链接url.cn接口服务端 无需对接第三方

    3. **接口设计**:服务端需要提供API供客户端调用,通常包括生成短链接(POST请求,输入长URL,返回短码)和解析短链接(GET请求,接收短码,返回长URL)。 4. **服务器部署**:软件在服务器上运行,需要配置合适的...

    网易短网址服务系统设计和实现.pdf

    【标题】:“网易短网址服务系统设计和实现.pdf” 这篇文档详细介绍了网易公司设计并实现的短网址服务系统。短网址服务是一种简化网络链接的方法,它将冗长且复杂的URL缩短为简短的、易于记忆的网址,方便用户快速...

    Go-shorturl短链接算法

    本文将深入探讨"Go-shorturl短链接算法"的相关知识点,包括短链接系统的原理、设计模式、Go语言的应用以及如何实现。 首先,短链接的生成主要依赖于哈希函数和编码方式。哈希函数如MD5或SHA-1可以将任意长度的字符...

    代码网asp短地址转向系统[已测]

    系统设计的核心理念是,每个短链接对应一个唯一的长网址,用户通过短链接访问时,系统会自动将其转向到对应的长网址。此系统确保每个URL地址只能提交一次,避免了重复提交导致的混乱。 二、主要组件解析 1. **URL....

Global site tag (gtag.js) - Google Analytics