设计要点
- 唯一对应
- 持久化
- 高性能
- 高可用
设计分析
唯一对应:一般通过6位的数字+大小写字母来组成,这样可以有62^6个配额,短链接的取值可能一样,但是服务器部署域名一定不一样,所以请求到服务器获取的映射关系也不一样。http://t.cn/RtFFvic中,有可能A、B两家公司分配的映射key值都是RtFFvic,但是A公司a.cn,B公司是b.cn,所以不会造成冲突。
持久化:mysql
高性能:缓存+分布式
高可用:集群+多机房部署
设计
class ShortLinkGenerator{
private AtomicInteger currentId = new AtomicInteger(0);
private ConrrentHashMap<Integer, String> map = new ConrrentHashMap();
public void addLink(String link){
map.put(currentId.getAndIncrement(), link);
}
public void getLink(String link){
map.put(currentId.getAndIncrement(), link);
}
}
处理流程
- 用户访问短链接:http://t.cn/RtFFvic
- 短链接服务器t.cn收到请求,根据URL路径RtFFvic获取到原始的长链接:http://blog.csdn.net/poem_qianmo/article/details/52344732
- 服务器返回302状态码,将响应头中的Location设置为:http://blog.csdn.net/poem_qianmo/article/details/52344732
- 浏览器重新向http://blog.csdn.net/poem_qianmo/article/details/52344732发送请求
- 返回响应