国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

掌握MySQL分庫分表(六)解決主鍵重復(fù)問題--Snowflake雪花算法

這篇具有很好參考價(jià)值的文章主要介紹了掌握MySQL分庫分表(六)解決主鍵重復(fù)問題--Snowflake雪花算法。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

問題及需求

單庫下?般使用Mysql自增ID,但是分庫分表后,會(huì)造成不同分片上的數(shù)據(jù)表主鍵會(huì)重復(fù)
需求:性能強(qiáng)勁、全局唯一、防止惡意用戶規(guī)矩id的規(guī)則來獲取數(shù)據(jù)

常用ID解決方案

數(shù)據(jù)庫自增ID

利用自增id, 設(shè)置不同的?增步長:auto_increment_offset、auto-increment-increment

DB1: 單數(shù)
//從1開始、每次加2
DB2: 偶數(shù)
//從2開始,每次加2

缺點(diǎn):

  1. 依靠數(shù)據(jù)庫系統(tǒng)的功能實(shí)現(xiàn),但是未來擴(kuò)容麻煩
  2. 主從切換時(shí)的不?致可能會(huì)導(dǎo)致重復(fù)發(fā)號
  3. 性能瓶頸存在單臺sql上

UUID

性能非常高,沒有網(wǎng)絡(luò)消耗

缺點(diǎn):

  1. 無序的字符串,不具備趨勢自增特性
  2. UUID太長,不易于存儲,浪費(fèi)存儲空間,很多場景不適用

Redis發(fā)號器

利用Redis的INCR和INCRBY來實(shí)現(xiàn),原子操作,線程安全,性能比Mysql強(qiáng)勁

缺點(diǎn):

  1. 需要占用網(wǎng)絡(luò)資源,增加系統(tǒng)復(fù)雜度

Snowflake雪花算法

  1. twitter 開源的分布式 ID生成算法,代碼實(shí)現(xiàn)簡單、不占用寬帶、數(shù)據(jù)遷移不受影響
  2. 生成的 id 中包含有時(shí)間戳,所以生成的 id按照時(shí)間遞增
  3. 部署了多臺服務(wù)器,需要保證系統(tǒng)時(shí)間?樣,機(jī)器編號不?樣

缺點(diǎn):

  1. 依賴系統(tǒng)時(shí)鐘(多臺服務(wù)器時(shí)間?定要?樣)

分布式 ID 生成算法Snowflake原理

關(guān)于bit與byte

bit(位):電腦中存儲的最小單位,可以存儲?進(jìn)制中的0或1
byte(字節(jié)):?個(gè)byte由8個(gè)bit組成
常規(guī)64位系統(tǒng)??java數(shù)據(jù)類型存儲字節(jié)大小

int:4 個(gè)字節(jié)
short:2 個(gè)字節(jié)
long:8 個(gè)字節(jié)
byte:1 個(gè)字節(jié)
float:4 個(gè)字節(jié)
double:8 個(gè)字節(jié)
char:2 個(gè)字節(jié)

科普:數(shù)據(jù)類型在不同位數(shù)機(jī)器的平臺下長度不同

16位平臺 int 2個(gè)字節(jié)16位
32位平臺 int 4個(gè)字節(jié)32位
64位平臺 int 4個(gè)字節(jié)32位

雪花算法的位數(shù)

雪花算法生成的數(shù)字,long類,所以是:8個(gè)byte,64bit
表示的值 -9223372036854775808(-2的63次方)~9223372036854775807(2的63次?-1)
生成的唯?值?于數(shù)據(jù)庫主鍵,不能是負(fù)數(shù),所以值為0~9223372036854775807(2的63次方-1)

  1. 第一個(gè)bit位代表符號位,正數(shù)是0,負(fù)數(shù)是1,ID為正數(shù),所以固定為0
  2. 毫秒級時(shí)間戳部分占41bit,不是存儲當(dāng)前時(shí)間的時(shí)間截,服務(wù)上線的時(shí)間毫秒級的時(shí)間戳(為當(dāng)前時(shí)間-服務(wù)第一次上線時(shí)間)
  3. 工作機(jī)器 id占10bit,可支持210 =1024個(gè)節(jié)點(diǎn)
  4. 序列號部分占12bit,可允許同一毫秒生成212 =4096個(gè)Id,則理論上一秒就可生成4096*1000 = 400萬個(gè)ld
  5. 組合起來剛好是64位,Long類型

Snowflake必須注意的地方

全局唯?、不能重復(fù)

分布式部署就需要分配不同的workId, 如果workId相同,
可能會(huì)導(dǎo)致?成的id相同

保證各個(gè)系統(tǒng)時(shí)間一致

