<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺談短鏈的設(shè)計

          共 2933字,需瀏覽 6分鐘

           ·

          2023-08-16 18:31

          術(shù)         背景

          目前在很多場景下,都需要短鏈,尤其是涉及到一些 URL 下發(fā)的邏輯。之前做小馬 AI 課的業(yè)務(wù)時,銷售通過短信下發(fā)的鏈接就是一個短鏈。為什么需要短鏈呢?考慮到一個 URL 上有 path、query 等參數(shù),各種參數(shù)拼接在一起就成了一個長不拉幾的字符串。

          在很多社交平臺上,對于發(fā)送的文本是有長度限制,過長的 URL 很容易被截斷,然后觸達就無效了。當(dāng)用戶收到一個短鏈,心情可能更加愉悅:

          5a748bcc7665841827681233b64af25a.webp 短鏈組成

          知己知彼百戰(zhàn)百勝,先來看看一個短鏈有哪些信息。

          ee1521266a235dbd563f8a8f7368bca5.webp

          協(xié)議 + 域名 + path,協(xié)議可以直接忽略。域名是必須的(廢話),并且足夠短,否則的話就變成了長的短鏈(挺傻的)。最后 path 的部分才是關(guān)鍵,看起來是一個由 6 個字符組成的字符串,并且字符的范圍是大小寫字母+數(shù)字。

          足夠短的域名需要什么條件?大概率錢夠就行。涉及到錢的部分,這里就不深入探究了。所以來研究一下這個 path 的生成。

          Path 的生成

          獲取一個序號

          哈希算法

          Path 的其中一種方式就是通過哈希算法計算得到。常見的哈希函數(shù)有 MD5、SHA1 等大家常見的加密型哈希算法,也有 HighwayHash、MurmurHash 等非加密型哈希函數(shù)。以 MurmurHash 為例,目前已經(jīng)迭代到 MurmurHash 3,能夠產(chǎn)生 32bit 和 128 bit 的哈希值,并且對于規(guī)律性較強的 key,隨機分布的特征表現(xiàn)的很不錯。

          不過哈希沖突是不可控的,我們雖然有 N 種解決哈希沖突的方式,但是會增加整個系統(tǒng)的整體復(fù)雜度。

          自增 ID

          也可以維護一個 ID 自增生成器,對于每一個長鏈生成1、2、3等自增的序號,然后把長鏈和序號的映射保存在數(shù)據(jù)庫里面,然后得到如 https://fake.short/1、https://fake.short/2 等短鏈。考慮到單機容易造成單點故障,所以一般都是分布式的 ID 生成器。

          Mysql 自增

          假設(shè)有 10 臺 Mysql 服務(wù)器,每一臺初始值分別為 0……9,然后每生成一個需要就遞增 10,這樣確保這 10 臺 Mysql 服務(wù)器產(chǎn)生的 ID 不重復(fù)。但這個方案缺點比較明顯,就是 ID 是有跡可循的,爬蟲的可以順著順序依次請求得到;水平擴展不容易,如之前約定 10 臺機器,每臺機器生產(chǎn)的步長是 10,如果需要增加一臺機器,比較困難;數(shù)據(jù)庫壓力還是很大,每次獲取ID都得讀寫一次數(shù)據(jù)庫,只能靠堆機器來提高性能。

          基于雪花算法

          SnowFlake 是 Twitter 公司采用的一種算法,目的是在分布式系統(tǒng)中產(chǎn)生全局唯一且趨勢遞增的ID。

          ac5fe672e8985ed8936497e4dd93bdfb.webp

          第一位占用 1bit,其值始終是0,沒有實際作用。2.時間戳 占用 41bit,精確到毫秒,總共可以容納約 69 年的時間。3.工作機器id 占用10bit,其中高位 5bit 是數(shù)據(jù)中心ID,低位 5bit 是工作節(jié)點ID,做多可以容納 1024 個節(jié)點。4.序列號 占用12bit,每個節(jié)點每毫秒0開始不斷累加,最多可以累加到4095,一共可以產(chǎn)生 4096 個ID。

          SnowFlake算法在同一毫秒內(nèi)最多可以生成 1024 X 4096 = 4194304 個全局唯一ID。

          國內(nèi)也有不少基于(類)雪花算法的開源分布式唯一ID生成器:

          1. UidGenerator

          由百度開源的分布式 UID 生成器。https://github.com/baidu/uid-generator

          1. Leaf

          Leaf 是美團開源的分布式ID生成器,能保證全局唯一,趨勢遞增,但需要依賴關(guān)系數(shù)據(jù)庫、Zookeeper等中間件。https://tech.meituan.com/2017/04/21/mt-leaf.html

          進一步縮短

          如果我們得到『1536389934』這個序號的話,看起來還是有點長,如果想進一步縮短,可以把十進制數(shù)轉(zhuǎn)換成62進制數(shù)。然后就得到一個比原序號更短的 ID 了。

          493e1e125b8f7103480e417dbd5a08ba.webp

          為什么要用62進制轉(zhuǎn)換?

          • 62進制轉(zhuǎn)換是因為62進制轉(zhuǎn)換后只含數(shù)字+小寫+大寫字母。而64進制轉(zhuǎn)換會含有/,+這樣的符號(不符合正常URL的字符)encodeURIComponent('+') => %xx
          • 10進制轉(zhuǎn)62進制可以縮短字符,如果我們要6位字符的話,已經(jīng)有560億個組合了。
          重定向是 301 還是 302

          眾所周知,301 是永久重定向,瀏覽器會把重定向后的地址緩存下來,下次訪問的時候,就不會向原地址發(fā)起請求;按理來說通過 301 的重定向性能會更好,對服務(wù)的壓力也更小。

          2e6fa1c0ce6677fd28eb62502d38a5c9.webp

          但是,正因為 301 會在瀏覽器中有緩存,所以服務(wù)端就沒辦法知道有多少用戶是通過這個短鏈訪問的,在現(xiàn)如今什么數(shù)據(jù)都可以分析一波的時代,這些數(shù)據(jù)的缺失,就失去了分析活動的能力。所以一般都通過 302 進行重定向,便于記錄使用的數(shù)據(jù),稍微增加點 Server 的壓力。(沒有什么是不能通過加機器解決的

          參考資料

          https://juejin.cn/post/6990275533057556494

          https://tech.meituan.com/2017/04/21/mt-leaf.html

          https://zhuanlan.zhihu.com/p/85837641

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

          https://www.zhihu.com/question/20103344


          ?? 謝謝支持

          以上便是本次分享的全部內(nèi)容,希望對你有所幫助^_^

          喜歡的話別忘了 分享、點贊、收藏 三連哦~。

          歡迎關(guān)注公眾號 ELab團隊 收貨大廠一手好文章~

          我們來自字節(jié)跳動,是旗下大力教育前端部門,負(fù)責(zé)字節(jié)跳動教育全線產(chǎn)品前端開發(fā)工作。

          我們圍繞產(chǎn)品品質(zhì)提升、開發(fā)效率、創(chuàng)意與前沿技術(shù)等方向沉淀與傳播專業(yè)知識及案例,為業(yè)界貢獻經(jīng)驗價值。包括但不限于性能監(jiān)控、組件庫、多端技術(shù)、Serverless、可視化搭建、音視頻、人工智能、產(chǎn)品設(shè)計與營銷等內(nèi)容。

          歡迎感興趣的同學(xué)在評論區(qū)或使用內(nèi)推碼內(nèi)推到作者部門拍磚哦 ??

          字節(jié)跳動校/社招投遞鏈接: https://job.toutia o.com/

          內(nèi)推碼: FD72CWA


          瀏覽 95
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠操视频网 | 国产一级黄色A片 | 日韩无码 精品 乱伦 | 影音先锋男人资源网 | 大屌视频在线观看 |