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

詳解如何使用MongoDB+Springboot實(shí)現(xiàn)分布式ID的方法

 更新時(shí)間:2019年09月12日 10:28:19   作者:方志朋  
這篇文章主要介紹了詳解如何使用MongoDB+Springboot實(shí)現(xiàn)分布式ID的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、背景

如何實(shí)現(xiàn)分布式id,搜索相關(guān)的資料,一般會(huì)給出這幾種方案:

  • 使用數(shù)據(jù)庫(kù)自增Id
  • 使用reids的incr命令
  • 使用UUID
  • Twitter的snowflake算法
  • 利用zookeeper生成唯一ID
  • MongoDB的ObjectId

另外,在我通過爬取知乎用戶id發(fā)現(xiàn),知乎的用戶id是32位的,初步斷定知乎采用的是md5加密,然后全部轉(zhuǎn)換成小寫。至于如何爬取知乎用戶信息,見我之前分享的文章。本文采取的技術(shù)方案采取的是mogoodb的objectId。

二.mongodb如何實(shí)現(xiàn)分布式ID

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

它的格式:

前4 個(gè)字節(jié)是從標(biāo)準(zhǔn)紀(jì)元開始的時(shí)間戳,單位為秒。時(shí)間戳,與隨后的5 個(gè)字節(jié)組合起來,提供了秒級(jí)別的唯一性。由于時(shí)間戳在前,這意味著ObjectId 大致會(huì)按照插入的順序排列。這對(duì)于某些方面很有用,如將其作為索引提高效率。這4 個(gè)字節(jié)也隱含了文檔創(chuàng)建的時(shí)間。絕大多數(shù)客戶端類庫(kù)都會(huì)公開一個(gè)方法從ObjectId 獲取這個(gè)信息。

接下來的3 字節(jié)是所在主機(jī)的唯一標(biāo)識(shí)符。通常是機(jī)器主機(jī)名的散列值。這樣就可以確保不同主機(jī)生成不同的ObjectId,不產(chǎn)生沖突。

為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的ObjectId 是唯一的,接下來的兩字節(jié)來自產(chǎn)生ObjectId 的進(jìn)程標(biāo)識(shí)符(PID)。

前9 字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的ObjectId 是唯一的。

后3 字節(jié)就是一個(gè)自動(dòng)增加的計(jì)數(shù)器,確保相同進(jìn)程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個(gè)進(jìn)程擁有2563(16 777 216)個(gè)不同的ObjectId。

三、編碼

在springboot中引入mongodb:

  <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
 </dependency>

 <!-- 開啟web-->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 

    <!--mongodb -->
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

創(chuàng)建一個(gè)實(shí)體類:

public class Customer {

  @Id
  public String id;

  public String firstName;
  public String lastName;

  public Customer() {}

  public Customer(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @Override
  public String toString() {
    return String.format(
        "Customer[id=%s, firstName='%s', lastName='%s']",
        id, firstName, lastName);
  }


  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
}

創(chuàng)建mongodb 接口類:

/**
 * Created by fangzhipeng on 2017/4/1.
 */


public interface CustomerRepository extends MongoRepository<Customer, String> {

  public Customer findByFirstName(String firstName);
  public List<Customer> findByLastName(String lastName);

}

測(cè)試類:

 @Autowired
  CustomerRepository customerRepository;


@Test
public void mongodbIdTest(){
Customer customer=new Customer("lxdxil","dd");
    customer=customerRepository.save(customer);
    logger.info( "mongodbId:"+customer.getId());
}

四、參考資料

Accessing Data with MongoDB

MongoDB深究之ObjectId

MongoDB 教程

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java下http下載文件客戶端和上傳文件客戶端實(shí)例代碼

    Java下http下載文件客戶端和上傳文件客戶端實(shí)例代碼

    這篇文章主要介紹了Java下http下載文件客戶端和上傳文件客戶端實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Java中的static關(guān)鍵字你了解多少

    Java中的static關(guān)鍵字你了解多少

    這篇文章主要為大家詳細(xì)介紹了Java中的static關(guān)鍵字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Mybatis 動(dòng)態(tài)SQL搭建環(huán)境的全過程

    Mybatis 動(dòng)態(tài)SQL搭建環(huán)境的全過程

    這篇文章主要給大家介紹了關(guān)于Mybatis動(dòng)態(tài)SQL搭建環(huán)境的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式)

    SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式)

    這篇文章主要介紹了SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 使用Logback設(shè)置property參數(shù)方式

    使用Logback設(shè)置property參數(shù)方式

    這篇文章主要介紹了使用Logback設(shè)置property參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 二叉樹遞歸迭代及morris層序前中后序遍歷詳解

    二叉樹遞歸迭代及morris層序前中后序遍歷詳解

    這篇文章主要為大家介紹了二叉樹遞歸迭代詳解及二叉樹的morris遍歷、層序遍歷、前序遍歷、中序遍歷、后序遍歷示例分析,有需要的朋友可以借鑒參考下
    2021-11-11
  • SpringBoot的Security和OAuth2的使用示例小結(jié)

    SpringBoot的Security和OAuth2的使用示例小結(jié)

    這篇文章主要介紹了SpringBoot的Security和OAuth2的使用,本文通過示例圖文相結(jié)合給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • idea全局搜索快捷鍵超詳細(xì)總結(jié)(推薦!)

    idea全局搜索快捷鍵超詳細(xì)總結(jié)(推薦!)

    在實(shí)際開發(fā)中項(xiàng)目會(huì)非常多,如何在項(xiàng)目中快速定位,你說需要找到的類或方法,可以利用idea的全局搜索功能,下面這篇文章主要給大家分享介紹了關(guān)于idea全局搜索快捷鍵超詳細(xì)總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • java selenium教程之selenium詳細(xì)介紹

    java selenium教程之selenium詳細(xì)介紹

    本文主要介紹Java selenium,這里整理了selenium的一些基本資料,此軟件主要用于Web UI自動(dòng)測(cè)試框架,有興趣的同學(xué)可以看一下
    2016-08-08
  • Java的反射機(jī)制之獲取class詳解

    Java的反射機(jī)制之獲取class詳解

    這篇文章主要介紹了Java的反射機(jī)制之獲取class詳解,Class類表示一個(gè)類或接口的元數(shù)據(jù),通過它可以獲取到類或接口的構(gòu)造函數(shù)、方法、字段、注解等信息,也能夠創(chuàng)建對(duì)象、調(diào)用方法等,需要的朋友可以參考下
    2023-09-09

最新評(píng)論