短鏈接系統(tǒng)的算法原理

平時(shí)我們?cè)谏暇W(wǎng)的時(shí)候爽雄,印象最深刻的有一次是短鏈接的服務(wù)骤菠。例如:平時(shí)在微信上看一個(gè)網(wǎng)頁的時(shí)候相种,如果我們選擇在瀏覽器打開的時(shí)候遣妥,會(huì)看到很長(zhǎng)的URL,我們分享的時(shí)候谈跛,會(huì)看到一個(gè)很短URL羊苟,這就是本次所說的短鏈接的應(yīng)用之一。
長(zhǎng)鏈接示例:https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA==&mid=2653355437&idx=1&sn=5901826ea638462ff71b7f2d06c6331d&chksm=8035d7c6b7425ed06661866af60657414bb71765d2ce915d14726736fa1e72ea8a529331c947&scene=0&key=34df968fd24033237ff036c7de8b6745e1968de9564cf2a8db689025dd0c3682848381771dab960824f506e6f9d484614746f9c0eecb48b884ce4320bb86470a77ce811cc5b401a8800b6fd6b36be097&ascene=0&uin=ODU5NDQ1NjI1&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.12.6+build(16G29)&version=12020810&nettype=WIFI&fontScale=100&pass_ticket=IvPqxUmCJqZg9%2B3GfAIQSbQ4IGRIHx796D0UwlCyUCu4b5P4bSsjlN89A0eRzSfL
我用短鏈接系統(tǒng)生成的(長(zhǎng)期會(huì)失效):https://0x9.me/FAKcm

怎么把長(zhǎng)鏈接轉(zhuǎn)換成短鏈接呢感憾?

廢話少說蜡励,短鏈接就是我們很短的鏈接。我們的目的是要把長(zhǎng)鏈接轉(zhuǎn)換成短鏈接阻桅。接下來我要提出一個(gè)問題:怎么把長(zhǎng)鏈接轉(zhuǎn)換成短鏈接呢凉倚?
1.壓縮
實(shí)現(xiàn)一種算法,將長(zhǎng)地址轉(zhuǎn)換成短地址嫂沉。然后再實(shí)現(xiàn)一種逆運(yùn)算稽寒,將短地址轉(zhuǎn)換成原來的地址。其實(shí)仔細(xì)的想一下趟章,這是不可能的杏糙。
2.Hash算法
可能是大多數(shù)人都會(huì)想到的一種方法。有人會(huì)提出蚓土,將一個(gè)長(zhǎng)URL進(jìn)行Hash運(yùn)算宏侍,然后將Hash值作為這個(gè)長(zhǎng)鏈接的唯一標(biāo)示。但是通常容易想到的不一定是最優(yōu)的蜀漆,我們知道Hash有可能產(chǎn)生碰撞谅河,Hash碰撞的解決,會(huì)增強(qiáng)短鏈接系統(tǒng)的復(fù)雜度。

最優(yōu)的算法

通過發(fā)號(hào)原理

顧名思義這個(gè)系統(tǒng)的第一個(gè)請(qǐng)求過來了绷耍,我們以微博為例吐限,短鏈接系統(tǒng)的第一個(gè)請(qǐng)求我們可以給變?yōu)閠.cn/0,第二個(gè)t.cn/1等等锨天;
實(shí)現(xiàn)的方式也會(huì)很簡(jiǎn)單
1毯盈、小型的系統(tǒng)用MySQL的自增索引就可以滿足。
2病袄、大型系統(tǒng)可以考慮分布式key-value系統(tǒng)搂赋。

存儲(chǔ)原理

發(fā)號(hào)策略是這樣的,當(dāng)一個(gè)新的鏈接過來時(shí)益缠,發(fā)號(hào)器發(fā)一個(gè)號(hào)與之對(duì)應(yīng)脑奠。往后只要有新鏈接過來,發(fā)號(hào)器不停發(fā)號(hào)就好幅慌。舉個(gè)例子宋欺,第一個(gè)進(jìn)來的鏈接發(fā)號(hào)器發(fā)0號(hào),對(duì)應(yīng)的短鏈接為 xx.xxx/0胰伍,第二個(gè)進(jìn)來的鏈接發(fā)號(hào)器發(fā)1號(hào)齿诞,對(duì)應(yīng)的短鏈接為 xx.xxx/1,以此類推骂租。
發(fā)號(hào)器發(fā)出的10進(jìn)制號(hào)需要轉(zhuǎn)換成62進(jìn)制祷杈,這樣可以大大縮短號(hào)碼轉(zhuǎn)換成字符串后的長(zhǎng)度。比如發(fā)號(hào)器發(fā)出 10,000,000,000 這個(gè)號(hào)碼渗饮,如果不轉(zhuǎn)換成62進(jìn)制但汞,直接拼接在域名后面,得到這樣一個(gè)鏈接 xx.xxx/10000000000互站。將上面的號(hào)碼轉(zhuǎn)換成62進(jìn)制私蕾,結(jié)果為AOYKUa,長(zhǎng)度只有6位胡桃,拼接得到的鏈接為 xx.xxx/AOYKUa踩叭。可以看得出翠胰,進(jìn)制轉(zhuǎn)換后得到的短鏈接長(zhǎng)度變短了一些懊纳。6位62進(jìn)制數(shù),對(duì)應(yīng)的號(hào)碼空間為626亡容,約等于568億,所以基本上不用擔(dān)心發(fā)號(hào)器無號(hào)可發(fā)的情況冤今。

