假设
https://www.systeminterview.com/q=chatsystem&c=loggedin&v=v3&l=long
是原 URL, 你的服务应该可以创建一个更短的 URL (短链接) :
https://tinyurl.com/y7keocwj, 将其作为原 URL 的别名。
如果点击这个短链接,它就可以把你重新导向至原URL。
API 端点有利于客户端和服务器之间的通信,把API设计成REST风格。一个URL缩短器主要需要两个API端点:
POST api/v1/data/shorten 请求参数
{longUrl: longURLString} 返回短URLGET api/v1/shortURL 返回长URL以进行HTTP重定向当在浏览器输入经过缩短的TinyURL网址时,服务器收到一个TinyURL请求,会通过301重定向把短URL换成长URL。
301重定向和302重定向区别:
假设短URL的格式为 www.tinyurl.com/{hashValue}
这个哈希函数必须满足下面的要求:
高层级设计中,所有数据都被存储在哈希表中,但是现实世界内存资源是有限且昂贵的,因此方法不可行。
可以选择关系型数据库中存储
<shortURL, longURL>,例如简化版的表包含3列:
id、shortURL、longURL。
哈希函数用于将长URL哈希成短URL,这个短URL也叫做哈希值。
哈希值的长度:由数字字母,10+26+26=62 种可能的字符,
需要实现一个哈希函数将长URL哈希成7个字符的字符串,最直接的解决方法是使用那些有名的哈希函数,如 CRC32、MD5、SHA-1等。
但是哈希值都太长了。
第一个办法是取哈希值的前7个字符,但这个方法会导致哈希冲突。为了解决哈希冲突,可以 递归地添加一个新的预先设定好的字符串,直到不再发现冲突为止。
可以消除哈希冲突,但对每个请求都要查询数据库检查是否已经存在,成本很高。
布隆过滤器可以提升性能,是一种高效利用空间的概率性技术,可以用来检测一个元素 是否属于某个集合。
例如吧 十进制数字 11157 转换为 Base62 的表示:
0->0...9->9 10->a...35->z 36->A 61->Zhttps://tinyurl.com/2TX
URL 缩短流程应该是逻辑简单的,而且能提供我们想要的功能:
URL 重定向的详细设计,因为读操作远多于写操作,所以
<shortURL, longURL>
映射关系被存储在缓存中以提高性能
URL 重定向流程总结:
https://tinyurl.com/zn9edcu