.
聲明:本人只是分享一些床長人工智慧教程相關的免費pdf文檔而已,並非床長人工智慧網校的收費文章。尊重版權,支持原創!
在我們進行開發工作時,資料庫表主鍵自動生成是一個基本的需求,而且大多數資料庫也提供了基本的解決方案,比如的自增主鍵的自增序列。
但是我們進行了分庫分表後,同一個邏輯表內的不同實際表之間的自增鍵由於無法互相感知而產生重複主鍵。
目前有許多第三方解決方案可以完美解決這個問題,如等依靠特定算法自生成不重複鍵,或者通過引入主鍵生成服務等。
為了方便用戶使用滿足不同用戶不同使用場景的需求,不僅提供了內置的分布式主鍵生成器,例如,還抽離出分布式主鍵生成器的接口,方便用戶自行實現自定義的自增主鍵生成器。
下面介紹幾種分布式的生成策略
的標準型式包含個進位數字,以連字號分為五段,形式為的個字符,示例
中包中直接提供了生成的方法
優點
因為是本地生成的,所以沒有網絡消耗,性能非常高。
缺點
太長了!是一個長度的長字符串,不利於存儲。
不太安全,基於地址生成,會造成地址洩露。
不適用於作為主鍵,以為例,官方建議主鍵長度越短越好,而則是位,不建議適用並且因為其無序性,如果作為主鍵插入時會引起數據位置的頻繁變動,嚴重影響性能。
資料庫生成
以為例,在設置主鍵時可以通過設置自動遞增來保證自增。
優點
實現簡單,基於資料庫功能實現,不需要編碼,對開發成本小。
有順序遞增,在某些業務場景下非常適用,適用於作為的主鍵,也是官方推薦的主鍵生成策略。
缺點
對資料庫依賴太高,當資料庫異常時,整個系統不可用。
性能不高,主要性能限制為單臺的讀寫性能。
對於以上的缺點性能問題,可以有以下的方案來進行解決
多部署幾臺機器,每臺機器設置不用的初始值,步長和機器數量相同。
例如臺機器,初始值為,初始值為,步長都為,則的號段為,的號段為。
同理,如果部署臺機器,則每臺的初始值依次為,,步長為,則整體架構如下
雪花算法
來源於,原理是生成一個大小的長整型。
如果分片鍵不設置值,則默認使用生成一個值。
先說說優點
生成能夠按照時間有序生成
算法生成的結果是一個大小的整數,換算為長整形為位
分布式系統內不會產生重複
原理
編號由四部分組成,從高位到低位從左到右分別是
符號位長度,等於。
時間戳長度,從零點開始的毫秒數,支持年。
工作進程編號長度,所以最多支持也就是個進程。
序列號自增編號長度,每毫秒從開始自增,支持也就是個編號。
可見,每個工作進程每毫秒可以產生最多個,則每秒可以產生個。
放一波代碼
時間偏移量,從年月日零點開始自增量佔用比特工作進程比特自增量掩碼最大值工作進程左移比特數位數時間戳左移比特數位數上一次的序列號,解決並發量小總是偶數的問題工作進程最後自增量最後生成編號時間戳,單位毫秒瀏覽工作進程編號生成的規則後,感覺對伺服器後位特別是數值比較約束。
有以下優化思路因為工作進程編號最大限制是,我們生成的工程進程編號只要滿足小於即可。
針對最大。
而。
因此採用段數值相加即可生成唯一的,不受位限制,。。。