最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、背景

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

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

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

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

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

它的格式:

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

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

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

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

后3 字節(jié)就是一個自動增加的計數(shù)器,確保相同進(jìn)程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個進(jìn)程擁有2563(16 777 216)個不同的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)建一個實體類:

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);

}

測試類:

 @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 教程

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

相關(guān)文章

  • maven如何打包動態(tài)環(huán)境變量(包括啟動腳本)

    maven如何打包動態(tài)環(huán)境變量(包括啟動腳本)

    這篇文章主要介紹了maven如何打包動態(tài)環(huán)境變量(包括啟動腳本)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • mybatis解決<foreach>標(biāo)簽不能超過1000的問題

    mybatis解決<foreach>標(biāo)簽不能超過1000的問題

    MyBatis是一個開源的持久層框架,它可以幫助開發(fā)者簡化數(shù)據(jù)庫操作的編寫,而foreach是MyBatis中的一個重要標(biāo)簽,用于在SQL語句中進(jìn)行循環(huán)操作,本文主要給大家介紹了mybatis解決<foreach>標(biāo)簽不能超過1000的問題,需要的朋友可以參考下
    2024-05-05
  • 使用java對一副撲克牌建模

    使用java對一副撲克牌建模

    這篇文章主要為大家詳細(xì)介紹了如何使用java對一副撲克牌建模,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • springboot集成spark并使用spark-sql的示例詳解

    springboot集成spark并使用spark-sql的示例詳解

    這篇文章主要介紹了spring-boot集成spark并使用spark-sql的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 帶你快速搞定java IO

    帶你快速搞定java IO

    這篇文章主要介紹了Java IO流 文件傳輸基礎(chǔ)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-07-07
  • SpringBoot整合MyBatis四種常用的分頁方式(詳細(xì)總結(jié))

    SpringBoot整合MyBatis四種常用的分頁方式(詳細(xì)總結(jié))

    這篇文章詳細(xì)給大家總結(jié)了SpringBoot整合MyBatis四種常用的分頁方式,文中通過代碼示例為大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • springboot2.x解決運行順序及Bean對象注入順序的問題

    springboot2.x解決運行順序及Bean對象注入順序的問題

    這篇文章主要介紹了springboot2.x解決運行順序及Bean對象注入順序的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java代碼編譯和反編譯的那些事兒

    Java代碼編譯和反編譯的那些事兒

    這篇文章主要給大家介紹了關(guān)于Java代碼編譯和反編譯的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • SpringMVC中的DispatcherServlet初始化流程詳解

    SpringMVC中的DispatcherServlet初始化流程詳解

    這篇文章主要介紹了SpringMVC中的DispatcherServlet初始化流程詳解,DispatcherServlet這個前端控制器是一個Servlet,所以生命周期和普通的Servlet是差不多的,在一個Servlet初始化的時候都會調(diào)用該Servlet的init()方法,需要的朋友可以參考下
    2023-12-12

最新評論

虞城县| 长沙县| 石河子市| 涟水县| 安徽省| 玛多县| 志丹县| 定结县| 尉氏县| 塔城市| 云浮市| 新营市| 古浪县| 光泽县| 白银市| 新绛县| 商河县| 肇州县| 泾阳县| 南和县| 崇仁县| 罗平县| 棋牌| 南宫市| 新泰市| 赫章县| 石林| 康平县| 东光县| 平舆县| 昌黎县| 轮台县| 绵阳市| 曲阜市| 黄大仙区| 庆阳市| 宁国市| 台东县| 无锡市| 天全县| 密云县|