聲明:該文屬於自己的一點點看法而已,僅供娛樂參考,勿噴。轉載請標明:http://blog.csdn.net/lywybo
微博的短網址系統大家應該都不陌生吧。具體短網址是幹嘛的,爲什麼要有短網址,我就不羅嗦了,不知道的直接google就成。
sina短網址域名是http://t.cn 騰訊短網址域名是http://url.cn
短網址的組成:
不說廢話,只看sina和qq的,其他的忽略,畢竟實現起來有N種方法。sina和qq的都是域名+key的形式
key值目前由六位組成。每位62個字符(0-9,a-z,A-Z)。
很多人分析短網址系統就會說,先MD5或者其他的hash,然後各種與、各種或得出幾組值,選其中一組即可。
我覺得有這種思路的人一般都是看到4gBOjY 、39qdlG 這種類型,就會聯想到md5的結果的一部分,所以就用盡各種方法給扯到了md5的結果上,不是說這樣做不妥,只是覺得可以有更好的方案。
6位62個字符,那麼總量是固定的600多億,也就是說短網址,不管你用啥子hash生成,只能生成600多億個,只能存600多億條網址。既然總數都是固定的,那麼幹嘛每次存一個新網址的時候要先生成MD5然後在把MD5包裝過來包裝過去得到一個6位的key呢,本身MD5就會碰撞,你縮到6位碰撞不就更厲害了麼,重複了咋辦呢?
直接來個62進制每次加一不就行了麼,反正容量是固定的,hash過來hash過去有意思麼?
短網址的特點:
1.短。key值僅6位、域名也很短
2.對於已經縮略的網址,直接返回已有的key
3.沒有收錄過的網址,會生成一個唯一的key表示
第一組測試
16:35 http://weibo.short.url.test.com/lywybo http://t.cn/aN6Go5
16:38 http://weibo.short.url.test.com/blog/lywybo http://t.cn/aN6Gry 與上個相比,表明是有序的
16:39 http://www.sina.com.cn/lywybo/csnd/blog http://t.cn/aN65Y4 與上兩個相比,表明有序不是因爲同個域
16:39 http://www.baidu.com http://t.cn/h5mwx 與上三個相比,表明已有的,直接返回key值
第二組測試
http://t.cn/aN65Y4 (我發的) ----------> http://www.sina.com.cn/lywybo/csnd/blog
http://t.cn/aN65Y3 (應該是別人新建的微羣,才1個人。。。。截圖時間和上面那個接近)
截圖時間:16:41
說明不只你有序,別人和你一樣,有序。
結論:綜上所述,新浪的短網址是有序的。
廢話說了那麼多,終於進入正題了,說下我認爲短網址的實現方式
我認爲。。。。短網址系統,直接用(0-9,a-z,A-Z)組成的62進制數,不停累加就行了,新浪目前應該就是這麼的實現方式。
存儲格式:key--url--MD5
aaaaaa--http://www.baidu.com/1---MD5
aaaaab--http://www.baidu.com/2---MD5
aaaaac--http://www.baidu.com/2---MD5
aaaaad--http://www.baidu.com/2---MD5
key可以存一組索引,用於通過key訪問轉換url
MD5(hash)可以做一組索引,用來檢測url是否已經被縮略過.
上文提到MD5會碰撞,重複的時候直接將碰撞的url讀出直接比對即可。。。(這個時候不要忘記做記錄log啊,因爲你發現了新大陸了。。。)
數據的存儲方式:
不推薦數據庫存儲,量大了之後不分庫、分表,效率太低。分庫、分表成本都太高了。還是直接像搜索引擎一樣文件存儲比較自由
比搜索引擎索引更簡單的一點是:這個索引建立了之後不用更新的,一直往下存就是了,假設一條記錄1K,都可以計算出需要使用多大的容量(還是很小的幾塊硬盤的事),索引的存儲,類似搜索引擎切詞後索引的分割做法,對索引在做索引。
其實可以將這種存儲定性爲雙索引的小文件存儲系統(key值順序索引、MD5索引)
對於熱門的url,直接LRU緩存起
擴展性:
當626滿了怎麼辦呢?
1.key擴充到7位。。。
2.其他程序什麼都不用變繼續62進制,只是key值長度變長了。。。。
疑問:
可能有同學會問了,爲嘛就一定會key變到7位啊?
那我就想反問一個,誰規定微博的key值一定是6位的?其實http://t.cn 本身就比 http://url.cn 少一位呢。也就是在新浪微博同樣髮帶url的微博時候,你比qq微博可以多發一個字。
新浪微博
騰訊微博
迴歸到爲嘛選6,因爲6位的話就是600多億,它足夠大,短時間內用不完。。。貌似google索引網頁的量也就一兩千億吧(查不到準確數據)。
所以用6夠了。
爲嘛不用5,因爲用5的話就是10億,小了點不是很靠譜。。。
爲嘛不用7,用7就少一個字(新浪就是比騰訊多了一個字,所以現在比騰訊火。。。哈哈,開玩笑),等6滿了在用7也不晚。
最後的期待:
1.期待http://t.cn/iloveu 的產生
2.期待6位key值耗盡的那天。。。。