springBoot中雪花算術法

在 Spring Boot 中,雪花算法(Snowflake Algorithm)通常指的是 Twitter 開發的一種分布式唯一 ID 生成算法。它被廣泛用于分布式系統中生成全局唯一的 ID,尤其是在高并發場景下。雪花算法生成的 ID 是一個 64 位的長整型數字,具有時間有序性和唯一性。

雖然 Spring Boot 本身沒有直接內置雪花算法的實現,但你可以通過自定義代碼或引入第三方庫來實現它。下面我將解釋雪花算法的原理,并提供一個在 Spring Boot 中實現的示例。

---

### 雪花算法原理
雪花算法生成的 64 位 ID 由以下部分組成:
1. **1 位符號位**:通常為 0,表示正數。
2. **41 位時間戳**:表示毫秒級時間戳,通常是當前時間與某個起始時間(epoch)的差值,可支持約 69 年的時間范圍。
3. **10 位機器 ID**:表示機器或進程的標識,支持 1024 個節點。
4. **12 位序列號**:每毫秒內的自增序列號,支持每毫秒生成 4096 個 ID。

生成的 ID 結構如下:
```
0 | 41-bit timestamp | 10-bit worker ID | 12-bit sequence
```

優點:
- 高性能、高并發下仍能保證唯一性。
- ID 是時間有序的,便于排序和存儲。
- 不依賴數據庫等外部系統。

---

### 在 Spring Boot 中實現雪花算法
以下是一個簡單的雪花算法實現示例,你可以將其集成到 Spring Boot 項目中。

#### 1. 創建雪花算法工具類
```java
public class SnowflakeIdGenerator {
? ? // 起始時間戳 (例如 2023-01-01 00:00:00)
? ? private static final long START_TIMESTAMP = 1672531200000L;

? ? // 各部分位數
? ? private static final long WORKER_ID_BITS = 10L; // 機器 ID 占 10 位
? ? private static final long SEQUENCE_BITS = 12L; ?// 序列號占 12 位

? ? // 最大值
? ? private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); // 1023
? ? private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS); ? // 4095

? ? // 位移量
? ? private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
? ? private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;

? ? private long workerId; ? ?// 機器 ID
? ? private long sequence = 0L; // 序列號
? ? private long lastTimestamp = -1L; // 上次生成 ID 的時間戳

? ? public SnowflakeIdGenerator(long workerId) {
? ? ? ? if (workerId > MAX_WORKER_ID || workerId < 0) {
? ? ? ? ? ? throw new IllegalArgumentException("Worker ID must be between 0 and " + MAX_WORKER_ID);
? ? ? ? }
? ? ? ? this.workerId = workerId;
? ? }

? ? // 生成下一個 ID
? ? public synchronized long nextId() {
? ? ? ? long currentTimestamp = System.currentTimeMillis();

? ? ? ? // 時鐘回撥檢查
? ? ? ? if (currentTimestamp < lastTimestamp) {
? ? ? ? ? ? throw new RuntimeException("Clock moved backwards. Refusing to generate ID.");
? ? ? ? }

? ? ? ? // 如果是同一毫秒內,序列號自增
? ? ? ? if (currentTimestamp == lastTimestamp) {
? ? ? ? ? ? sequence = (sequence + 1) & MAX_SEQUENCE;
? ? ? ? ? ? // 序列號溢出,等待下一毫秒
? ? ? ? ? ? if (sequence == 0) {
? ? ? ? ? ? ? ? currentTimestamp = waitNextMillis(currentTimestamp);
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? sequence = 0L; // 新毫秒,序列號重置
? ? ? ? }

? ? ? ? lastTimestamp = currentTimestamp;

? ? ? ? // 組合 ID
? ? ? ? return ((currentTimestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) |
? ? ? ? ? ? ? ?(workerId << WORKER_ID_SHIFT) |
? ? ? ? ? ? ? ?sequence;
? ? }

? ? // 等待下一毫秒
? ? private long waitNextMillis(long currentTimestamp) {
? ? ? ? long timestamp = System.currentTimeMillis();
? ? ? ? while (timestamp <= currentTimestamp) {
? ? ? ? ? ? timestamp = System.currentTimeMillis();
? ? ? ? }
? ? ? ? return timestamp;
? ? }
}
```

#### 2. 在 Spring Boot 中使用
將上述工具類注入到 Spring Boot 的服務中,例如:

```java
import org.springframework.stereotype.Service;

@Service
public class IdGeneratorService {
? ? private final SnowflakeIdGenerator idGenerator;

? ? public IdGeneratorService() {
? ? ? ? // 假設 workerId 為 1,可以通過配置動態設置
? ? ? ? this.idGenerator = new SnowflakeIdGenerator(1L);
? ? }

? ? public long generateId() {
? ? ? ? return idGenerator.nextId();
? ? }
}
```

