長鏈生成短鏈的思考

一些業務場景,好比說短信、push須要帶上跳轉連接,這個時候就須要把長鏈轉換爲短鏈redis

長鏈如何轉短鏈?其實長鏈和生成短鏈的過程是沒有任何關係的,惟一的聯繫就是生成之後作關聯算法

1:短鏈生成

結合實際工做中以及網上,大概兩種比較常規的方式,默認生成六位短鏈數據庫

方式一:經過移位+簡單的算法生成一個隨機數

第一步:作位移,並加上一個0,1隨機數

for (int i = 0; i < 36; i++) {
    int random = random.nextInt(2);
    randomNumber = random  + (randomNumber << 1);
}

加上0,1隨機數,是爲了防止碰撞,這樣碰撞的概率就差很少是1/2的36次方,屬於接收範圍數組

至於爲何循環36次,後面會說;至此,一個隨機數randomNumber已經生成 緩存

第二步:用隨機數映射到6位的短鏈

for (int i = 0; i < 6; i++) {
     charList.append(char62[(int) (k & randomNumber )]); 
randomNum = (randomNum >> 6);
}  

K是什麼?K是63,16進制0x3F,和randomNumber作操做,獲得一個62進制的數,而後取出來對應的那一位併發

62進制數組成:26位大寫字母+26位小寫字母+10個數字app

而後randomNum右移6位,這就和上面的36次循環生成隨機數對應了dom

36次循環分紅6份,每份隨機出來的0,1組合對應一個符號分佈式

方式二:信號發射器

這種方式藉助於數據庫的自增主鍵id,而後把ID映射爲62進制數的6位,這篇文章介紹spa

https://blog.csdn.net/xlgen157387/article/details/80026452 

這種方式,要考慮分佈式生成的狀況,還有數據壓力。我的想法能夠參考美團的leaf生成器,分段拿

到這裏,已經生成了短鏈,可是短鏈和長鏈如何映射?

2:長鏈和短鏈的映射

對應關係確定是要持久化到數據庫的,可是一旦併發量大的時候,數據庫壓力比較大,就須要考慮用緩存了;優先使用redis的時候,又無法把所有的映射關係存起來,

以爲底層仍是須要依賴分表來解決部分問題,用長鏈的md5和短鏈分表,分別作惟一鍵。這裏惟一鍵的做用就是防止短鏈碰撞,在短鏈碰撞的時候能夠進行重試。

還有就是長鏈和短鏈的映射關係咱們在緩存的時候,能夠認爲是符合最近使用的原則,也就是咱們只保留「熱點」的長鏈和短鏈在緩存的映射關係,這樣能夠大大減小緩存的大小

相關文章
相關標籤/搜索