日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

如何设计一个短URL地址系统

發布時間:2024/9/30 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何设计一个短URL地址系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、短URL系統的原理:

????????短URL系統的核心是將長的 URL 轉化成短的 URL;在訪問系統時,先使用短地址A訪問短URL系統,由短URL系統映射到對應的長地址B,然后客戶端再重定向(301或者302)到B網址,如下圖所示:

二、短 URL 的好處:

1、鏈接變短,對于有長度限制的平臺發文,可編輯的文字就變多了

2、短鏈接生成的二維碼更易于識別,而長鏈接的二維碼密集難識別

3、短鏈接更加簡潔好看且安全,不暴露訪問參數。

4、能規避關鍵詞、域名屏蔽等手段

5、鏈接太長在有些平臺上無法自動識別為超鏈接

三、短 URL 系統的設計與實現:

系統核心實現思路:使用發號器發號 => 為每個長地址分配一個號碼ID => 將號碼與長地址存放在DB中 => 將號碼轉化成62進制,用戶表示最終的短地址并返回給用戶(假設短地址長度為8位,62的8次方足夠一般系統使用了) => 用戶使用62進制的短地址請求服務 => 將62進制的數轉化成10進制 => 在DB中尋找對應的長地址 => 將用戶請求重定向到對應的地址上

1、發號器的設計:

(1)如果是小型系統,可使用MySQL的自增主鍵,但是這種方式存在性能問題,要解決該問題,可以通過批量發號來解決,提前為每臺機器發放一個ID區間 tmp_start_num - tmp_end_num,然后由機器在自己內存中使用 AtomicLong 原子類去保證自增,減少對DB的依賴,等到區間即將滿了,再向 DB 請求下一個區段的號碼,然后等區間滿了,再一次性將記錄保存到DB中,這樣就可以將對數據庫持續的操作移到代碼中進行,并且異步進行獲取和寫入操作,保證服務的持續高并發。比如可以每次從數據庫獲取10000個號碼,然后在內存中進行發放,當剩余的號碼不足1000時,重新向MySQL請求下10000個號碼,在上一批號碼發放完了之后,批量進行寫入數據庫。

(2)如果是大型系統,則可以使用分布式自增主鍵

(3)雪花算法:依賴于系統時鐘的一致性。如果某臺機器的系統時鐘回撥,有可能造成 ID 沖突,或者 ID 亂序。

2、發號器的單點問題:

????????可以使用多個發號器,例如實現兩個發號器,一個發單號,一個發雙號。依次類推,我們也可以實現 1000 個發號器,分別發尾號為0到999的號。每發一個號,每個發號器加1000,而不是加1。這些發號器獨立工作,互不干擾即可,這種方式還能解決單點發號器性能瓶頸。

3、同一個長址多次請求得到的短址不一樣:

????????無論是前面提到的哪種方式,都存在的問題就是同個長址多次請求得到的短址是不一樣,因為每次都會重新為該長址生成一個短址。為了實現長短鏈接真正意義上的一對一,我們可以建立一個長對短的 Hashmap,但是需要付出很大的空間代價。因此我們對這種方式做一些改變來實現部分地址的一對一,比如將最近/最熱門的對應關系存儲在K-V數據庫中,在 Hashmap 中只存儲最近生成的長對短的對應關系,并采用過期機制實現 LRU 淘汰,從而保證頻繁使用的 URL 的總是對應同一個短址的,但是不保證不頻繁使用的URL的對應關系,從而大大減少了空間上的消耗。

????????此外,使用了緩存,也可以加快程序處理速度,將熱門的長鏈接(需要對長鏈接進來的次數進行計數)、最近的長鏈接(可以使用 Redis 保存最近一個小時的數據)等等進行一個緩存,如果請求的長URL命中了緩存,那么直接獲取對應的短URL進行返回,不需要再進行生成操作

4、服務間的重定向:301 和 302

301永久重定向和 302 臨時重定向。

  • 301永久重定向:第一次請求拿到長鏈接后,下次瀏覽器再去請求短鏈的話,不會向短網址服務器請求了,而是直接從瀏覽器的緩存里拿,減少對服務器的壓力。
  • 302臨時重定向:每次去請求短鏈都會去請求短網址服務器(除非響應中用 Cache-Control 或 Expired 暗示瀏覽器進行緩存)

????????使用 301 雖然可以減少服務器的壓力,但是無法在 server 層獲取到短網址的訪問次數了,如果鏈接剛好是某個活動的鏈接,就無法分析此活動的效果以及用于大數據分析了。而 302 雖然會增加服務器壓力,但便于在 server 層統計訪問數,所以如果對這些數據有需求,可以采用 302,因為這點代價是值得的,但是具體采用哪種跳轉方式,還是要結合實際情況進行選型。

參考文章:

https://www.zhihu.com/question/29270034/answer/46446911

https://cloud.tencent.com/developer/article/1451239

總結

以上是生活随笔為你收集整理的如何设计一个短URL地址系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。