利用 Spring Boot & Redis 實(shí)現(xiàn)短鏈接服務(wù)

感謝您的閱讀艘包,本文由 楊斌的博客 版權(quán)所有。
如若轉(zhuǎn)載,請(qǐng)注明出處:楊斌的博客(https://y0ngb1n.github.io/a/build-a-custom-url-shortener-service.html?utm_source=jianshu

項(xiàng)目已托管于 GitHub:y0ngb1n/spring-boot-samples,歡迎 Star, Fork :kissing_heart:


準(zhǔn)備工作

  • Spring Boot 2.1.0+
  • Redis
  • Lombok
  • Guava 28.0
  • Common Validator 1.6

添加依賴項(xiàng)

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);
  }
}

使用方式

Step 0: 安裝并啟動(dòng) Redis

# on Windows
scoop install redis
redis-server

# on Mac
brew install redis
redis-server

Step 1: 啟動(dòng) url-shortener 服務(wù)

$ 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)

Step 2: 生成短鏈

$ curl -X POST http://127.0.0.1:8080/v1 \
  -H 'Content-Type: text/plain' \
  -d https://y0ngb1n.github.io
515bbe2b

Step 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 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

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子埠胖,更是在濱河造成了極大的恐慌糠溜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件直撤,死亡現(xiàn)場(chǎng)離奇詭異非竿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谋竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門红柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蓖乘,你說(shuō)我怎么就攤上這事锤悄。” “怎么了嘉抒?”我有些...
    開(kāi)封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵零聚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我些侍,道長(zhǎng)隶症,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任岗宣,我火速辦了婚禮蚂会,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耗式。我一直安慰自己胁住,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布纽什。 她就那樣靜靜地躺著措嵌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芦缰。 梳的紋絲不亂的頭發(fā)上企巢,一...
    開(kāi)封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音让蕾,去河邊找鬼浪规。 笑死,一個(gè)胖子當(dāng)著我的面吹牛探孝,可吹牛的內(nèi)容都是我干的笋婿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顿颅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缸濒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庇配,失蹤者是張志新(化名)和其女友劉穎斩跌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捞慌,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耀鸦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啸澡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖订。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嗅虏,靈堂內(nèi)的尸體忽然破棺而出洛姑,到底是詐尸還是另有隱情,我是刑警寧澤旋恼,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布吏口,位于F島的核電站,受9級(jí)特大地震影響冰更,放射性物質(zhì)發(fā)生泄漏产徊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一蜀细、第九天 我趴在偏房一處隱蔽的房頂上張望舟铜。 院中可真熱鬧,春花似錦奠衔、人聲如沸谆刨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痊夭。三九已至,卻和暖如春脏里,著一層夾襖步出監(jiān)牢的瞬間她我,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工迫横, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留番舆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓矾踱,卻偏偏與公主長(zhǎng)得像恨狈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呛讲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容