mongodb怎么用,如何使用MongoDB+Springboot實現分布式ID?

 2023-11-19 阅读 29 评论 0

摘要:轉載請標明出處:http://blog.csdn.net/forezp/article/details/69056017 本文出自方志朋的博客 一、背景 如何實現分布式id,搜索相關的資料,一般會給出這幾種方案: 使用數據庫自增Id使用reids的incr命令使用UUIDTwitter的snowflake算法利用zooke

轉載請標明出處:
http://blog.csdn.net/forezp/article/details/69056017
本文出自方志朋的博客

一、背景

如何實現分布式id,搜索相關的資料,一般會給出這幾種方案:

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

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

二.mongodb如何實現分布式ID

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

它的格式:
mongo.png

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

  • 接下來的3 字節是所在主機的唯一標識符。通常是機器主機名的散列值。這樣就可以確保不同主機生成不同的ObjectId,不產生沖突。
    為了確保在同一臺機器上并發的多個進程產生的ObjectId 是唯一的,接下來的兩字節來自產生ObjectId 的進程標識符(PID)。

  • 前9 字節保證了同一秒鐘不同機器不同進程產生的ObjectId 是唯一的。

  • 后3 字節就是一個自動增加的計數器,確保相同進程同一秒產生的ObjectId 也是不一樣的。同一秒鐘最多允許每個進程擁有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>

創建一個實體類:

public class Customer {@Idpublic String id;public String firstName;public String lastName;public Customer() {}public Customer(String firstName, String lastName) {this.firstName = firstName;this.lastName = lastName;}@Overridepublic 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;}
}

springboot消息隊列,創建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);}

測試類:

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

SouthEast
掃碼關注公眾號有驚喜

(轉載本站文章請注明作者和出處 方志朋的博客)

轉載于:https://www.cnblogs.com/forezp/p/9852164.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/181780.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息