亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

 

本文將簡單介紹,如何去完成一個縮短網址的功能。

Node.js + MySQL + redis版本的源碼地址:github

Demo地址:www.ecool.fun/shortLink

什么是短鏈接

短鏈接,通俗來說,就是將長的URL網址,通過程序計算等方式,轉換為簡短的網址字符串。

大家經常可以從微博或者各類營銷短信中,看到短鏈接,形式一般類似于 t.cn/xxxxxx,點擊后,就能跳轉到對應的頁面。

早期短鏈接廣泛應用于圖片上傳網站,通過縮短網址URL鏈接字數,達到減少代碼字符串的目的。更便于使用者引用網址,寫入代碼中,節省字符數空間。常見于網店圖片分類的使用,因有字符限制,運用短鏈接,達到外鏈圖片的目的,自微博盛行以來,在微博字數有限的特色下,短鏈接也盛行于微博網站,以節省字數,給博主發布更多文字的空間。

將長鏈接轉成短鏈接,一般是為了方便記憶或者傳播。

需要完成的功能

從上面的介紹中,我們得出,縮短網址需要完成以下兩個功能點:

  • 將長網址縮短成短鏈接
  • 點擊生成短鏈接,能正常跳轉到原來的長網址頁面

全流程設計

其實上述功能點的原理很簡單,簡單描述一下:

  • 用戶輸入長網址,服務端接收后進行處理,并根據長網址的內容,生成一個短碼,并將映射關系進行存儲。然后根據短碼拼接出短鏈接,返回給用戶;
  • 用戶點擊短鏈接,服務器端根據短鏈接中的短碼,查找到對應的長網址,并302跳轉到對應的頁面。

知識點:為什么要使用302跳轉,而不是301跳轉呢?

301是永久重定向,302是臨時重定向。短地址一經生成就不會變化,所以用301是符合http語義的。但是如果用了301, google,百度等搜索引擎,搜索的時候會直接展示真實地址,那我們就無法統計到短地址被點擊的次數了,也無法收集用戶的Cookie, User Agent 等信息,這些信息可以用來做很多有意思的大數據分析,也是短網址服務商的主要盈利來源。

引自知乎-武林的回答,原文鏈接

整個流程的設計如下圖所示:

教你怎么實現縮短網址功能

 

可以看到,我用到了MySQL和Redis來存儲長網址和短碼之間的映射關系。

用MySQL想必大家都能理解,但是為什么要用 Redis 呢,直接用數據庫不就好了嗎?

這個主要是考慮到生成短鏈接,在投放之后的訪問量會比較大,使用 Redis 緩存后,能有效降低數據庫的壓力。

生成短碼的方法

通過上面的全流程設計,會發現主要的問題就是如何通過長網址,去生成對應的短碼。

短碼一般是由 [a - z, A - Z, 0 - 9] 這62 個字母或數字組成,短碼的長度也可以自定義,但一般不超過8位。比較常用的都是6位,6位的短碼已經能有568億種的組合:(26+26+10)^6 = 56800235584,已滿足絕大多數的使用場景。

目前比較流行的生成短碼方法有:自增id、摘要算法、普通隨機數。

  • 自增id

該方法是一種無碰撞的方法,原理是,每新增一個短碼,就在上次添加的短碼id基礎上加1,然后將這個10進制的id值,轉化成一個62進制的字符串。

一般利用數據表中的自增id來完成:每次先查詢數據表中的自增id最大值max,那么需要插入的長網址對應自增id值就是 max+1,將max+1轉成62進制即可得到短碼。

但是短碼 id 是從一位長度開始遞增,短碼的長度不固定,不過可以用 id 從指定的數字開始遞增的方式來處理,確保所有的短碼長度都一致。同時,生成的短碼是有序的,可能會有安全的問題,可以將生成的短碼id,結合長網址等其他關鍵字,進行md5運算生成最后的短碼。

10進制轉成62進制的具體實現:

function string10to62(number) {
 const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';
 const charsArr = chars.split('');
 const radix = chars.length;
 let qutient = +number;
 let arr = [];
 do{
 let mod = qutient % radix;
 qutient = (qutient - mod) / radix;
 arr.unshift(charsArr[mod]);
 }while(qutient);
 return arr.join('');
}
復制代碼
  • 摘要算法

摘要算法又稱哈希算法,它表示輸入任意長度的數據,輸出固定長度的數據。相同的輸入數據始終得到相同的輸出,不同的輸入數據盡量得到不同的輸出。

算法思路:

1、將長網址通過 md5 運算,生成 32 字符的 hex string,分為 4 段,每段 8 個字符;

2、對這四段循環處理,取 8 個字節,將其看成 16 進制串,并與 0x3fffffff(30位1) 與操作,即超過 30 位的忽略處理;

3、這 30 位分成 6 段,每 5 位的數字作為字母表的索引取得特定字符,依次進行獲得 6 位字符串。

4、總的 md5 串可以獲得 4 個 6 位串,取里面的任意一個就可作為這個長網址的短鏈接 url 地址。

雖然幾率很小,但是該方法依然存在碰撞的可能性,解決沖突會比較麻煩。不過該方法生成的短碼位數,是固定的,也不存在連續生成的短碼有序的情況。

  • 普通隨機數

該方法是從62個字符串中隨機取出一個6位短碼的組合,然后去數據庫中查詢該短碼是否已存在。如果已存在,就繼續循環該方法重新獲取短碼,否則就直接返回。

該方法是最簡單的一種實現,不過由于Math.round()方法生成的隨機數屬于偽隨機數,碰撞的可能性也不小。在數據比較多的情況下,可能會循環很多次,才能生成一個不沖突的短碼。

具體實現:

// 獲取唯一的Link
async getShortLink() {
 const shortLink = this.generateShortLink();
 // 查詢數據庫中是否存在該鏈接,如果存在,就直接返回
 const searchResult = await this.searchByLinkInMySQL(shortLink);
 if (searchResult && searchResult.length > 0) {
 // 如果shortLink已經存在,就遍歷重新生成
 return this.getShortLink();
 }
 return shortLink;
}
// 生成隨機的Link
generateShortLink() {
 let str = '';
 const arr = [
 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
 ];
 for (let i = 0; i < 6; i++) {
 const pos = Math.round(Math.random() * (arr.length - 1));
 str += arr[pos];
 }
 return str;
}
復制代碼

綜上,比較推薦使用第一種方法來實現短碼的生成

分享到:
標簽:網址
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定