长链接转短链接 面试官:如何实现一个短链接服务? 面试官:如何设计一个高性能短链系统?
存在用途❓
- 缩短原链接长度,便于营销推广
- 微博限长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:
http://3.cn/1j5-o0sy
302 Location: https://3.cn/1j5-o0sy
302 Location: http://answer.jd.com/jump/?shortCode=XucwCdftKbS&surveyId=1814703&source=sms
302 Location: https://answer.jd.com/jump/?shortCode=XucwCdftKbS&surveyId=1814703&source=sms
301 VS 302
- 301 永久重定向
- 302 临时重定向
同一长链接, 每次转成短链接是否一样 ❓
原理
短链接请求后,返回了状态码 302(重定向)与 location 值为长链的响应,然后浏览器会再请求这个长链以得到最终的响应
短链接组成
短码一般是由 [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