长链接转短链接 面试官:如何实现一个短链接服务? 面试官:如何设计一个高性能短链系统?

存在用途❓

  • 缩短原链接长度,便于营销推广
    • 微博限长140
    • 短信限长
    • 二维码密集度,辨识度
    • 钉钉无法识别超链接
  • 数据统计,在重定向的过程中进行PV、UV等数据统计
  • 屏蔽原链接域名

在线工具: http://tool.chacuo.net/commonrestoreuri (表格的方式展示详细跳转过程)
例子1:

次数 地址 连接IP
1 http://t.cn/h5mwx
2 http://www.baidu.com www.baidu.com (110.242.68.4)
3 https://www.baidu.com/ www.baidu.com (110.242.68.3)

例子2:

  1. http://3.cn/1j5-o0sy
  2. 302 Location: https://3.cn/1j5-o0sy
  3. 302 Location: http://answer.jd.com/jump/?shortCode=XucwCdftKbS&surveyId=1814703&source=sms
  4. 302 Location: https://answer.jd.com/jump/?shortCode=XucwCdftKbS&surveyId=1814703&source=sms

截屏2021-08-31 下午5.52.39.png

301 VS 302

  • 301 永久重定向
  • 302 临时重定向

同一长链接, 每次转成短链接是否一样 ❓

原理

短链接请求后,返回了状态码 302(重定向)与 location 值为长链的响应,然后浏览器会再请求这个长链以得到最终的响应
image.png
截屏2021-08-31 下午8.00.45.png

短链接组成

短码一般是由 [a - z, A - Z, 0 - 9] 这62 个字母或数字组成,短码的长度也可以自定义,但一般不超过8位。比较常用的都是6位,6位的短码已经能有568亿种的组合:(26+26+10)^6 = 56800235584,已满足绝大多数的使用场景。
目前比较流行的生成短码方法有:自增id、摘要算法、普通随机数。

算法

1、自增序列算法

如何应对高并发?
获取id的方法:

  • 类uuid
  • redis自增
  • snowflake (分布式自增主键id, 雪花算法, 存在id浪费)
  • mysql自增主键

    2、哈希

    固定短链域名 + 哈希值
    推荐 Google 出品的 MurmurHash 算法。
    MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。与其它流行的哈希函数相比,对于规律性较强的 key,MurmurHash 的随机分布特征表现更良好。
    缩短域名:十进制哈希值 -> 62进制
    哈希冲突: 布隆过滤器来进行优化

如何储存❓

如何缓存❓

如何实现一个短链接服务

如何实现高性能

好口碑短链服务

涉及指标:有无流量统计(用户画像)、有无API、能否自定义path
高级指标:多域名(防止被封)、安全加密、点对点式短网址群组(分组、筛选、二次营销)
https://bitly.com/
https://sina.lt/ 新浪

参考:

https://cloud.tencent.com/developer/article/1762482
https://juejin.cn/post/6844904017210900487