Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >1. 如何设计一个短链接系统

1. 如何设计一个短链接系统

作者头像
用户7798898
发布于 2020-09-27 08:52:33
发布于 2020-09-27 08:52:33
2.2K0
举报

接下啦, 打算研究一下短链接

1. 如何设计短链接系统

2. 短链接系统的盈利模式

3. 设计方案

今天开始第一部分: 如何设计短链接系统

1. 短链接有什么好处?

  a. 微博推文, 每次限制只能有140个字,如果连接字符很多, 那么可编辑的文字就少了

  b. 公司推广短信, 本来一条短信就可以搞定, 但是由于短信连接过长, 导致要发两条甚至3条. 假设1条短信1分钱, 3条就是3分钱, 假设有一百万用户, 发300万条短信,就是30000块钱, 你可以节省2w块.

2. 短链接跳转的基本原理

  客户端-->发出短链接请求--> 302跳转到--->长连接

  这里说一下status code. 301和302的区别

    • 301: 代表永久重定向. 也就是第一次拿到请求重定向以后, 下次浏览器再次请求短链接的时候, 不会真正的请求短链接服务器, 而是从浏览器本地的缓存拿到长链接. 这样一来, 通过浏览器本地缓存可以减少服务器的压力, 但是也会带来新的问题, 我们如果想要统计这个入口链接可以带来多少的连接量. 使用301返回, 在server层就无法统计访问量. 所以一般不使用301
    • 302: 代表临时重定向, 每次断连请求都会请求锻炼服务器, 除非在响应头标识了cache control expire ,这样浏览器才会缓存, 这样便于server统计点击数.虽然使用302给短链服务器增加一些压力, 但是数据异常重要的今天, 这点资源还是值得的. 所以,推荐使用302

3. 短链接生成的几种方案

比如这个短链接: http://n0i.cn/4dK5h

它是由域名http://n0i.cn/ 加上一串火星字符4dK5h构成

域名是固定的

火星字符是如何构成的呢?

我们可以使用hash生成, 可以是MD5, SHA. 这里, 我们不关心加密解密的难度. 我们更关心的是

1. 运算速度

2. 冲突概率

这里推荐google的hash算法, marmurhash. marmurhash算法是非加密hash函数. 适用于一般的hash检索操作. 与其他流行的hash函数相比, 对于规律性较强的key, marmurhash的随机分布特征表现更好. 非加密表示marmurhash比md5, sha这样的函数有更高的性能.

hash冲突了怎么办?

虽然marmurhash发生冲突的概率很低, 但还是要考虑, 一旦发生冲突, 怎么办?如何规避调.

短链接和长连接有一个对应关系, 保存这种对应关系有很多方案. 可以放在redis或者mysql. 如果放在mysql,我们的表结构应该是这样的.

id

自增id

surl

短链接url

lurl

长链接url

gmt_create

时间

1. 长链接经过marmurhash算法, 得到短链接

2. 我们根据短链接去db中查询,是否存在这样的记录

3. 如果不存在, 就进行存储, 如果存在,说明已经有相关的记录了. 取出长串, 在加上一个固定的字符串,比如bywind. 进行marmurhash, 获得短链接地址

marmurhash(lurl + bywind)

4. 在对整个字符串进行第一步的操作. 如果这个字符串还是重复, 那就在拼接一个字符串.

5. 我们在最终获取长连接的时候, 把追加的字符串移除, 就得到原本的长连接了

以上操作, 一个操作需要两次查询, 如果出现高并发的情况, 是很容易产生性能瓶颈的. 如何优化呢?

1. 给短链接surl增加一个唯一性索引. 当长链接经过marmurhash得到短链接以后, 我们拿到长链接的映射, 去db里做检索, 如果没有找到就插入, 如果找到了, 就说明违反了唯一性索引. 这是在增加一个bywind字符串, 再次进行marmurhash处理, 然后保存到db.

增加唯一索引, 看上去效率有些低, 但marmurhash发生重复的概率是很低的 所以这种情况是可以接受的.

如果在高并发的情况下, 我们可以使用布隆过滤器来进行优化

长连接经过hash生成短链接, 然后在布隆过滤器中校验, 如果不存在,则保存到数据库, 如果存在, 加上bywind常量字符串, 再次校验. 直到不存在, 保存到数据库.

2. 使用自增序列的方式生成短链接 -- mysql自增主键

优点: 简单, 扩展方便

问题: 在高并发情况下, DB的写压力会过大, 这个时候怎么办呢? 如何优化?

这个时候, 我们可以设置一个专门的发号表. 每插入一条记录为短链id预留(主键id+1000-999) 到 (主键id*1000)的号段.

当长链接转短链接的请求, 达到某台服务器上的时候, 先看这台服务器上是否分配了短链接号段. 如果没有, 就往发号表里插入一条记录, 则这台机为短链分配的范围是start -- end. 如果当前分配的id>end, 说明这个区间段的id分配完了, 再往发号表里增加1条记录

3. 如何防止多次相同的长连接生成不同的短链接. 这样就要每次根据长链接查询db, 看是否有相关的记录, 一般做法是长链接加索引, 这样索引的空间会很多, 这时我们可以对长链接进行适当的压缩, 比如:md5. 在对长链接的md5加索引, 这样索引就会变得很小. 这样只需要根据常量的MD5去数据库里查重就可以了.

