长地址URL转短地址URL
1.前言
長地址:
就是頁面請求實際的地址。如知乎某文章https://www.zhihu.com/question/20103344
短地址:
特定長地址縮短后對應(yīng)的長度很短的地址,基本上可以理解為一一對應(yīng)關(guān)系
如https://www.zhihu.com/question/20103344的短地址為 http://dwz.date/am7a
備注:
上述地址是由新浪地址轉(zhuǎn)換平臺提供的,對于同一個長地址,不同的轉(zhuǎn)換平臺生成的短地址不一樣,
同一個平臺不同時間長成的短地址也可能不一樣
2.使用場景
微博上發(fā)送新微博內(nèi)容時,限制字?jǐn)?shù)為140字,如果需要分享鏈接,那么很長的鏈接會導(dǎo)致內(nèi)容篇幅縮小,而且url本身也可能超過140個字,所以如果把地址轉(zhuǎn)換為短地址,那么用戶輸入短地址,看到的是和輸入長地址一樣的頁面信息,那么用戶體驗會變好。
發(fā)送推廣短信時超出70字算兩條短信,費用增加,長鏈接也影響用戶體驗
綜上
在特定場景下,需要能夠把長連接轉(zhuǎn)換為短鏈接
用戶輸入短鏈接的效果和長連接一樣(瀏覽器后臺重定向)
短鏈接需要長期有效(或者一定時間內(nèi),如1天內(nèi)有效)
對于同樣的長鏈接,生成的短鏈接需要一樣(或者在一定時間內(nèi)一樣)
3.實現(xiàn)必要條件(基于本博客所用方案而言的必要條件)
1.有一個獨立的域名系統(tǒng),用于拼接完整的短鏈接,以后后續(xù)反查長鏈接地址
2.一個id發(fā)號器(生成樹數(shù)字保持唯一),如數(shù)據(jù)庫的自增序列
4.實現(xiàn)方案
a.將長鏈接字符串插入數(shù)據(jù)庫,使用sequence遞增序列作為主鍵,然后返回主鍵id
或者是先從發(fā)號器取出一個新的id,插入id和長鏈接字符串(兩個字段,且id為主鍵)
b.將主鍵id進行62進制編碼(10數(shù)字+26大寫字母+26小寫字母,一般url用這些表示)
c.使用自身域名信息+62進制字符串拼接為完整的url,然后返回
解析:
客戶請求短鏈接時,時間是尋址短鏈接域名發(fā)送到我們的系統(tǒng)上,
然后根據(jù)鏈接后面的url后綴,轉(zhuǎn)換為10進制,去數(shù)據(jù)庫查詢這個主鍵,找出長鏈接,
然后返回給客戶端,且返回碼為301/302(瀏覽器會自動重定向到長鏈接地址,用戶無感知).
5.優(yōu)化方案
上面有兩個問題未解決:
a.發(fā)號器可能會成為瓶頸
b.對于同樣的長鏈接,生成的短鏈接不一樣
解決辦法:
a.發(fā)號器問題
可以多用幾個發(fā)號器,各自發(fā)號不重復(fù)即可。
如10個發(fā)號器,則發(fā)號尾號是1,2,3,4,5,6,7,8,9,0
即發(fā)號進制等于發(fā)號器的數(shù)量,如果發(fā)號器只有一個,那么每次發(fā)號數(shù)增加1.
b. 短鏈接不一樣的問題
方案一:內(nèi)存存放LinkedHashMap,key為長鏈接,value為短鏈接,
考慮到內(nèi)存問題,那么只能存放一定數(shù)量的鍵值對,使用LRU進行驅(qū)逐。
這樣,在一定時間內(nèi),某個長鏈接生成的短鏈接一直不變。
方案二:(考慮到要求長鏈接對應(yīng)的短鏈接要永久一樣)
存入數(shù)據(jù)庫時,除了唯一id和長鏈接地址外,使用長鏈接生成64位hashcode,然后一并存入數(shù)據(jù)庫,并且添加索引
下次插入數(shù)據(jù)庫之前,先查詢hashcode列是否有這個值,有的話則取出比較value是否相等,
這里可能是hash沖突,實際上不是同一個長鏈接,但是使用64位hashcode的話,沖突概率會小很多,
這里使用hashcode做索引,而不是直接使用長鏈接本身,是考慮到長鏈接比較長,作為索引的話,會導(dǎo)致索引層級加深,需要增加額外的磁盤尋址
6.產(chǎn)品舉例
新浪:http://sina.lt/
百度:http://dwz.cn/
0x3:http://0x3.me/
MRW:http://mrw.so/
新浪長地址轉(zhuǎn)短地址,使用結(jié)果如下:
https://www.zhihu.com/question/20103344 生成的短地址為:am7a
https://www.kanzhun.com/employee/gsl1194828/1587907702/生成的短地址為:am7c
使用短鏈接去請求頁面:
總結(jié)
以上是生活随笔為你收集整理的长地址URL转短地址URL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计订单号规则和依据
- 下一篇: consumer详解