#### 3. 調用示例
在 Controller 中調用服務生成 ID:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IdController {
? ? @Autowired
? ? private IdGeneratorService idGeneratorService;

? ? @GetMapping("/generate-id")
? ? public long generateId() {
? ? ? ? return idGeneratorService.generateId();
? ? }
}
```

#### 4. 配置 workerId
在分布式系統中,`workerId` 需要唯一,可以通過配置文件或機器標識動態分配。例如,使用 Spring Boot 的 `application.properties`:

```properties
snowflake.worker-id=1
```

然后在服務中讀取:

```java
@Service
public class IdGeneratorService {
? ? private final SnowflakeIdGenerator idGenerator;

? ? @Autowired
? ? public IdGeneratorService(@Value("${snowflake.worker-id}") long workerId) {
? ? ? ? this.idGenerator = new SnowflakeIdGenerator(workerId);
? ? }

? ? public long generateId() {
? ? ? ? return idGenerator.nextId();
? ? }
}
```

---

### 使用第三方庫
如果你不想自己實現雪花算法,可以使用現成的庫,例如:
- **Hutool**:一個流行的 Java 工具庫,內置了雪花算法實現。
? ```xml
? <dependency>
? ? ? <groupId>cn.hutool</groupId>
? ? ? <artifactId>hutool-all</artifactId>
? ? ? <version>5.8.11</version>
? </dependency>
? ```
? 使用示例:
? ```java
? import cn.hutool.core.lang.Snowflake;

