91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣使用MongoDB+Springboot實現分布式ID

發布時間:2021-02-02 15:09:41 來源:億速云 閱讀:249 作者:小新 欄目:編程語言

這篇文章主要介紹了怎樣使用MongoDB+Springboot實現分布式ID,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、背景

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

  • 使用數據庫自增Id

  • 使用reids的incr命令

  • 使用UUID

  • Twitter的snowflake算法

  • 利用zookeeper生成唯一ID

  • MongoDB的ObjectId

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

二.mongodb如何實現分布式ID

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

它的格式:

怎樣使用MongoDB+Springboot實現分布式ID

前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 {

  @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;
  }
}

創建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());
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“怎樣使用MongoDB+Springboot實現分布式ID”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

抚远县| 宝兴县| 浏阳市| 合江县| 太仓市| 克什克腾旗| 遵义市| 乌拉特中旗| 芷江| 江达县| 临桂县| 牙克石市| 通江县| 黑龙江省| 礼泉县| 珲春市| 体育| 富蕴县| 天镇县| 安化县| 大方县| 开阳县| 洪雅县| 吉木乃县| 中超| 平武县| 平阴县| 江源县| 临江市| 商洛市| 左贡县| 休宁县| 临汾市| 筠连县| 桐乡市| 开远市| 永泰县| 合阳县| 龙胜| 盈江县| 乌拉特后旗|