长链变短链
- 获取合适的短链接域名
在集团or公司内部项目中,公共的短链服务需要满足不同项目不同短链域名的需求。上图中可以设置根据要求的短链域名or根据长链匹配
- 获取短链接KEY
短链KEY需要保证全局唯一,采用雪花算法发号器获取。
雪花算法可根据机房编号、机器编号、时间位等设置控制KEY的长短,会随着时间慢慢变长。
雪花算法可自行搜索,如果有需要可私信。
短链变长链
- 短链变长链
涉及到的问题
-
问题1
问: 短链KEY ? 答: 使用雪花算法发号器生成唯一的62进制的短链(具体可以根据机房机器编码、开始时间、各部分设置占位数等设置 ) 如果不止一台服务器,可以配置机器数据字典, 根据不同的ip地址设置不同的机房机器编码.
-
问题2
问: 怎么保证尽量保证同长链尽量返回同一短链 ? 答: 长链-短链,短链-长链 对应都在redis存储,并设置时长为一定值. 如果使用量很大的话,可以设置redis缓存为一周,长变短访问redis失败->不查mysql默认重新发号,生成新的短链 现在我们的主要是内部用户,使用量不大. 设置的是redis缓存30天->->查mysql->重新发号 尽量保证短长链一一对应 短链->长链: 查redis -> 查mysql. 可以适当将短长链缓存过期时间设置长点,同时做好恶意 访问限制->可以通过统计访问者的IP等,限制短时间内大量访问不存在的短链接造成的缓存穿透.
-
问题3
问: 怎么兼容用户传参&请求访问协议 [长链接中带中文 短链支持带参数] ? 答: 长链带中文: 在长链变短链时,url需要urlEncode编码,防止中文及特殊字符错误 短链带参数: 截取参数,拼接在获取的长链接后. 判断原长链是否有参数的判断依据: 特殊字符 “? &” 各短链域名互通[同环境下]: 只区分短链KEY 如: d.xxx.com/12345 =等价= d.yyy.com/12345
-
问题4
问: 短链变长链跳转的方式 ? 301 和 302的选择和优缺点? 答: 我们的设计方案选择的是 response.sendRedirect 状态是默认的302 301: 永久重定向 有缓存(短链服务器压力小) 抓取的地址会替换成新的 对SEO友好 302: 临时重定向 无缓存(短链服务器压力大) 抓取的地址还是原来的 容易URL劫持 对SEO基本无效(不利用网站排名) 我们选择302主要是因为: 1. 便于统计: 此种方式便于统计短链请求来源信息,如点击量等. 2. 利于监管: 删除了短链记录即可限制访问,不会出现301长链被客户端缓存了,访问不存在的短链会直接访问长链
-
问题5
问: 怎么配置域名访问 ? 答: 一般在公司的二级域名下,再申请一个三级域名,尽量短一点,比如 l.baidu.com、 d.baidu.com、t.baidu.com。域名配置好对应映射的ip信息。 如果是多个短链域名,可以配置负载均衡(域名映射的IP就是此负载的公网IP),负载再指向 对应的后端服务器,后端服务器运行多个服务时,需配置Nginx
-
问题6
问: 项目部署 ? 答: 获取短链,如果是提供内部其他项目使用,可以作为服务提供,如dubbo注册后提供,更高效; 如果是对外提供的获取短链服务,可以做好不同有效期、IP次数等限制。