全局唯一ID

news2025/7/27 11:59:17

文章目录

      • 前言
      • MongoDB ObjectId
      • Twitter Snowflake
      • UUID

前言

  • 基于数据库设置其实初始值,以及增量步长。
  • 基于ZK,Redis,改良雪花集中式服务生成,远程调用获取id。
  • 基于并行空间划分,Snowflake(8Byte字节64bit位),MongoDB ObjectId(12字节),UUID(16字节)
  • 基于全随机UUID(16字节)

MongoDB ObjectId

12-byte MongoDB ObjectId 的结构是:

  • a 4-byte value representing the seconds since the Unix epoch,.
  • a 3-byte machine identifier.
  • a 2-byte process id.
  • a 3-byte counter, starting with a random value.

可以看出,这个方案所支持的最小划分粒度是「秒 * 进程实例」,单进程实例的每秒容量是 3-byte (24-bit),也就是接近16777216个ID。

即每个实例每秒1600多W。

看代码(MonogoDB 3.3.x Java Driver)

1. Timestamp

图片

2. Machine Identifier

图片

3. Process ID

图片

4. COUNTER

图片

此处需要注意的是MongoDB的 NEXT_COUNTER 其初始值是一个随机数,这是有利于分库分表的。因为在小并发的条件下,非随机数的初始值,容易产生 偏库偏表, 不均匀的现象。

Twitter Snowflake

64-bit 长的 Snowflake ,它的结构是:

  • 1-bit reserved
  • 41-bit timestamp millisecond
  • 10-bit machine id
  • 12-bit sequence

所支持的最小划分粒度是「毫秒 * 线程」,单线程(Snowflake 里对应的概念是 Worker)的每毫秒容量是12-bit,也就是接近4096。

即每个实例每秒4096000(400w)

初始化时间自己指定,例如:

// Thu, 04 Nov 2010 01:42:54 GMT
twepoch = 1288834974657L;

1. Timestamp

 System.currentTimeMillis() - twepoch

2. Machine Identifier

同上

3. Process ID

同上

4. Sequence

if (lastTimestamp == timestamp) {
    // 相同毫秒内,序列号自增
    sequence = (sequence + 1) & sequenceMask;
    if (sequence == 0) {
        // 同一毫秒的序列数已经达到最大, 则等待下一个毫秒时间,即使用下一秒 sequence默认0L
        timestamp = tilNextMillis(lastTimestamp);
    }
} else {
    
    // 不同毫秒内,序列号置为 [1 - 3) 随机数 即 1或者2 防止每毫秒初始值相同
    sequence = ThreadLocalRandom.current().nextLong(1, 3);
}

sequence初始值是一个[1 - 3) 随机数,这是有利于分库分表的。因为在小并发的条件下,非随机数的初始值,容易产生 偏库偏表, 不均匀的现象。

闰秒问题以及运行中时钟回拨问题

闰秒会出现把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒);

