一種新的分布式ID生成方案--ULID

一種新的分布式ID生成方案
ULID: 一種新的分布式ID生成方案
ULID (Universally Unique Lexicographically Sortable Identifier) 是一種較新的分布式ID生成方案,旨在解決傳統UUID和雪花算法(Snowflake)的一些局限性。

ULID的主要特點
可排序性:ULID按生成時間嚴格排序,便于數據庫索引優化
128位兼容性:與UUID相同的128位長度(26字符Base32編碼)
無特殊字符:僅使用Base32編碼(字母A-Z和數字2-7)
跨語言支持:多種編程語言實現可用
單調遞增:同一毫秒內生成的ULID也能保持順序
ULID結構

在這里插入圖片描述

在這里插入圖片描述

適用場景
需要按時間排序的數據庫主鍵
分布式系統需要無協調的ID生成
需要人類可讀但不想暴露內部信息的ID
替換UUIDv4但需要排序能力的場景
各語言實現示例

javascript

// Node.js
const { ULID } = require('ulid');
const id = ULID(); // 01H5Z7K0G2ABC123DEF456GHJ

Python

import ulid
id = ulid.new()  # 01H5Z7K0G2ABC123DEF456GHJ

Java

// Java
import de.huxhorn.sulky.ulid.ULID;
ULID ulid = new ULID();
String id = ulid.nextULID(); // 01H5Z7K0G2ABC123DEF456GHJ

優缺點分析
優點:
無需中心化協調器
比UUID更友好的排序和索引性能
比Snowflake更簡單的實現
時間信息可提取(前10字符代表時間)
缺點:
隨機部分不如UUIDv4隨機(時間部分固定)
相對較新,生態支持不如UUID廣泛
80位隨機性理論上存在沖突可能(但極低)
ULID為分布式系統ID生成提供了一個平衡了排序性、唯一性和易用性的新選擇,特別適合需要時間排序的場景。

1. 添加依賴
首先添加 ULID 的 Java 實現庫到你的項目中:
Maven 依賴

<dependency><groupId>com.github.f4b6a3</groupId><artifactId>ulid-creator</artifactId><version>5.2.0</version> <!-- 檢查最新版本 -->
</dependency>

2. 基本使用方法

