# 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编写脚本压测