// 当前时间小于上次时间,即出现闰秒或者时钟回溯了
if (timestamp < lastTimestamp) {
    long offset = lastTimestamp - timestamp;
    if (offset <= 5) { // 回溯时差 如果小于等于 5 ms
        try {
            wait(offset << 1); //等个2倍时间 再获取时间戳
            timestamp = timeGen(); 
            if (timestamp < lastTimestamp) { // 还小则抛出异常
                throw new RuntimeException("时钟回调了 拉了裤");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    } else {
        throw new RuntimeException("时钟回调了 拉了裤");
    }
}

延迟等待解决,实际应用项目: 美团的leaf,。

UUID

参见另一篇:UUID的5个版本

  • 版本1 - UUID 是根据时间和 节点ID(通常是MAC地址)生成;时间+MAC,不安全

  • 版本2 - UUID是根据标识符(通常是组或用户ID)、时间和节点ID生成;

  • 版本3、版本5 - 确定性UUID 通过散列(hashing)名字空间(namespace)标识符和名称生成;

  • 版本4 - UUID 使用随机性或伪随机性生成。

一般的,使用的最多的是UUID Version 4,很大程度上是因为其依赖的其他服务最少。

Java只支持生成版本3和版本4的UUID

V4 随机UUID,UUID.randomUUID().toString()

V4 随机UUID重复概率问题?

V4随机版本有一定的重复概率但是极低,直接上结论,来着维基百科

在 103 万亿 个 版本4 UUID 中找到重复的概率是(十亿分之一)。

参考

  • 生成全局唯一ID的3个思路,来自一个资深架构师的总结 - 王延炯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

供应化学试剂mPEG-Azide,mPEG-N3,甲氧基-聚乙二醇-叠氮,CAS:89485-61-0

1、名称 英文&#xff1a;mPEG-Azide&#xff0c;mPEG-N3 中文&#xff1a;甲氧基-聚乙二醇-叠氮 2、CAS编号&#xff1a;89485-61-0 3、所属分类&#xff1a;Azide PEG Methoxy PEG 4、分子量&#xff1a;可定制&#xff0c;甲氧基-聚乙二醇-叠氮 5k、甲氧基-PEG-叠氮 10…

Higress 实战: 30行代码写一个 Wasm Go 插件

前言 在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中&#xff0c;为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效&#xff0c;本文对当天的 Demo 进行一个回顾&#xff0c;并说明背后的原理机制。 本文中 Demo 运行的前提&#x…

PPOCR车牌定位模型推理后处理优化研究

综述 最近在研究基于PPOCR算法的车牌识别&#xff08;LPR&#xff09;&#xff0c;部署模型后发现之前关于OCR文本定位的后处理策略在车牌识别中存在定位精度不够高&#xff0c;文本框偏移的问题&#xff0c;如&#xff1a; 经分析发现是之前的OCR后处理策略存在一定局限&am…

java刷题day 03

选择题&#xff1a; 解析&#xff1a; 父类private的成员变量&#xff0c;根据权限修饰符的访问控制范围&#xff0c;只有在类内部才能被访问&#xff0c;就算是他的子类&#xff0c;也不能访问。这里如果将Person p new Child();改成 Person p new Person();代码依然无法通过…

乐趣国学—品读《弟子规》中的“余力学文”之道

文章目录余力学文不力行 但学文 长浮华 成何人但力行 不学文 任己见 昧理真读书法 有三到 心眼口 信皆要方读此 勿慕彼 此未终 彼勿起宽为限 紧用功 工夫到 滞塞通心有疑 随札记 就人问 求确义房室清 墙壁净 几案洁 笔砚正墨磨偏 心不端 字不敬 心先病列典籍 有定处 读看毕 还原…

信号完整性测试,关于SMA装配的细节,很多人都忽视了

作者 | 萧隐君&#xff0c;仿真秀专栏作者 SMA转接头是射频微波、天线和高速电路测试经常用到的一种连接器&#xff0c;应用非常广泛&#xff0c;种类也很多。在信号完整性的测试夹具中&#xff0c;2.92mm的SMA用的较多&#xff0c;它的带宽可以到40GHz&#xff0c;对于25Gbps…

【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第2章 信息化规划与组织

文章目录&#x1f525; 11 年 4 月《信息资源管理》真卷选择题名词解释综合分析题&#x1f525; 11 年 7 月《信息资源管理》真卷选择题名词解释题简答题⭐ 12 年 4 月《信息资源管理》真卷选择题简答题⭐ 12 年 7 月《信息资源管理》真卷选择题简答题⭐ 13 年 4 月《信息资源管…

计算机网络--- 电子邮件

&#xff08;一&#xff09;电子邮件系统的组成 电子邮件是一种异步通信方式&#xff0c;通信时不需要双方同时在场。电子邮件把邮件发送到收件人使用的邮件服务器&#xff0c;并放在其中的收件人邮箱中&#xff0c;收件人可以随时上网到自己使用的邮件服务器进行读取。 一…

补盲激光雷达大爆发,各路产品谁领风骚?

11月伊始车载激光雷达赛道上演了冰火两重天的景象。国外Ouster与Velodyne LiDAR宣布合并以抱团取暖&#xff0c;主打OPA技术的Quanergy甚至股市停牌&#xff0c;一时风声鹤唳&#xff0c;寒意阵阵&#xff1b;而反观国内&#xff0c;禾赛、速腾、亮道相继发布纯固态补盲激光雷达…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的&#xff0c;只能通过多次迭代求近似的数值解。 龙格&#xff0d;库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

固定资产管理系统能帮助企业解决哪些问题?

固定资产管理系统是企业信息化转型中重要的工具之一。固定资产在企业整体资金和运营管理中的占比非同一般&#xff0c;因此企业管理者对固定资产的重视程度也逐渐提升。随着企业固定资产数量和种类的增多、人员的增多&#xff0c;以及分支机构和部门的增多&#xff0c;单纯依靠…

数据安全治理白皮书4.0(附下载link)

数据安全治理白皮书是国内最早的数据安全治理白皮书系列&#xff0c;围绕数据安全治理&#xff0c;“新理论、新技术、新实践”&#xff0c;一次系统汇总、梳理分析与集中呈现&#xff0c;2018年-2021年&#xff0c;已发布1.0/2.0/3.0三个版本&#xff0c;2022年&#xff0c;已…

LeetCode | 循环队列的爱情【恋爱法则——环游世界】

兜兜转转⚪还是你❤✒前言环形队列的概念拓展&#xff1a;生产者与消费者一、题目描述二、思路分析&#x1f351;初次遇见她♀【是心动的感觉】&#x1f351;阻碍一&#xff1a;队空还是队满不好区分【性格互异】&#x1f351;解决方案&#x1f351;阻碍二&#xff1a;很难获取…

Git之借助Commitizen规范化提交代码

文章目录一、约定式提交规范1.1 概述1.2 规范1.3 好处二、Commitizen2.1 安装2.2 安装并配置cz-customizable依赖2.2.1 安装依赖2.2.2 配置package.json2.2.3 添加cz-config配置文件2.3 使用2.4 问题一、约定式提交规范 1.1 概述 约定式提交规范是一种基于提交信息的轻量级约…

ES6 入门教程 26 编程风格 26.4 对象 26.5 数组 26.6 函数

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程26 编程风格26.4 对象26.5 数组26.6 函数26 编程风格 26.4 对象 单行定义的对象&#xff0c;最后一个成员不以逗号结尾。多…

流媒体传输 - RTSP 协议

概述 协议简介 RTSP RTSP (Real-Time Stream Protocol) 实时流传输协议是一种基于文本的应用层协议&#xff0c;常被用于 建立的控制媒体流的传输&#xff0c;该协议用于 C/S 模型 , 是一个 基于文本 的协议&#xff0c;用于在客户端和服务器端建立和协商实时流会话。 RTP …

JS语句完全攻略

JavaScript 语言定义了 20 套&#xff08;或个&#xff09;语句命令&#xff0c;分别执行不同的操作。 以用途划分&#xff0c;JavaScript 语句可以分为&#xff1a;声明、分支控制、循环控制、流程控制异常处理和其他。 以结构划分&#xff0c;JavaScript 语句又可以分为单句…

【Python】基础知识(语句,函数)

目录Python基础语法接上次的知识点补充顺序语句条件/分支语句语法格式空语句 pass循环语句while 循环For循环continue和break函数语法格式调用函数/使用函数函数参数函数返回值变量作用域函数执行过程链式调用嵌套调用函数递归参数默认值关键字参数写在前面&#x1f34e;&#…

全双工物联网远程控制门禁设计方案

远程控制物联网方案 (此方案成本250元~300元优点是远低于产家报价400&#xff5e;500,使用自家服务器扩展成本低) 组装后连线效果实物图 网关配置 工具见下面产品说明 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP/IP协议,一定要配置好服务器地址与网关 通讯是TCP…

照片人像模糊怎么调?两分钟教会你

有时候我们在拍摄一些照片的时候&#xff0c;可能会因为一些特殊原因而导致照片中的人脸出现模糊的情况&#xff0c;从而使我们无法对照片进行浏览&#xff0c;这时最简单的方法就是借助一些软件来修复模糊的人脸照片&#xff0c;那你们知道如何利用这些软件进行操作吗&#xf…