回覆列表
  • 1 # 草莓味地黃丸

    有啊,推薦用暴走工具箱做短網址

    還帶有統計功能,方便做資料分析

    入口:http://m.mzsmn.com/

    全站功能免費使用,不收費

  • 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畫布功能就可以了,第一步需要大批量將長連結生成短連線。

    綜上,是我個人在短網址生成這塊整合第三方的方案調研,如果公司有錢的話,或者手上有自己的短域名,那就更棒了,自己生成就可以了,但是短域名就那麼些,物以稀為貴~

  • 中秋節和大豐收的關聯?
  • 如何看待蘋果2018年推出的iPhone XR?配置和效能如何?