欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis-plus主鍵生成策略

 更新時間:2020年08月27日 10:38:40   作者:愛瑪999  
這篇文章主要介紹了mybatis-plus主鍵生成策略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

MP 支持多種主鍵策略 默認(rèn)是推特的“” 雪花算法“” ,也可以設(shè)置其他策略下面我演示主鍵策略使用

MP的主鍵定義在一個一個枚舉類中 源碼如下

public enum IdType {
  AUTO(0),//數(shù)據(jù)庫自增 依賴數(shù)據(jù)庫
  NONE(1),// 表示該類型未甚至主鍵類型 (如果沒有主鍵策略)默認(rèn)根據(jù)雪花算法生成
  INPUT(2),//用戶輸入ID(該類型可以通過自己注冊填充插件進(jìn)行填充)
  //下面這三種類型,只有當(dāng)插入對象id為空時 才會自動填充。
  ID_WORKER(3),//全局唯一(idWorker)數(shù)值類型
  UUID(4),//全局唯一(UUID)
  ID_WORKER_STR(5);//全局唯一(idWorker的字符串表示)

  private final int key;

  private IdType(int key) {
    this.key = key;
  }

  public int getKey() {
    return this.key;
  }
}

1,局部主鍵策略實現(xiàn)

在實體類中 ID屬性加注解

@TableId(type = IdType.AUTO) 主鍵自增 數(shù)據(jù)庫中需要設(shè)置主鍵自增
private Long id;
@TableId(type = IdType.NONE) 默認(rèn) 跟隨全局策略走
private Long id;
@TableId(type = IdType.UUID) UUID類型主鍵
private Long id;
@TableId(type = IdType.ID_WORKER) 數(shù)值類型 數(shù)據(jù)庫中也必須是數(shù)值類型 否則會報錯
private Long id;
@TableId(type = IdType.ID_WORKER_STR) 字符串類型  數(shù)據(jù)庫也要保證一樣字符類型
private Long id;
@TableId(type = IdType.INPUT) 用戶自定義了 數(shù)據(jù)類型和數(shù)據(jù)庫保持一致就行
private Long id;

2,全局主鍵策略實現(xiàn)

 需要在application.yml文件中

添加

