java 實現 生成短鏈接服務

java實現短鏈接轉換服務

在這裏插入圖片描述
類似上圖這種短信,對應的就是一個短鏈接。
看到原理也不難,於是先寫個最簡易版的玩玩,以後有需求了再補充吧

下面是一個簡易版的短鏈接生成代碼

搭個spring-boot服務,複製這兩個controller,就能看到效果。


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Random;

/**
 * @Description: 發號器隨機生成
 */
@RestController
@RequestMapping("/shortUrl")
public class ShortUrlController {

    private String BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // 短鏈url域名前綴
    private String shortUrlPrefix = "http://a.cn/";
    private HashMap<String, String> map = new HashMap<>();

    @RequestMapping("getShortUrl")
    public String getShortUrl(String longUrl) {
        String key = creatKey();
        while (map.containsKey(key)) {
            key = creatKey();
        }
        map.put(key, longUrl);
        return shortUrlPrefix + key;
    }

    @RequestMapping("getLongUrl")
    public String getLongUrl(String shortUrl) {
        return map.get(shortUrl.replace(shortUrlPrefix, ""));
    }

    private String creatKey() {
        Random rand = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            sb.append(BASE62.charAt(rand.nextInt(62)));
        }
        return sb.toString();
    }
}

import com.zs.qunfx.util.Base62Util;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;

/**
 * @Description: 發號器自增生成
 */
@RestController
@RequestMapping("/shortUrl2")
public class ShortUrl2Controller {

    // 短鏈url域名前綴
    private String shortUrlPrefix = "http://a.cn/";
    private HashMap<String, String> map = new HashMap<>();
    private Long num = 1000000L;

    @RequestMapping("getShortUrl")
    public String getShortUrl(String longUrl) {
        String key = creatKey();
        map.put(key, longUrl);
        return shortUrlPrefix + key;
    }

    @RequestMapping("getLongUrl")
    public String getLongUrl(String shortUrl) {
        return map.get(shortUrl.replace(shortUrlPrefix, ""));
    }

    private String creatKey() {
        String base62 = Base62Util.base62Encode(num);
        num++;
        return base62;
    }
}

在這裏插入圖片描述
在這裏插入圖片描述

最後

現在常用的還是第二種,用自增的發號器生成對應的短鏈接。
生產環境要用,可以用數據庫的自增id來發號,或者分佈式下生成id用類似雪花算法來發號。
同時,避免原始鏈接重複,可做重複判斷,可用布隆過濾器或redis
長鏈接和短鏈接的對應關係,可保存在數據庫,也可保存在類似redis中,順帶還可以設置過期時間。

也有開源的生成短鏈接的,比如yourls,PHP實現,安裝只需要裝PHP和mysql即可。

或者也可以直接購買短鏈接服務,比如百度的短鏈接服務,亞馬遜的短鏈接服務等,按需付費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章