# shorturl **Repository Path**: dq07/shorturl ## Basic Information - **Project Name**: shorturl - **Description**: URL Shortener - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 短网址服务 ## 什么是短网址服务 就是把一个长网址转化为一个较短的网址,访问短网址时自动重定向到原长网址,便于分享链接、简化二维码复杂程度、方便统计等。 例: 原网址: ``` https://www.baidu.com/s?wd=%E7%89%B9%E6%9C%97%E6%99%AE%E5%86%8D%E6%AC%A1%E5%8F%91%E6%8E%A8%3A%E6%98%AF%E6%88%91%E8%B5%A2%E4%BA%86%E5%A4%A7%E9%80%89&rsv_idx=2&tn=baiduhome_pg&usm=1&ie=utf-8&rsv_cq=%E7%9F%AD%E7%BD%91%E5%9D%80&rsv_dl=0_right_fyb_pchot_20811_01&rsf=8a10982a0c4d04e47e937cca23acb3ca_1_15_1&rqid=e99b10f600083b76 ``` 短网址: ``` https://0x9.me/9C5gl ``` ## 原理 1. 将原网址与短网址的对应关系保存到数据库中 2. 访问短网址时重定向到原网址 ## 几个关键点 1. 短网址一般是由[0-9][a-z][A-Z]这62个字符组成的。 2. 一个短网址只能对应一个长网址,即生成的短网址不能重复。 3. 可以从小到大生成数字,再将数字通过62进制转化为[0-9][a-z][A-Z]的字符串。 4. 可以使用数据库自增主键或redis的incr命令保证生成数字的唯一性。 5. 自增数字转化为字符串是连续的,没有随机性。可以事先将打乱顺序的短网址字符串存到redis列表集合中,使用时利用`lpop`或`rpop`命令弹出一个字符串即可。 ## 62进制 62进制就是满62时进位。 | 十进制 | 62进制 | | ------ | ------ | | 0 | 0 | | 1 | 1 | | 9 | 9 | | 10 | a | | 11 | b | | 25 | p | | 61 | Z | | 62 | 10 | | 63 | 11 | ### 10进制转62进制 除以62取余数,商再除以62取余数,直到商为0. ### 62进制转10进制 Σi×62^(n-1) ## redis短链接池大小估算 注:为方便计算与开发,1位链接`0`统计在内。 | 短链接长度 | 起止字符串 | 链接个数 | 总链接个数 | 占用空间 | 总占用空间 | | :--------: | :-----------: | -------------: | -------------: | -------: | ---------: | | 1 | 1~Z | 61 | 61 | 61B | 61B | | 2 | 10~ZZ | 3,782 | 3,843 | 7.39KB | 7.45KB | | 3 | 100~ZZZ | 234,484 | 238,327 | 686.96KB | 694.41KB | | 4 | 1000~ZZZZ | 14,538,008 | 14,776,335 | 55.46MB | 56.14MB | | 5 | 10000~ZZZZZ | 901,356,496 | 916,132,831 | 4.20GB | 4.25GB | | 6 | 100000~ZZZZZZ | 55,884,102,752 | 56,800,235,583 | 312.28GB | 316.53GB |