项目已托管于 GitHub:y0ngb1n/spring-boot-samples,欢迎 Star, Fork 😘
准备工作#
- Spring Boot 2.1.0+
- Redis
- Lombok
- Guava 28.0
- Common Validator 1.6
添加依赖项#
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
</dependencies>
application.yml
spring:
# Redis 配置
redis:
url: 127.0.0.1
port: 6379
password: your_password
logging:
level:
io.github.y0ngb1n.*: debug
核心代码#
/**
* URL 短链接资源
*
* @author yangbin
*/
@Slf4j
@RestController
@RequestMapping(path = "/v1")
public class UrlShortenerController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping(path = "/{id}")
public String getUrl(@PathVariable String id) {
+ String url = redisTemplate.opsForValue().get(id);
log.debug("获取的 URL: {}", url);
return url;
}
@PostMapping
public String create(@RequestBody String url) {
UrlValidator urlValidator = new UrlValidator(
new String[]{"http", "https"}
);
if (urlValidator.isValid(url)) {
- String id = Hashing.murmur3_32().hashString(url, StandardCharsets.UTF_8).toString();
log.debug("生成的 URL Id: {}", id);
+ redisTemplate.opsForValue().set(id, url);
return id;
}
throw new RuntimeException("URL 无效: " + url);
}
}
使用方式#
步骤 0: 安装并启动 Redis
# 在 Windows 上
scoop install redis
redis-server
# 在 Mac 上
brew install redis
redis-server
步骤 1: 启动 url-shortener
服务
$ mvn install
...
[INFO] 构建成功
...
$ mvn spring-boot:run
...
2019-08-21 21:03:50.215 INFO 10244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat 在端口(s): 8080 (http) 上启动,上下文路径为 ''
2019-08-21 21:03:50.219 INFO 10244 --- [ main] i.g.y.s.u.UrlShortenerApplication : UrlShortenerApplication 在 6.01 秒内启动 (JVM 运行了 12.165 秒)
步骤 2: 生成短链
$ curl -X POST http://127.0.0.1:8080/v1 \
-H 'Content-Type: text/plain' \
-d https://y0ngb1n.github.io
515bbe2b
步骤 3: 还原短链
$ curl -X GET http://127.0.0.1:8080/v1/515bbe2b
https://y0ngb1n.github.io
查看日志
...
2019-08-21 21:42:26.788 DEBUG 10244 --- [nio-8080-exec-2] i.g.y.s.u.c.UrlShortenerController : 生成的 URL Id: 515bbe2b
2019-08-21 21:42:40.748 DEBUG 10244 --- [nio-8080-exec-3] i.g.y.s.u.c.UrlShortenerController : 获取的 URL: https://y0ngb1n.github.io
参考资料#
- https://youtu.be/Zr0E2VP24w8
- https://en.wikipedia.org/wiki/MurmurHash
- https://github.com/google/guava/wiki/HashingExplained
- https://www.flyml.net/2016/09/05/cassandra-tutorial-murmurhash/
- 短网址(Short URL)系统的原理及其实现,by 胡方运
- 如何快速判断某 URL 是否在一个 20 亿的网址 URL 集合中?,by 张振伟
- 应用场景:
黑名单
、URL 去重
、单词拼写检查
、Key-Value 缓存系统的 Key 校验
、ID 校验,比如订单系统查询某个订单 ID 是否存在,如果不存在就直接返回
- 应用场景:
- 谈谈全局唯一 ID 生成方法
- Leaf — 美团点评分布式 ID 生成系统