# tinyurl-convertor
**Repository Path**: null_912_0365/tinyurl-convertor
## Basic Information
- **Project Name**: tinyurl-convertor
- **Description**: tinyurl-convertor.git
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-11-17
- **Last Updated**: 2021-11-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# tinyurl-converter
该项目主要实现长域名转换短域名,核心接口有
* 长域名转换成短域名接口
* 通过短域名获取长域名
本项目主要是单机运行,不是实际运行在生产环境中,为了减少中间件的引入,长域名短域名映射主要存储在内存中。
## 短域名核心设计
- 采用生成自增ID,转换成62进制生成短域名的方式处理。
- 只要ID不超过 281474976710656 即62的8次方,就可以保证位数在8位
- 不考虑多机环境或分布式环境
- 分布式环境映射不能存在本机内存,如果分布式环境,需要一个全局自增ID,可以全局发号或数据库自增-非分库分表
- 真实线上环境应该将tinyUrl映射关系存储到DB或NoSQL中
- guava 缓存存储长域名和短域名的映射关系,为了控制内存溢出,设置缓存大小,采用concurrentHashMap存储倒排-为了取短域名换长域名
```
@Override
public String generatorTinyUrl(String longUrl) {
TinyUrl tinyUrl = null;
try {
tinyUrl = cahced.get(longUrl, () -> {
long id = idGenerator.incrId();
String shortUrl = Base62.toBase62(id);
TinyUrl tinyUrl1 = new TinyUrl(id, shortUrl, longUrl);
shortUrlMap.put(shortUrl, tinyUrl1);
return tinyUrl1;
});
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
return tinyUrl.getTinyUrl();
}
@Override
public String getLongUrl(String shortUrl) {
TinyUrl tinyUrl = shortUrlMap.get(shortUrl);
if (null == tinyUrl) {
return null;
}
return tinyUrl.getLongUrl();
}
```
## 压测方案
- 采用apache ab进行简单压测
- ab -n 100 -c100 http://localhost:8080/api/tinyUrl/getLongUrl?shortUrl=aaa
- jmeter编写脚本压测