分布式 ID 的实现方案——Java全栈知识(13)

news/2024/5/20 6:35:38

分布式 ID 的实现方案

当我们分表的情况下,如何实现全局唯一 ID 也是一个问题,数据库的唯一索引在
分布式 ID 也就是全局唯一 ID 生产方案需要满足以下几个条件:

  1. 高可用
  2. 高性能
  3. 安全性
  4. 自增性
  5. 唯一性

1、UUID

UUID(Universally Unique Identifier)是一种128位的数字标识符,通常用于唯一标识信息。UUID 是由一组六组十六进制数字组成,中间带有连字符,例如:550e8400-e29b-41d4-a716-446655440000。由于其长度和算法的特性,UUID 几乎可以被认为是全球唯一的标识符,因此在分布式系统和数据库中经常被用于生成唯一的标识符。UUID 的生成算法保证了在大多数情况下,生成的 UUID 都是唯一的。
UUID 的组成部分包括:

  1. 时间戳:UUID的前8位包含时间戳的信息。
  2. 时钟序列:UUID的9~10位包含时钟序列的信息。
  3. MAC地址:UUID的11~16位包含计算机的MAC地址。
  4. 随机数:UUID 的后 12 位包含随机数的信息
    首先上述的 5 个条件 UUID 不满足自增性,其次我们在设置数据库主键的时候应该尽量选用较短的字符串,因为 MySQL 索引的特性主键 ID 需要越短性能越好。

2、基于单表做自增主键

既然分表的情况下有每个表生成自增主键会有冲突,那我们就可以使用一张表给所有的表生成自增主键,这样就解决了冲突的问题
也就是所有的表在需要主键的时侯,都到这张表中获取一个自增的 ID,
这样做是可以做到唯一,也能实现自增,但是问题是这个单表就变成整个系统的瓶颈,而且也存在单点问题,一旦也挂了,整个数握库就都无法写入了。
而且这种生成的方式也不满足安全性,由于自增主键的步长为 1 或者是某个固定值,那么在作为商城等订单系统的 ID 时,我有自己的 ID 就可以尝试出来别人其他的订单 ID,非常不安全。

3、基于跨表步长的自增主键

例如我们有 10 张表,我们可以规定 table_01 以 1 开始自增,table_02 以 1000,0001 开始自增,步长为 1000,0000,这样就可以解决冲突和单表瓶颈。
image.png

但是这种自增的方案需要项目初期进行项目存储数量的预估,而且一旦到达上限将很难去扩容。而且同样有上述的安全性的问题。

4、雪花算法

雪花算法也是比较常用的一种分布式 ID 的生成方式,它具有全局唯一、递增、高可用的特点。
雪花算法生成的主键主要由 4 部分组成,1 bit 符号位、41 bit 时间戳位、10 bit 工作进程位以及 12 bit 序列号位。

  • 时间戳占用 41 bit, 精确到毫秒,总共可以容纳约 69 年的时间。
  • 工作进程位占用 10 bit, 其中高位 5 bit 是数据中心 ID, 低位 5 bit 是工作节点 ID, 做多可以容纳 1024个节点。
  • 序列号占用 12 bt, 每个节点每毫秒 0 开始不断累加,最多可以累加到 4095,一共可以产生 4096 个 ID。
    所以,一个雪花算法可以在同一毫秒内最多可以生成 1024 X 4096=4194304 个唯一的 ID
    image.png

雪花算法之所以被广泛使用,主要是因为他有以下优点:

  1. 高性能高可用:生成时不依赖于数据库,完全在内存中生成
  2. 高吞吐:每秒钟能生成数百万的自增 ID
  3. ID 自增:在单个进程中,生成的 ID 是自增的,可以用作数据库主键做范围查询。但是需要注意的是,在集群中是没办法保证一定顺序递增的。
  4. 唯一性:通过雪花算法生成的 ID 都是唯一的
  5. 安全性:通过雪花算法生成的 ID 不能作为破解其他 ID 的基础。

http://www.mrgr.cn/p/48140836

相关文章

cobalt strike安装教程

将本地IP和密码填入:./teamserver 192.168.xx.xx 密码 启动成功

初识C语言——第十五天

初识结构体1 //结构体可以让C语言创建新的类型出来 //创建一个学生struct Stu {char name[20];int age;double score;}; //创建一个书的类型 struct Book {char name[20];float price;char id[30]; };//int main() //{ // struct Stu s { "张三",20,85.5 };//结…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错(持续更新)

WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介 这简直就是歧视,在MDT使用变量时,数据库设置时,居然不能用中文。 计算机描述,我将在数据库中设置为使用人,主要是其他地方也不方便看。 描述是存在注册表中的,未来自动化也将会使用使用人这个字段,用来注册OCS这样,有标签,使用人字段的软件。 方向 解决MDT/BDD无…

蓝桥杯练习系统(算法训练)ALGO-950 逆序数奇偶

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 老虎moreD是一个勤于思考的青年,线性代数行列式时,其定义中提到了逆序数这一概念。不过众所周知我们…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了…

刷题训练之模拟

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握模拟算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题训…

Ansible——playbook编写

一、简介 1.什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图,可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook 本质上是一些框架,是一些预先编…

pytest教程-41-钩子函数-pytest_runtest_teardown

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_runtest_call钩子函数的使用方法,本小节我们讲解一下pytest_runtest_teardown钩子函数的使用方法。 pytest_runtest_teardown 钩子函数在每个测试用例执行完成后被调用&…

商务分析方法与工具(五):Python的趣味快捷-文件和文件夹操作自动化

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

Web前端三大主流框架是什么?

Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位,各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架,最初版本称为AngularJS,后来升级为Angular。它是一个完整的…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 (1)白鲸优化算法BWO 参考文献:Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. (2)龙格-库塔优化…

三维建模技术在AI去衣中的奇妙应用

引言: 随着计算机视觉和深度学习技术的迅猛发展,人工智能(AI)在图像处理和理解方面取得了显著进展。其中,一个颇具争议却技术上引人入胜的应用便是AI去衣——即使用AI技术从图片或视频中移除人物的衣物。尽管这技术常因…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段: 1. 概论 自动驾驶系统的认知中有一些模糊的地方,比如自动驾驶系统如何定义的问题,自动驾驶的研发为什么会有那么多的子模块,怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍,了解自动驾…

算法学习(6)-最短路径

目录 Floyd-Warshall算法 Dijkstra算法 Bellman-Ford算法 Bellman-Ford的队列优化 最短路径算法对比分析 Floyd-Warshall算法 现在回到问题:如何求任意两点之间的最短路径呢? 通过之前的学习, 我们知道通过深度或广度优先搜索可以求出两…

算法系列--多源BFS问题

💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–多源BFS问题 大家好,今天为大家带来的是算法系列--多源BFS问题 前言: 之前我们已经学习过单源的最短路问…

php基础知识快速入门

一、PHP基本知识 1、php介绍: php是一种创建动态交互性的强有力的服务器脚本语言,PHP是开源免费的,并且使用广泛。PHP是解释性语言,按顺序从上往下执行,无需编译,直接运行。PHP脚本在服务器上运行。 2、ph…

Unity 性能优化之光照优化(七)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、测试目的一、实时光源是什么?二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

C++ | Leetcode C++题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1, 0));for (int i 0; i < word1.size(); i) dp[i][0] i;for (int j…