プロジェクトは 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 Config
  redis:
    url: 127.0.0.1
    port: 6379
    password: your_password
logging:
  level:
    io.github.y0ngb1n.*: debug
コアコード#
/**
 * URL Shortener Resource
 *
 * @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 Retrieved: {}", 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 generated: {}", id);
+     redisTemplate.opsForValue().set(id, url);
      return id;
    }
    throw new RuntimeException("URL Invalid: " + url);
  }
}
使用方法#
ステップ 0:Redis のインストールと起動
# Windowsの場合
scoop install redis
redis-server
# Macの場合
brew install redis
redis-server
ステップ 1:url-shortenerサービスの起動
$ mvn install
...
[INFO] BUILD SUCCESS
...
$ mvn spring-boot:run
...
2019-08-21 21:03:50.215  INFO 10244 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-08-21 21:03:50.219  INFO 10244 --- [ main] i.g.y.s.u.UrlShortenerApplication        : Started UrlShortenerApplication in 6.01 seconds (JVM running for 12.165)
ステップ 2:短縮 URL の生成
$ curl -X POST http://127.0.0.1:8080/v1 \
  -H 'Content-Type: text/plain' \
  -d https://y0ngb1n.github.io
515bbe2b
ステップ 3:短縮 URL の復元
$ 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 generated: 515bbe2b
2019-08-21 21:42:40.748 DEBUG 10244 --- [nio-8080-exec-3] i.g.y.s.u.c.UrlShortenerController       : URL Retrieved: 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の重複、スペルチェック、キーバリューキャッシュシステムのキーバリデーション、IDバリデーション(例:注文システムで特定の注文IDが存在するかどうかをクエリし、存在しない場合は直接返す)
 
- アプリケーションシナリオ:
- 谈谈全局唯一 ID 生成方法
- Leaf — 美团点评分布式 ID 生成系统