import com.github.f4b6a3.ulid.Ulid;
import com.github.f4b6a3.ulid.UlidCreator;public class UlidExample {public static void main(String[] args) {// 生成一個ULIDUlid ulid = UlidCreator.getUlid();System.out.println("ULID: " + ulid); // 例如: 01H5Z7K0G2ABC123DEF456GHJ// 獲取ULID的不同部分System.out.println("Timestamp: " + ulid.getTimestamp()); // 48位時間戳System.out.println("Random: " + ulid.getRandom());       // 80位隨機部分// 獲取字符串表示String ulidString = ulid.toString();System.out.println("String: " + ulidString);// 從字符串解析ULIDUlid parsedUlid = Ulid.from(ulidString);System.out.println("Parsed: " + parsedUlid);}
}

3. 高級用法
單調遞增ULID (同一毫秒內有序)

// 創建單調遞增的ULID生成器
UlidCreator.Monotonic ulidMonotonic = UlidCreator.getMonotonicUlid();
// 同一毫秒內生成的ULID會保持順序
Ulid ulid1 = ulidMonotonic.create();
Ulid ulid2 = ulidMonotonic.create();
System.out.println(ulid1.compareTo(ulid2) < 0); // 輸出 true

自定義隨機數生成器

import java.security.SecureRandom;// 使用更安全的隨機數生成器
SecureRandom secureRandom = new SecureRandom();
Ulid ulid = UlidCreator.getUlid(secureRandom);

獲取時間信息

import java.time.Instant;Ulid ulid = UlidCreator.getUlid();
Instant instant = ulid.getInstant(); // 獲取生成時間
System.out.println("Created at: " + instant);

4. 性能優化
對于高性能場景,可以使用更高效的方法:

// 生成ULID并直接獲取字節數組
byte[] bytes = new byte[16];
UlidCreator.getUlid(bytes); // 填充16字節數組
// 從字節數組創建ULID
Ulid fromBytes = Ulid.from(bytes);

5. 與UUID互轉

import java.util.UUID;
// ULID轉UUID
Ulid ulid = UlidCreator.getUlid();
UUID uuid = ulid.toUuid();
// UUID轉ULID
Ulid fromUuid = Ulid.from(uuid);

6. 完整工具類示例

import com.github.f4b6a3.ulid.Ulid;
import com.github.f4b6a3.ulid.UlidCreator;import java.time.Instant;
import java.util.UUID;public class UlidUtils {/*** 生成標準ULID*/public static String generate() {return UlidCreator.getUlid().toString();}/*** 生成單調遞增ULID*/public static String generateMonotonic() {return UlidCreator.getMonotonicUlid().create().toString();}/*** 獲取ULID的生成時間*/public static Instant getInstant(String ulid) {return Ulid.from(ulid).getInstant();}/*** ULID轉UUID*/public static UUID toUuid(String ulid) {return Ulid.from(ulid).toUuid();}/*** UUID轉ULID*/public static String fromUuid(UUID uuid) {return Ulid.from(uuid).toString();}/*** 驗證字符串是否為有效ULID*/public static boolean isValid(String ulid) {try {Ulid.from(ulid);return true;} catch (IllegalArgumentException e) {return false;}}
}

7. 性能考慮
基準測試:在常規硬件上,ULID生成速度可達每秒數百萬次
線程安全:UlidCreator是線程安全的
無阻塞:實現不依賴網絡或IO操作

8. 注意事項
ULID區分大小寫,但標準實現通常使用大寫字母
時間戳部分基于UNIX時間戳(毫秒),可表示到10889年
隨機部分使用安全的隨機數生成器
在極高并發(同一毫秒內超過2^80次生成)時理論上可能沖突,但實際幾乎不可能

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

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

相關文章

服務器中涉及節流(Throttle)的硬件組件及其應用注意事項

服務器中涉及節流&#xff08;Throttle&#xff09;的硬件組件及其應用注意事項 在服務器硬件中&#xff0c;“節流”&#xff08;throttling&#xff09;是一種保護機制&#xff0c;當組件溫度過高、功耗過大或超出安全閾值時&#xff0c;系統會自動降低性能&#xff08;如時鐘…

GitPython07-源碼解讀

GitPython07-源碼解讀1 1-核心知識 1&#xff09;從核心代碼的第一行作為突破口2&#xff09;從Repo.init方法入手做追蹤3&#xff09;subprocess到底做了什么&#xff1f;gitPython是不是執行的腳本&#xff0c;最終還是通過subprocess做到的4&#xff09;代碼中貌似并沒有實…

Java繼承機制詳解:從原理到實戰應用

一、繼承的本質&#xff1a;消除冗余&#xff0c;構建邏輯關系想象一個公司管理系統&#xff1a;普通銷售員工&#xff08;CommissionEmployee&#xff09;和帶底薪銷售員工&#xff08;BasePlusCommissionEmployee&#xff09;共享大部分屬性&#xff08;姓名、工號、銷售額、…

工業數采引擎-DTU

DTU配置注冊包及心跳包(對應設備配置->設備SN)&#xff0c;模塊工作方式&#xff1a;TcpClient&#xff0c;首次連接成功后&#xff0c;DTU發送上來的注冊包作為鏈路SessionId1. ModbusRtu設備 -> Dtu -> Server2. DLT645設備 -> Dtu -> Server3. 自定義設備 -&…

AttributeError: ChatGLMTokenizer has no attribute vocab_size

請問運行下面語句tokenizer AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_codeTrue) 出現“AttributeError: ChatGLMTokenizer has no attribute vocab_size”是版本不一致&#xff0c;需要舊的版本卸載conda uninstall transformers或者pip un…

14.串口更新FLASH字庫

一、簡介 在使用STM32等單片機驅動顯示屏時&#xff0c;為了顯示中文字體&#xff0c;常用FLASH保存字庫信息。但是字庫的更新通常只能使用SD卡更新&#xff0c;在一些小型單片機系統(如STM32F103C8T6、STC89C52)上&#xff0c;沒有增加SD卡支持的必要。為解決此問題&#xff0…

Lombok常用注解及功能詳解

Lombok常用注解及功能詳解一、Lombok簡介與環境配置1.1 什么是Lombok&#xff1f;1.2 環境配置1.2.1 Maven項目1.2.2 Gradle項目1.2.3 IDE配置&#xff08;關鍵&#xff09;二、Lombok常用注解詳解2.1 Data&#xff1a;一站式生成核心方法2.2 Getter/Setter&#xff1a;單獨生成…

應用分層

應用分層是?種軟件開發設計思想&#xff0c;它將應用程序分成N個層次&#xff0c;這N個層次分別負責各自的職責&#xff0c; 多個層次之間協同提供完整的功能。根據項目的復雜度&#xff0c;把項目分成三層&#xff0c;四層或者更多層。常見的MVC設計模式&#xff0c;就是應用…