? Snowflake snowflake = new Snowflake(1, 1); // workerId, dataCenterId
? long id = snowflake.nextId();
? ```

- **MyBatis-Plus**:如果你的項目使用 MyBatis-Plus,它也提供了雪花算法的支持。

---

### 注意事項
1. **時鐘回撥問題**:如果服務器時間被調整,可能導致 ID 重復。需要在代碼中處理時鐘回撥。
2. **機器 ID 分配**:在分布式環境中,確保每個節點的 `workerId` 唯一。
3. **性能**:雪花算法適合高并發場景,但序列號耗盡后需等待下一毫秒。

希望這個解答對你有幫助!如果需要更詳細的代碼或優化建議,請告訴我。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74694.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙開發之ArkTS聯合類型

在鴻蒙開發中&#xff0c;ArkTS是一種基于TypeScript的編程語言&#xff0c;專為鴻蒙應用開發而設計。聯合類型&#xff08;Union Types&#xff09;在ArkTS中是一個重要的概念&#xff0c;它允許一個變量存儲多種類型的數據&#xff0c;從而增加了代碼的靈活性&#xff0c;同時…

K8S學習之基礎五十五:k8s中jenkins部署blueOcean

jenkins部署blueOcean 安裝插件 BLUE OCEAN 之后會多出一個菜單&#xff0c;可以更詳細方便的查看pipeline流程

DeepSeek概述

一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家專注 通用人工智能&#xff08;AGI&#xff0c;Artificial General Intelligence&#xff09;的中國科技公司&#xff0c;主攻大數據研發與應用。DeepSeek-R1是其開源的推理模型&#xff0c;擅長處理復雜任務且可免費商用…

學習記錄(14):iOS部署

時隔多年后&#xff0c;再次部署開發iOS&#x1f601;&#x1f601; 1. Unity端設置&#xff0c;在此不再進行贅述&#xff08;網上一大堆&#xff09; 2. ??&#xff1a;要保證mac比待部署的設備版本要高 3. Xcode: (1) 打開從 Unity 3D 里打包的文件中&#xff0c;找到有…

如何使用DeepSeek編寫測試用例?

一、DeepSeek在測試用例設計中的定位 DeepSeek作為AI工具,并非直接替代測試設計,而是通過以下方式提升效率: 快速生成基礎用例框架(等價類、邊界值等) 智能補充易遺漏場景(如特殊字符、異常流) 自動化腳本片段生成(Python/pytest/JUnit等) 測試數據構造建議(符合業務…

9.4分漏洞!Next.js Middleware鑒權繞過漏洞安全風險通告

今日&#xff0c;亞信安全CERT監控到安全社區研究人員發布安全通告&#xff0c;Next.js 存在一個授權繞過漏洞&#xff0c;編號為 CVE-2025-29927。攻擊者可能通過發送精心構造的 x-middleware-subrequest 請求頭繞過中間件安全控制&#xff0c;從而在未授權的情況下訪問受保護…

【前端】原生項目與框架項目區別

不定期更新&#xff0c;建議關注收藏點贊。 使用 HTML CSS JS 和 Vue 或 React 開發的項目各有其優勢與不足&#xff0c;適用于不同的場景。目前基本上都采用框架&#xff0c; 總結 何時選擇 HTML CSS JS&#xff1a; 適用于 小型項目、簡單靜態頁面、不需要復雜交互 或 …

WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)

WinSCP 是一款免費開源的 Windows 環境下的 SFTP、SCP、FTP 和 WebDAV 客戶端&#xff0c;主要用于在本地計算機與遠程服務器之間安全地傳輸文件&#xff0c;并提供基本的文件管理功能。 WinSCP是Windows環境下使用SSH的開源圖形化的SFTP的客戶端 SSH 的全稱是 Secure Shell&…

分布式鎖實戰:Redis與Redisson的深度解析

一、分布式鎖的必要性 在分布式系統中&#xff0c;當多個節點需要對共享資源進行讀寫操作時&#xff0c;傳統的本地鎖&#xff08;如Java的synchronized或ReentrantLock&#xff09;無法跨節點生效。此時&#xff0c;必須引入分布式鎖來保證操作的原子性和一致性。分布式鎖需滿…

Dify本地安裝部署筆記

目錄 方式一【docker安裝】&#xff1a; 步驟 1&#xff1a;準備工作 步驟2: 克隆dify倉庫 步驟3:部署啟動dify 步驟 4&#xff1a;訪問 Dify 步驟5:升級dify 方式二【源碼安裝】&#xff1a; 步驟1. 硬件&#xff1a;最低安裝要求 步驟2: 業務服務前的3個服務 1. 安…

質檢LIMS系統在食品生產加工企業的應用 如何保證食品生產企業的安全

在食品生產加工領域&#xff0c;質量安全是貫穿全產業鏈的生命線。隨著《食品安全法》對全過程追溯要求的深化&#xff0c;傳統實驗室管理模式已難以滿足高效、精準的質量管控需求。質檢實驗室信息管理系統&#xff08;LIMS&#xff09;作為數字化升級的核心工具&#xff0c;正…

自動駕駛VLA模型技術解析與模型設計

1.前言 2025年被稱為“VLA上車元年”&#xff0c;以視覺語言動作模型&#xff08;Vision-Language-Action Model, VLA&#xff09;為核心的技術范式正在重塑智能駕駛行業。VLA不僅融合了視覺語言模型&#xff08;VLM&#xff09;的感知能力和端到端模型的決策能力&#xff0c;…

UDP套接字編程(代碼)

什么是socket套接字編程&#xff1f; 通過Ip地址 端口號這種方式定位一臺主機&#xff0c;這樣的方式我們就叫做socket套接字。 Udp Socket 接口介紹 這些案列我們使用的接口基本都是一樣的&#xff0c;所以在這里我先把接口介紹完&#xff0c;具體的細節后面在說明。 創…

汽車行業可信數據空間研究探索

近期&#xff0c;相關老師在新能源汽車國家大數據聯盟微課堂發表了題為“汽車行業可信數據空間研究探索”的演講&#xff0c;主要包括可信數據空間的概念內涵、汽車行業可信數據空間的發展現狀、數據流通場景和技術需求研究、汽車行業可信數據空間的場景建設建議四個方面展開。…

圓弧插補相關算法匯總(C++和ST源代碼)

運動控制需要了解相關的插補概念,在閱讀本篇博客之前需要了解相關的準備知識,常用鏈接如下: SMART PLC直線插補詳解-CSDN博客文章瀏覽閱讀2.1k次,點贊2次,收藏4次。本文介紹了SMART PLC中軸組對象的概念,詳細講解了直線插補的原理和指令使用,包括SMART PLC從V2.7版本開…

Entity Framework框架

深入理解C#中的Entity Framework框架&#xff1a;從理論到實踐 在C#開發中&#xff0c;與數據庫交互是幾乎所有應用程序的核心需求之一。Entity Framework (EF) 作為微軟官方推出的ORM框架&#xff0c;極大地簡化了數據庫操作。本文將帶您深入理解EF框架的核心概念&#xff0c…

C++11QT復習 (五)

文章目錄 **Day6-2 成員訪問運算符重載&#xff08;2025.03.25&#xff09;****1. 復習****2. 成員訪問運算符重載****2.1 箭頭運算符 (->) 重載****(1) 語法** **2.2 解引用運算符 (*) 重載****(1) 語法** **3. 代碼分析****3.1 代碼結構****3.2 代碼解析****(1) Data 類**…

簡歷含金量的描述和注意事項!

背景 最近&#xff0c;在公司負責后端相關面試&#xff0c;簡歷看了不下 50 份&#xff0c;面試 10&#xff0c;純手碼 2000 多字&#xff0c;說說我對簡歷的看法&#xff0c;希望給大家一點啟發。 教育經歷 在眾多求職面試中&#xff0c;我發現多數求職者容易忽視教育背景的…

cellnet框架概述

cellnet框架是一個?高性能、組件化、多協議支持?的開源服務器網絡庫&#xff0c;專注于游戲服務器、分布式的多進程通信等場景的開發。 一、核心特性 ?支持多個主流協議&#xff0c;包括TCP、UDP、HTTP、WebSocket。并且抽象底層協議差異&#xff0c;統一網絡連接管理?。 …

【加密社】如何創建自己的幣圈工具站

需要準備的工作 1.域名 2.服務器 周末的時候主要弄了快訊這方面的代碼 我這里用的是星球日報的api&#xff0c;也可以訂閱他們的rss&#xff0c;這部分在github上是開源的 https://github.com/ODAILY 我這里用的是WordPressonenav主題&#xff0c;然后用小工具在主頁展示&am…