高并發(fā)場(chǎng)景下

上面設(shè)計(jì)看起來有一個(gè)單點(diǎn)闺兢,那就是發(fā)號(hào)器。如果做成分布式的,那么多節(jié)點(diǎn)要保持同步加1屋谭,多點(diǎn)同時(shí)寫入脚囊。這樣難以避免產(chǎn)生單點(diǎn)性能瓶頸。因此我們可以考慮將單點(diǎn)變?yōu)槎帱c(diǎn)桐磁。我們可以引入多個(gè)機(jī)器悔耘,我們可以設(shè)定機(jī)器A發(fā)號(hào)只發(fā)向100取余等于0的數(shù)字100n,同理機(jī)器B只發(fā)向100取余等于1數(shù)字 100n+1我擂,以此類推衬以,各個(gè)機(jī)器相互獨(dú)立互不干擾,我們可以隨時(shí)擴(kuò)展我們的機(jī)器了校摩。

同一長(zhǎng)鏈接看峻,每次轉(zhuǎn)成的短鏈接是否一樣

同一長(zhǎng)鏈接,每次轉(zhuǎn)成的短鏈接不一定一樣衙吩,原因在于如果查詢緩存時(shí)互妓,如果未命中,發(fā)號(hào)器會(huì)發(fā)新號(hào)給這個(gè)鏈接坤塞。需要說明的是冯勉,緩存應(yīng)該緩存經(jīng)常轉(zhuǎn)換的熱門鏈接,假設(shè)設(shè)定緩存過期時(shí)間為一小時(shí)摹芙,如果某個(gè)鏈接很活躍的話灼狰,緩存查詢命中后,緩存會(huì)刷新這個(gè)鏈接的存活時(shí)間瘫辩,重新計(jì)時(shí)伏嗜,這個(gè)鏈接就會(huì)長(zhǎng)久存在緩存中。
我們也可以引入LRU算法伐厌。進(jìn)行淘汰我們不經(jīng)常使用到的鏈接承绸。

重定向問題

選取301,還是302挣轨?
301是永久重定向军熏,302是臨時(shí)重定向。

如果選擇301:短地址生成以后就不會(huì)變化卷扮,所以用301是符合http語義的荡澎。同時(shí)對(duì)服務(wù)器壓力也會(huì)有一定減少。這樣一來晤锹,我們就無法統(tǒng)計(jì)到短地址被點(diǎn)擊的次數(shù)了摩幔。
如果選擇302:選擇302雖然會(huì)增加服務(wù)器壓力,但是可以統(tǒng)計(jì)到短地址被點(diǎn)擊的次數(shù)了鞭铆,我可以針對(duì)點(diǎn)擊的次數(shù)來進(jìn)行后期的大數(shù)據(jù)處理或衡,機(jī)器學(xué)習(xí),以及推薦算法。
選擇302還是301封断,想必讀者心中有肯定有數(shù)了斯辰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坡疼,隨后出現(xiàn)的幾起案子彬呻,更是在濱河造成了極大的恐慌,老刑警劉巖柄瑰,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闸氮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狱意,警方通過查閱死者的電腦和手機(jī)湖苞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來详囤,“玉大人财骨,你說我怎么就攤上這事〔亟悖” “怎么了隆箩?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羔杨。 經(jīng)常有香客問我捌臊,道長(zhǎng),這世上最難降的妖魔是什么兜材? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任理澎,我火速辦了婚禮,結(jié)果婚禮上曙寡,老公的妹妹穿的比我還像新娘糠爬。我一直安慰自己,他們只是感情好举庶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布执隧。 她就那樣靜靜地躺著,像睡著了一般户侥。 火紅的嫁衣襯著肌膚如雪镀琉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天蕊唐,我揣著相機(jī)與錄音屋摔,去河邊找鬼。 笑死替梨,一個(gè)胖子當(dāng)著我的面吹牛钓试,可吹牛的內(nèi)容都是我干的署尤。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼亚侠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了俗扇?” 一聲冷哼從身側(cè)響起硝烂,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铜幽,沒想到半個(gè)月后滞谢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡除抛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年狮杨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片到忽。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橄教,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喘漏,到底是詐尸還是另有隱情护蝶,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布翩迈,位于F島的核電站持灰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏负饲。R本人自食惡果不足惜堤魁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望返十。 院中可真熱鬧妥泉,春花似錦、人聲如沸吧慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽检诗。三九已至匈仗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逢慌,已是汗流浹背悠轩。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攻泼,地道東北人火架。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓鉴象,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親何鸡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纺弊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容