[特殊字符] 【JAVA進階】StringBuilder全方位解析:從使用到源碼,一文搞定!

&#x1f525; 掌握StringBuilder&#xff0c;讓你的Java字符串操作性能飆升&#xff01;&#x1f9e9; StringBuilder是什么&#xff1f; StringBuilder是Java中用于動態構建字符串的可變字符序列類&#xff0c;位于java.lang包中。與不可變的String類不同&#xff0c;StringB…

Redis 數據結構全景解析

Redis 不是簡單的 key-value 緩存&#xff0c;它更像一把“瑞士軍刀”。 只要掌握數據結構&#xff0c;就能把同一份內存用出 10 倍效率。0. 開場白&#xff1a;為什么聊數據結構&#xff1f; 面試常問“Redis 有幾種數據類型&#xff1f;”——很多人答 5 種&#xff08;Strin…

ansible.cfg 配置文件的常見配置項及其說明

配置項說明默認值defaults默認配置部分inventory指定清單文件的位置&#xff0c;可以是文件路徑、目錄或動態清單腳本。/etc/ansible/hostsremote_user默認的遠程用戶roothost_key_checking是否啟用主機密鑰檢查。設置為 False 跳過 SSH 主機密鑰驗證。Trueask_pass是否在執行時…

Effective C++ 條款15:在資源管理類中提供對原始資源的訪問

Effective C 條款15&#xff1a;在資源管理類中提供對原始資源的訪問核心思想&#xff1a;RAII類需要提供訪問其封裝原始資源的顯式或隱式接口&#xff0c;以兼容需要直接操作資源的API&#xff0c;同時維持資源的安全管理。 ?? 1. 原始資源訪問的必要性 使用場景示例&#x…

Linux 進程管理與計劃任務設置

Linux 進程管理與計劃任務設置一、進程管理進程管理用于監控、控制系統中運行的程序&#xff08;進程&#xff09;&#xff0c;包括查看進程狀態、調整優先級、終止異常進程等。以下是核心命令及操作說明&#xff1a;1. 常用進程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL數據庫之索引

1、引入索引的問題在圖書館查找一本書的過程&#xff0c;可類比數據庫查詢場景。在一般軟件系統中&#xff0c;對數據庫操作以查詢為主&#xff0c;數據量較大時&#xff0c;優化查詢是關鍵&#xff0c;索引便是優化查詢的重要手段 。2、索引是什么索引是一種特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在線地圖制作者名單

問題&#xff1a;ArcGIS和ArcGIS Pro提供了許多在線地圖服務&#xff0c;但是這些地圖會自動生成制作者名單&#xff0c;如下圖所示&#xff1a; 在線地圖加載方式可參考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在線底圖 這在出圖時有時會造成圖的部分信息遮擋或出圖不美觀…

InfluxDB 與 Golang 框架集成:Gin 實戰指南(二)

四、實際應用案例4.1 案例背景某智能工廠部署了大量的物聯網設備&#xff0c;如傳感器、智能儀表等&#xff0c;用于實時監測生產線上設備的運行狀態、環境參數&#xff08;如溫度、濕度&#xff09;以及生產過程中的各項指標&#xff08;如產量、次品率&#xff09;。這些設備…

Linux系統磁盤未分配的空間釋放并分配給 / 根目錄的詳細操作【openEuler系統】

選擇 Fix 修正 GPT 表 輸入 Fix 并按回車&#xff0c;parted 會自動&#xff1a; 擴展 GPT 表的 結束位置 到磁盤末尾。釋放未被使用的空間&#xff08;1048576000 個 512B 塊&#xff0c;約 500GB&#xff09;。 驗證修正結果 修正后&#xff0c;再次運行&#xff1a; parted …

王道考研-數據結構-01

數據結構-01視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 數據結構到底在學什么? 數據結構這門課他要學習的就是怎么用程序代碼把現實世界的問題給信息化&…

k8s云原生rook-ceph pvc快照與恢復(上)

#作者&#xff1a;Unstopabler 文章目錄前言部署rook-ceph on kubernets條件Ceph快照概述什么是PVC安裝快照控制器和CRD1.安裝crds資源2.安裝控制器3.安裝快照類前言 Rook 是一個開源的云原生存儲編排器&#xff0c;為各種存儲解決方案提供平臺、框架和支持&#xff0c;以便與…

springcloud04——網關gateway、熔斷器 sentinel

目錄 注冊中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 遠程服務調用 httpClient | RestTemplate | OpenFeign 負載均衡服務 ribbon | loadbalancer 網關 zuul | gateway 熔斷器 hystrix | sentinel 網關 sentinel 流控 壓測工具 1…