分布式情況下,需要保證各個(gè)系統(tǒng)時(shí)間?致,如果服務(wù)器的時(shí)鐘回?fù)?,就?huì)導(dǎo)致?成的 id 重復(fù)

什么時(shí)候會(huì)系統(tǒng)回?fù)埽?/strong>

  1. 人工去生產(chǎn)環(huán)境做了系統(tǒng)時(shí)間調(diào)整
  2. 業(yè)務(wù)需求,代碼里面做了系統(tǒng)時(shí)間同步

Snowflake雪花算法實(shí)現(xiàn)

配置文件
增加:

#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1

方式一:訂單id使用MybatisPlus的配置,ProductOrder類配置

@TableId(value = "id", type = IdType.ASSIGN_ID)
默認(rèn)實(shí)現(xiàn)類為DefaultIdentifierGenerator雪花算法

方式二:使用Sharding-Jdbc配置文件,注釋DO類里面的id分配策略

#id?成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE

方式三 進(jìn)階:動(dòng)態(tài)指定sharding jdbc 的雪花算法中的屬性work.id屬性
使用sharding-jdbc中的使用IP后幾位來做workId,但在某些情況下會(huì)出現(xiàn)生成重復(fù)ID的情況
解決辦法: 在啟動(dòng)時(shí)給每個(gè)服務(wù)分配不同的workId, 引?redis/zk都行,缺點(diǎn)就是多了依賴

配置文件完整

spring.application.name=xdclass-sharding-jdbc
server.port=8080


# 打印執(zhí)行的數(shù)據(jù)庫以及語句
spring.shardingsphere.props.sql.show=true

# 數(shù)據(jù)源 db0
spring.shardingsphere.datasource.names=ds0,ds1

# 第一個(gè)數(shù)據(jù)庫
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://10.24.201.232:3306/xdclass_shop_order_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root


# 第二個(gè)數(shù)據(jù)庫
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://10.24.201.232:3306/xdclass_shop_order_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1



#id生成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE

# 指定product_order表的數(shù)據(jù)分布情況,配置數(shù)據(jù)節(jié)點(diǎn),行表達(dá)式標(biāo)識符使用 ${...} 或 $->{...},
# 但前者與 Spring 本身的文件占位符沖突,所以在 Spring 環(huán)境中建議使用 $->{...}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1}

# 指定product_order表的分片策略,分片策略包括【分片鍵和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{user_id % 2}

雪花算法測試結(jié)果

掌握MySQL分庫分表(六)解決主鍵重復(fù)問題--Snowflake雪花算法掌握MySQL分庫分表(六)解決主鍵重復(fù)問題--Snowflake雪花算法

可以看出id全局不重復(fù),并呈現(xiàn)出遞增增長文章來源地址http://www.zghlxwxcb.cn/news/detail-483961.html