mybatis-plus:
 mapper-locations:
  - com/mp/mapper/*
 global-config:
  db-config:
   id-type: uuid/none/input/id_worker/id_worker_str/auto  表示全局主鍵都采用該策略(如果全局策略和局部策略都有設(shè)置,局部策略優(yōu)先級高)

  Mybatis-Plus中另外的幾種主鍵生成策略

 1、分布式系統(tǒng)中主鍵的生成策略

​ 在分布式系統(tǒng)中,常見的主鍵生成策略有以下幾種:

1.1 數(shù)據(jù)庫自增長序列或字段

​ 最常見的方式。利用數(shù)據(jù)庫,全數(shù)據(jù)庫唯一。

​ 優(yōu)點:

​ 1)簡單,代碼方便,性能可以接受。

​ 2)數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助。

​ 缺點:

​ 1)不同數(shù)據(jù)庫語法和實現(xiàn)不同,數(shù)據(jù)庫遷移的時候或多數(shù)據(jù)庫版本支持的時候需要處理。

​ 2)在單個數(shù)據(jù)庫或讀寫分離或一主多從的情況下,只有一個主庫可以生成。有單點故障的風(fēng)險。

​ 3)在性能達(dá)不到要求的情況下,比較難于擴(kuò)展。

​ 4)如果遇見多個系統(tǒng)需要合并或者涉及到數(shù)據(jù)遷移會相當(dāng)痛苦。

​ 5)分表分庫的時候會有麻煩。

​ 優(yōu)化方案:

​ 針對主庫單點,如果有多個Master庫,則每個Master庫設(shè)置的起始數(shù)字不一樣,步長一樣,可以是Master的個數(shù)。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。這樣就可以有效生成集群中的唯一ID,也可以大大降低ID生成數(shù)據(jù)庫操作的負(fù)載。類似于Redis的生成策略

1.2 UUID

​ 常見的方式??梢岳脭?shù)據(jù)庫也可以利用程序生成,一般來說全球唯一。

​ 優(yōu)點:

​ 1)簡單,代碼方便。

​ 2)生成ID性能非常好,基本不會有性能問題。

​ 3)全球唯一,在遇見數(shù)據(jù)遷移,系統(tǒng)數(shù)據(jù)合并,或者數(shù)據(jù)庫變更等情況下,可以從容應(yīng)對。

 缺點:

​ 1)沒有排序,無法保證趨勢遞增。

​ 2)UUID往往是使用字符串存儲,查詢的效率比較低。

​ 3)存儲空間比較大,如果是海量數(shù)據(jù)庫,就需要考慮存儲量的問題。

​ 4)傳輸數(shù)據(jù)量大

​ 5)可讀性差

1.3 UUID to Int64

​ UUID的變種:解決了UUID可讀性差和無序的問題

1.4 Redis生成ID

​ 當(dāng)使用數(shù)據(jù)庫來生成ID性能不夠要求的時候,我們可以嘗試使用Redis來生成ID。這主要依賴于Redis是單線程的,所以也可以用生成全局唯一的ID??梢杂肦edis的原子操作 INCR和INCRBY來實現(xiàn)。

​ 可以使用Redis集群來獲取更高的吞吐量。假如一個集群中有5臺Redis??梢猿跏蓟颗_Redis的值分別是1,2,3,4,5,然后步長都是5。各個Redis生成的ID為:

​ A:1,6,11,16,21

​ B:2,7,12,17,22

​ C:3,8,13,18,23

​ D:4,9,14,19,24

​ E:5,10,15,20,25

​ 這個,隨便負(fù)載到哪個機(jī)確定好,未來很難做修改。但是3-5臺服務(wù)器基本能夠滿足器上,都可以獲得不同的ID。但是步長和初始值一定需要事先需要了。使用Redis集群也可以方式單點故障的問題。

​ 另外,比較適合使用Redis來生成每天從0開始的流水號。比如訂單號=日期+當(dāng)日自增長號。可以每天在Redis中生成一個Key,使用INCR進(jìn)行累加。

​ 優(yōu)點:

​ 1)不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

​ 2)數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助。

​ 缺點:

​ 1)如果系統(tǒng)中沒有Redis,還需要引入新的組件,增加系統(tǒng)復(fù)雜度。

​ 2)需要編碼和配置的工作量比較大。

1.5 Twitter的snowflake算法 (雪花算法)

​ snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個long型的ID。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個bit是數(shù)據(jù)中心,5個bit的機(jī)器ID),12bit作為毫秒內(nèi)的流水號(意味著每個節(jié)點在每毫秒可以產(chǎn)生 4096 個 ID),最后還有一個符號位,永遠(yuǎn)是0。具體實現(xiàn)的代碼可以參看https://github.com/twitter/snowflake。

​ snowflake算法可以根據(jù)自身項目的需要進(jìn)行一定的修改。比如估算未來的數(shù)據(jù)中心個數(shù),每個數(shù)據(jù)中心的機(jī)器數(shù)以及統(tǒng)一毫秒可以能的并發(fā)數(shù)來調(diào)整在算法中所需要的bit數(shù)。

​ 優(yōu)點:

​ 1)不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

​ 2)ID按照時間在單機(jī)上是遞增的。

​ 缺點:

​ 1)在單機(jī)上是遞增的,但是由于涉及到分布式環(huán)境,每臺機(jī)器上的時鐘不可能完全同步,也許有時候也會出現(xiàn)不是全局遞增的情況。

​ MP中的ID_WORKER就是使用的這種算法

1.6 zookeeper生成唯一ID

​ zookeeper主要通過其znode數(shù)據(jù)版本來生成序列號,可以生成32位和64位的數(shù)據(jù)版本號,客戶端可以使用這個版本號來作為唯一的序列號。
​ 很少會使用zookeeper來生成唯一ID。主要是由于需要依賴zookeeper,并且是多步調(diào)用API,如果在競爭較大的情況下,需要考慮使用分布式鎖。因此,性能在高并發(fā)的分布式環(huán)境下,也不甚理想。

1.7 MongoDB的ObjectId

​ MongoDB的ObjectId和snowflake算法類似。它設(shè)計成輕量型的,不同的機(jī)器都能用全局唯一的同種方法方便地生成它。MongoDB 從一開始就設(shè)計用來作為分布式數(shù)據(jù)庫,處理多個節(jié)點是一個核心要求。使其在分片環(huán)境中要容易生成得多。

到此這篇關(guān)于mybatis-plus主鍵生成策略的文章就介紹到這了,更多相關(guān)mybatis-plus 主鍵內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java方法參數(shù)傳遞機(jī)制原理解析

    Java方法參數(shù)傳遞機(jī)制原理解析

    這篇文章主要介紹了Java方法參數(shù)傳遞機(jī)制原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Maven中dependency和plugins的繼承與約束

    Maven中dependency和plugins的繼承與約束

    這篇文章主要介紹了Maven中dependency和plugins的繼承與約束,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • idea插件之mybatis log plugin控制臺sql的問題

    idea插件之mybatis log plugin控制臺sql的問題

    這篇文章主要介紹了idea插件之mybatis log plugin控制臺sql,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • springboot中使用Hibernate-Validation校驗參數(shù)詳解

    springboot中使用Hibernate-Validation校驗參數(shù)詳解

    這篇文章主要為大家介紹了springboot中使用Hibernate-Validation校驗參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java基于IO流讀取文件的方法

    Java基于IO流讀取文件的方法

    這篇文章主要介紹了Java基于IO流讀取文件的方法,涉及Java文件流操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 舉例講解設(shè)計模式中的訪問者模式在Java編程中的運(yùn)用

    舉例講解設(shè)計模式中的訪問者模式在Java編程中的運(yùn)用

    這篇文章主要介紹了舉例講解設(shè)計模式中的訪問者模式在Java編程中的運(yùn)用,訪問者模式是一種將算法與對象結(jié)構(gòu)分離的軟件設(shè)計模式,需要的朋友可以參考下
    2016-05-05
  • 淺談Java中spring 線程異步執(zhí)行

    淺談Java中spring 線程異步執(zhí)行

    這篇文章主要介紹了淺談spring 線程異步執(zhí)行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot整合Retry的詳細(xì)指南

    SpringBoot整合Retry的詳細(xì)指南

    在現(xiàn)代的分布式系統(tǒng)中,服務(wù)間的調(diào)用往往需要處理各種網(wǎng)絡(luò)異常、超時等問題,重試機(jī)制是一種常見的解決策略,本文將通過一個具體的使用場景來詳細(xì)介紹如何在 Spring Boot 應(yīng)用中集成和使用 Spring Retry 技術(shù),需要的朋友可以參考下
    2024-12-12
  • Java實現(xiàn)批量下載文件的示例代碼

    Java實現(xiàn)批量下載文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java如何實現(xiàn)批量下載文件,并以壓縮輸出流的形式返回前端,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-10-10
  • java中接口(interface)及使用方法示例

    java中接口(interface)及使用方法示例

    這篇文章主要介紹了java中接口(interface)及使用方法示例,涉及接口定義的簡單介紹以及Java語言代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11

最新評論