面試精選集,快快前往領取吧!offer.liangsonghua.me/。關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!
web
微博和Twitter都有140字數的限制,若是分享一個長網址,很容易就超出限制,發佈出去。短網址服務能夠把一個長網址變成短網址,方便在社交網絡上傳播。面試
很顯然,要儘量的短。長度設計爲多少才合適呢?算法
當前互聯網上的網頁總數大概是 45億(參考 短網址_短網址資訊mrw.so
),45億 超過了 2^{32}=4294967296232=4294967296
,但遠遠小於64位整數的上限值,那麼用一個64位整數足夠了。微博的短網址服務用的是長度爲 7
的字符串,這個字符串能夠看作是62進制的數,那麼最大能表示{62}^7=3521614606208627=3521614606208
個網址,遠遠大於 45億。因此長度爲7就足夠了。一個64位整數如何轉化爲字符串呢?,假設咱們只是用大小寫字母加數字,那麼能夠看作是62進制數,log_{62{(2^{64}-1)=10.7log62(264−1)=10.7
,即字符串最長11就足夠了。實際生產中,還能夠再短一點,好比新浪微博採用的長度就是7,由於 62^7=3521614606208627=3521614606208,這個量級遠遠超過互聯網上的URL總數了,絕對夠用了。現代的web服務器(例如Apache, Nginx)大部分都區分URL裏的大小寫了,因此用大小寫字母來區分不一樣的URL是沒問題的。所以,正確答案:長度不超過7的字符串,由大小寫字母加數字共62個字母組成。數據庫
一個長網址,對應一個短網址,仍是能夠對應多個短網址? 這也是個重大選擇問題。通常而言,一個長網址,在不一樣的地點,不一樣的用戶等狀況下,生成的短網址應該不同,這樣,在後端數據庫中,能夠更好的進行數據分析。若是一個長網址與一個短網址一一對應,那麼在數據庫中,僅有一行數據,沒法區分不一樣的來源,就沒法作數據分析了。後端
以這個7位長度的短網址做爲惟一ID,這個ID下能夠掛各類信息,好比生成該網址的用戶名,所在網站,HTTP頭部的 User Agent等信息,收集了這些信息,纔有可能在後面作大數據分析,挖掘數據的價值。短網址服務商的一大盈利來源就是這些數據。瀏覽器
正確答案:一對多緩存
如今咱們設定了短網址是一個長度爲7的字符串,如何計算獲得這個短網址呢?服務器
最容易想到的辦法是哈希,先hash獲得一個64位整數,將它轉化爲62進制整,截取低7位便可。可是哈希算法會有衝突,如何處理衝突呢,又是一個麻煩。這個方法只是轉移了矛盾,沒有解決矛盾,拋棄。微信
正確答案:分佈式發號器(Distributed ID Generator
)網絡
若是存儲短網址和長網址的對應關係?以短網址爲 primary key
, 長網址爲value
, 能夠用傳統的關係數據庫存起來,例如MySQL,PostgreSQL
,也能夠用任意一個分佈式 KV 數據庫,例如Redis, LevelDB
。
這也是一個有意思的問題。這個問題主要是考察你對301和302的理解,以及瀏覽器緩存機制的理解。
301是永久重定向,302是臨時重定向。短地址一經生成就不會變化,因此用301是符合http語義的。可是若是用了301, Google
,百度
等搜索引擎,搜索的時候會直接展現真實地址,那咱們就沒法統計到短地址被點擊的次數了,也沒法收集用戶的Cookie
, User Agent
等信息,這些信息能夠用來作不少有意思的大數據分析,也是短網址服務商的主要盈利來源。
因此,正確答案是302重定向。
能夠抓包看看mrw.so的短網址是怎麼作的,使用 Chrome 瀏覽器,訪問這個URL http://mrw.so/4UD39p
,是我事先發微博自動生成的短網址。來抓包看看返回的結果是啥,可見新浪微博用的就是302臨時重定向。
文章來源:www.liangsonghua.me
做者介紹:京東資深工程師-梁鬆華,在穩定性保障、敏捷開發、JAVA高級、微服務架構方面有深刻的理解
關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!