到了這里,關(guān)于掌握MySQL分庫分表(六)解決主鍵重復(fù)問題--Snowflake雪花算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • mysql分庫分表相關(guān)

    3小時(shí)快速上手sharding-jdbc 百億級數(shù)據(jù) 分庫分表 后面怎么分頁查詢? Java實(shí)戰(zhàn):教你如何進(jìn)行數(shù)據(jù)庫分庫分表

    2024年02月12日
    瀏覽(23)
  • MySQL-分庫分表詳解(三)

    MySQL-分庫分表詳解(三)

    ?? 作者:小劉在C站 ?? 個(gè)人主頁: ?小劉主頁? ?? 努力不一定有回報(bào),但一定會(huì)有收獲加油!一起努力,共赴美好人生! ?? 學(xué)習(xí)兩年總結(jié)出的運(yùn)維經(jīng)驗(yàn),以及思科模擬器全套網(wǎng)絡(luò)實(shí)驗(yàn)教程。專欄: 云計(jì)算技術(shù) ??小劉私信可以隨便問,只要會(huì)絕不吝嗇,感謝CSD

    2024年02月12日
    瀏覽(44)
  • Mysql·分庫分表

    Mysql·分庫分表

    window環(huán)境下運(yùn)行的,實(shí)際生產(chǎn)推薦在Linux上運(yùn)行 使用前軟件環(huán)境搭建 下載安裝mysql:mysql-5.7.36-winx64 下載安裝jdk-8u251-windows-x64 下載安裝Mycat-server-1.3.0.3-release-20150527095523-win 在mysql中新建數(shù)據(jù)庫用以表分庫分表 mycat解壓后配置文件參數(shù) server.xml 主要配置mycat服務(wù)的參數(shù),比如端口

    2023年04月12日
    瀏覽(22)
  • mysql運(yùn)維------分庫分表

    mysql運(yùn)維------分庫分表

    隨著互聯(lián)網(wǎng)以及移動(dòng)互聯(lián)網(wǎng)的發(fā)展,應(yīng)用系統(tǒng)的數(shù)據(jù)量也是成指數(shù)式增長,若采用單數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲,存在以下性能瓶頸: IO瓶頸 :熱點(diǎn)數(shù)據(jù)太多,數(shù)據(jù)庫緩存不足,產(chǎn)生大量磁盤IO,效率較低。請求數(shù)據(jù)太多,帶寬不夠,網(wǎng)絡(luò)IO瓶頸。 CPU瓶頸 :排序、分組、連接查詢、

    2023年04月11日
    瀏覽(20)
  • Mysql的分庫分表策略

    Mysql的分庫分表策略

    水平切分又稱為 Sharding 策略 ,它是將同一個(gè)表中的記錄拆分到多個(gè)結(jié)構(gòu)相同的表中。 當(dāng)一個(gè)表的數(shù)據(jù)不斷增多時(shí),Sharding 是必然的選擇,它可以將數(shù)據(jù)分布到集群的不同節(jié)點(diǎn)上,從而緩存單個(gè)數(shù)據(jù)庫的壓力。 Sharding 策略 哈希取模: hash(key) % NUM_DB 范圍: 可以是 ID 范圍也可以

    2024年02月16日
    瀏覽(23)
  • MYSQL 分庫分表

    MYSQL 分庫分表

    公司現(xiàn)有業(yè)務(wù)不斷發(fā)展,流量劇增,交易數(shù)量突破了千萬訂單,但是訂單數(shù)據(jù)還是單表存儲,主從分離后,雖然減少了緩解讀請求的壓力,但隨著寫入壓力增加,數(shù)據(jù)庫的查詢和寫入性能都在下降,這時(shí)你要怎么設(shè)計(jì)架構(gòu)? 首先不能考慮主從分離了 因?yàn)樗呀?jīng)說了 目前數(shù)據(jù)

    2024年02月15日
    瀏覽(16)
  • MySQL分庫分表

    MySQL分庫分表

    ? ? ? ? 主要解決兩個(gè)瓶頸: IO瓶頸 CPU瓶頸 ???????? 垂直分庫 :將一個(gè)數(shù)據(jù)庫的表拆分到不同的數(shù)據(jù)庫中,例如:A庫有user表和sku表,將這兩個(gè)表分別拆分到B庫和C庫,每個(gè)數(shù)據(jù)庫的表和數(shù)據(jù)都不一樣,所有數(shù)據(jù)庫一起組成了整個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)。 水平分庫 :將一個(gè)數(shù)

    2024年01月15日
    瀏覽(20)
  • MySQL-分庫分表詳解(二)

    MySQL-分庫分表詳解(二)

    ?? 作者:小劉在C站 ?? 個(gè)人主頁: ?小劉主頁? ?? 努力不一定有回報(bào),但一定會(huì)有收獲加油!一起努力,共赴美好人生! ?? 學(xué)習(xí)兩年總結(jié)出的運(yùn)維經(jīng)驗(yàn),以及思科模擬器全套網(wǎng)絡(luò)實(shí)驗(yàn)教程。專欄: 云計(jì)算技術(shù) ??小劉私信可以隨便問,只要會(huì)絕不吝嗇,感謝CSD

    2024年02月16日
    瀏覽(47)
  • mysql 分庫分表實(shí)現(xiàn)思路

    MySQL的分庫分表是一種常用的數(shù)據(jù)庫拆分方案,它可以提高數(shù)據(jù)庫的性能和擴(kuò)展性。下面是一般的實(shí)現(xiàn)步驟: 數(shù)據(jù)庫設(shè)計(jì):首先,需要對數(shù)據(jù)庫進(jìn)行良好的設(shè)計(jì)。確定要分庫分表的實(shí)體和關(guān)系,并根據(jù)業(yè)務(wù)需求進(jìn)行合理的拆分。 數(shù)據(jù)切分策略:根據(jù)具體業(yè)務(wù)需求,選擇適當(dāng)?shù)?/p>

    2024年02月10日
    瀏覽(25)
  • MySQL-分庫分表詳解(七)

    MySQL-分庫分表詳解(七)

    ?? 作者:小劉在C站 ?? 個(gè)人主頁: ?小劉主頁? ?? 努力不一定有回報(bào),但一定會(huì)有收獲加油!一起努力,共赴美好人生! ?? 學(xué)習(xí)兩年總結(jié)出的運(yùn)維經(jīng)驗(yàn),以及思科模擬器全套網(wǎng)絡(luò)實(shí)驗(yàn)教程。專欄: 云計(jì)算技術(shù) ??小劉私信可以隨便問,只要會(huì)絕不吝嗇,感謝CSD

    2024年02月16日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包