4. 数据量比较巨大的话, 后期还可以考虑分库分表.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高性能短链设计
今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合考察侯选人的一道设计题,本文将会结合我们生产上稳定运行两年之久的高性能短链系统给大家简单介绍下设计这套系统所涉及的一些思路,希望对大家能有一些帮助。
范蠡
2020/03/18
3.1K0
字节二面:100Wqps短链系统,如何设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?
码猿技术专栏
2023/05/01
4.5K1
字节二面:100Wqps短链系统,如何设计?
字节三面:如何设计一个高性能短链系统?
所谓系统设计,就是给一个场景,让你给出对应的架构设计,需要考虑哪些问题,采用什么方案解决。很多面试官喜欢出这么一道题来考验你的知识广度和逻辑思考能力。
飞天小牛肉
2023/09/19
3.8K0
字节三面:如何设计一个高性能短链系统?
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
8600
如何设计一个短链接系统
短网址(short URL)系统的原理及其实现
作者: 小猿大圣 https://segmentfault.com/a/1190000012088345 背景 提供一个短址服务。 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?
前端教程
2018/03/05
5.3K0
短网址(short URL)系统的原理及其实现
如何实现一个短链接服务 | 短链接生成原理
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
梦溪
2021/08/09
19.4K3
短链接系统如何设计
今天给大家带来的文章是:《短链接系统如何设计》。在开始之前,先让我们熟悉一下什么是长链接:
shigen
2023/10/14
3900
短链接系统如何设计
「System Design」设计一个短链接系统
短链接系统可以把比较长的 URL 网址转换成简短的网址字符串,短链接的优势是方便传播。适合在一些对字符串长度有要求的场景中使用,比如短信,微博等,比如
全球技术精选
2022/09/05
4360
「System Design」设计一个短链接系统
面试官:如何实现一个短链接服务?
原文链接:https://javadoop.com/post/url-shortener
cxuan
2020/12/17
2.9K0
面试官:如何实现一个短链接服务?
短链接的设计与实现
短链接的实现在生活中比较常见,比如我们接受到的广告短信,短信会包含他们的活动链接。
梁规晓
2020/11/05
2.1K0
短链接的设计与实现
短链接的实现
生活中,经常会在手机短信的广告中出现,因为短信服务本身对短信的长度有限制,如果使用一个非常长的链接,几百字符很快就能用完,关键信息的字符数被挤压,影响了服务方的广告价值同时也影响了消费者的观感,通过短链可以解决这个问题。
时光潜流
2023/10/22
5760
短链接的实现
东半球最接地气的短链接系统设计
今天下午,烟哥和同事在厕所里排队等坑的时候(人多坑少)。想象一下一个场景,我正在一边排队,一边拿着手机撩妹。前面一个同事,拿着手机短信转过头来和我聊天。
Java3y
2019/11/12
6610
东半球最接地气的短链接系统设计
最近学到的「短链接」知识
最近接了一个需求,涉及到了短链接的相关的知识,于是去查阅了相关的资料,在这里给大家整理分享一下。
Java3y
2019/10/15
1.7K0
最近学到的「短链接」知识
【愚公系列】2022年03月 .NET CORE工具案例-短链接服务
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
愚公搬代码
2022/03/04
4260
重发和重定向有什么区别与重定向应用
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
王小明_HIT
2020/09/29
8010
重发和重定向有什么区别与重定向应用
面试官说:你来设计一个短链接生成系统吧
相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计,第二个特点是**链接很短**,比如下面这个:
秦怀杂货店
2021/12/04
6220
短链接原理及其算法实现
短网址在目前来说是一个非常流行的东西,提供短网址服务的网站也是相当多的,短网址在微博上应用的比较广泛 ,因为微博对于url的长度有一个限制,所以将一个很长的网址转换成一个很短的网址,是一个非常棒的想法,其好处有很多,比如字符少,美观,便于发布和传播等。
OECOM
2020/07/01
5.3K0
ByteByteGo学习笔记:URL短链服务设计
在互联网技术日新月异的今天,URL短链服务已经成为日常网络生活中不可或缺的一部分。每当想要分享一个冗长的网页链接,或者需要在对字符数量敏感的平台(如社交媒体、短信等)发布链接时,URL短链服务都能将长长的URL地址精简成短小、易于传播的链接。例如,将冗长的 https://www.systeminterview.com/q=chatsystem&c=loggedin&v=3&i=long 缩短为 https://tinyurl.com/y7keocwj,这不仅提升了用户体验,也方便了链接的分享和管理。
攻城狮笔记
2025/02/13
1590
URL短链接实现方法
最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。
wangxl
2018/02/25
7.6K1
URL短链接实现方法
短链接原理分析
1. 什么是短链接 顾名思义,短链接即是长度较短的网址。通过短链接技术,我们可以将长度较长的链接压缩成较短的链接。并通过跳转的方式,将用户请求由短链接重定向到长链接上去。短链接主要用在诸如微博,BBS
芋道源码
2018/12/18
3.4K0
相关推荐
高性能短链设计
更多 >
LV.1
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档