資料庫方式實現方案?有什麼缺陷?

千鋒IT教育發表於2023-01-13

MySQL為例

我們將分散式系統中資料庫的同一個業務表的自增ID設計成不-樣的起始值,然後設定固定的步長,步長的值即為分庫的數量或分表的數量。

以MySQL舉例,利用給欄位設定auto_ _increment _increment和auto_ _increment _ffset來保證ID自增。

auto_ increment_ offset: 表示自增長欄位從那個數開始,他的取值範圍是1 .. 65535。
auto_ increment_ increment: 表示自增長欄位每次遞增的量,其預設值是1,取值範圍是1 .. 65535。

缺點也很明顯,首先它強依賴DB,當DB異常時整個系統不用。雖然配置主從複製可以儘可能的增加可用性,但是資料一致性在特殊情況下難以保證。主從切換時的不一致可能會導致重複發號。還有就是ID發號效能瓶頸限制在單臺MySQL的讀寫效能。

使用redis實現

Redis實現分散式唯一ID主要是透過提供像INCR和INCRBY這樣的自增原子命令,由於Redis自 身的單執行緒的特點所以能保證生成的ID肯定是唯一有序的。

但是單機存在效能瓶頸,無法滿足高併發的業務需求,所以可以採用叢集的方式來實現。叢集的方式又會涉及到和資料庫叢集同樣的問題,所以也需要設定分段和步長來實現。

為了避免長期自增後數字過大可以透過與當前時間戳組合起來使用,另外為了保證併發和業務多執行緒的問題可以採用Redis + Lua的方式進行編碼,保證安全。

Redis實現分散式全域性唯- -ID, 它的效能比較高,生成的資料是有序的,對排序業務有利,但是同樣它依賴於redis,需要系統引|進redis元件,增加了系統的配置複雜性。

當然現在Redis的使用性很普遍,所以如果其他業務已經引|進了Redis叢集,則可以資源利用考慮使用Redis來實現。

零基礎學ITwap.mobiletrain.org/ljc/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023145/viewspace-2932158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章