-
1 # 草莓味地黃丸
-
2 # 程式設計師小助手
前言
網上已經有產品,用著還不錯。可是,作為程式設計師,從零開始造輪子,開發一個屬於自己的短網址伺服器,這想法amazing!
通過本文,讀者可明白短網址的技術原理,以及通過Go語言實現一個短網址服務。
簡明教程短網址為什麼存在?
短網址應運而生,用較短的一個字串,替換較長的一個字串,從觀感上講,效果要友好的多。
從技術原理上說,短網址是一個hash表,用於對映兩個字串的對應關係。
使用鍵,找到對應的值,重定向進行訪問,就完成了整個流程。
短網址演算法短網址的一般結構,比如新浪的 SwuTjn,其中後端的一段6位字串,就是用來唯一標記一條記錄的ID。那麼,使用什麼演算法,可以生成一條無重複的ID呢?
使用通用的做法,使用 0-9 A-Z a-z 一共62個字元,我們看使用hash鍵位數分別有多少種排列組合情況。
1位:pow(62,1) = 62 種
2位:pow(62,2) = 3844 種
3位:pow(62,3) = 238328 種
4位:pow(62,4) = 14776336 種
5位:pow(62,5) = 916132832 種
6位:pow(62,6) = 56800235584 種
一般情況下,6個字元,就足夠使用了,共計568億種可能。
還有一種情況是,用原網址字串的MD5值,共計32位,然後通過切分為4段,分別按位與運算,並裁剪到30位。間隔5位選出該位的字元作為該段索引,共有6位。但是這種做法也有機率發生重複,也不直觀。
因此本文使用第一種演算法生成鍵ID。
工具準備分析短網址的特性,包含以下專案:
唯一性:鍵需要全域性唯一時效性:鍵需要有過期時間目標網址唯一,如果重複,則自動返回既有的鍵。考慮到上述情形,我們使用redis儲存這些對應關係。使用Gin框架作為路由和控制器,提供對外的API訪問。
核心函式計算機中常見的2進位制,8進位制,10進位制,16進位制,我們此處需要使用62個字元,迴圈表示一個整數,那麼可稱之為62進位制。
下面使用go語言實現這個函式,用於將任意的整數(uint64)轉換為(0-9A-Za-z)的字串。
需要注意,基礎的方法,就是迴圈取餘數,根據進位制字典,索引相應的字元,然後將各個餘數拼接出來,就是結果。
這個計算方法,與2進位制,8進位制,原理是相同的。
由於字典比較長,有62個鍵值對,我們僅列出一部分。
上述函式的轉換結果,類似於 6489264001 = 75ai0p
功能規劃下面是對於系統路由,建立短連結,以及使用短連結訪問目標網址的方法。
1 - 規劃路由
路由比較簡單,一共2個,一個POST方法,生成短連結;一個是GET方法,訪問短連結。
程式碼如下:
2 - 引入redis並初始化
為了方便演示,我們使用redis儲存鍵值,並設定expire時間。
"github.com/gin-gonic/gin""github.com/go-redis/redis/v7"我們使用go-redis提供的介面操作redis資料庫。
下面是全域性的
redis.Client
物件生成,和初始化函式。這樣做的好處是,我們全域性都可以使用變數 rdb 呼叫方法操作redis鍵值。
3 - 實現POST路由方法:add
本函式用於接收form表單資料,生成一個全域性唯一的 hash ,作為鍵,存入redis,設定值和過期時間。
程式碼如下:
本段我們使用了一個 getCounter 函式,這是設定在redis內的鍵,將其每次請求建立的時候,自增+1,可保證無重複。根據這個計數器,我們呼叫 helper的 DecToAny 方法,將其轉化為62進位制的字串,作為全域性唯一的 hash 值。
下圖是 getCounter 的定義:
特別注意的是,helper包,就是我們在“核心函式”部分定義的函式。在主函式體內引用。
4 - 實現GET方法:visit
本函式主要用於使用上一節介面生成的短連結,進行訪問,並自動重定向到目標網址。
程式碼如下:
對於不存在的短連結,或者redis獲取失敗,返回錯誤資訊。
如果存在,使用 301 = StatusMovedPermanently 狀態碼重定向到目標地址。
測試我們使用curl工具,測試上述兩個介面。
首先,使用POST表單提交資料:
curl -s -X POST -d "target=https://httpbin.org/ip" -d "expire=600" http://localhost:9090/
上述方法,我們提交了兩個引數,命中路由之後,會訪問上一節第3條的add方法,並生成一個短連結網址。返回JSON格式資料如下:
{"message":"ok","short_url":"http://localhost:9090/75ai0r","status":1}
其中,short_url 就是短網址。
接著,我們在使用curl訪問這個連結,看是否發生重定向。截圖如下:
可以看到,執行了301重定向,並給出了目標網址,與我們上述表單想要建立的地址一致。
最後,故障測試。訪問一個不存在的hash,看是否排除異常資訊。截圖如下:
可以看到,執行了錯誤返回資訊。
結語以上我們使用GO語言框架Gin實現了兩個路由,並使用redis管理短連結。核心函式使用helper包管理,經過測試,實現了短網址的功能。
以上程式碼在本地測試通過,也可部署到線上伺服器對外開發埠,提供服務,效果是一樣的。
希望通過這個流程,使大家對於短網址的知識,有一些瞭解,並能根據自身的程式設計能力,創作出更好用的短網址服務。
Happy coding :-)
-
3 # 夢辰Pro
首先推薦幾個短網址線上網站:
1.新浪短網址:http://sina.lt/
2.百度短網址http://dwz.cn
3.縮我短網址(可支援批量生成)http://suo.im/
4.T.im.支援自定義連結字元及短網址的時效性。
http://t.im/
手機端的話,一些工具箱也可以做到短網址轉換,比如:一個木函、胖次工具箱等
-
4 # 啊勁
980.so在國內已經無法使用了,國外可以用,目前國內熱門的有百度短網址、新浪短網址、suo.im、mrw.so。前兩個是大公司大品牌,但是生成有很多限制,相關資料統計也不全面。而且偽新浪網址很多,假裝是新浪,有一個已經到可以亂真的地步了,排名還特別好。後兩個用倒是沒啥限制,而且資料統計也全面,就是聽說快要收費了。
-
5 # java架構設計
短網址常用場景:
隱藏自己的長連結鑑於安全的考慮,推廣出去的短連線一般人根本看不出來代表的意思,如果再用上匿名短網址,瀏覽器裡面也看不到真實的連結地址。
簡訊營銷我們經常會收到一些營銷簡訊,裡面會附帶上一個短連線,試想一下,如果是一個長連結,不僅僅簡訊費用會上升,體驗上也會很不好,一個連結就把你的手機螢幕佔滿了,點選的慾望也會降低。
最近我剛好為公司推廣出去的長連結做了短連結這個功能。簡單描述一下我的需求,做一個活動,便於使用者推廣分潤,每個使用者分享出去的圖片上都帶有一個二維碼,這個二維碼需要帶上每個使用者的id,所以一個使用者一個二維碼,所以需要做兩個事情:1.將帶有使用者Id的長連結生成短連結;2將短連線畫成二維碼合成到分享的圖片上去。第二步用前端的canvas畫布功能就可以了,第一步需要大批量將長連結生成短連線。
綜上,是我個人在短網址生成這塊整合第三方的方案調研,如果公司有錢的話,或者手上有自己的短域名,那就更棒了,自己生成就可以了,但是短域名就那麼些,物以稀為貴~
回覆列表
有啊,推薦用暴走工具箱做短網址
還帶有統計功能,方便做資料分析
入口:http://m.mzsmn.com/
全站功能免費使用,不收費