Java 7.3 - 分布式 id

news2024/11/23 20:43:23

分布式 ID 介绍

什么是 ID?

ID 就是 数据的唯一标识。

什么是分布式 ID?

分布式 ID 是 分布式系统中的 ID,它不存在于现实生活,只存在于分布式系统中。

分库分表:

一个项目,在上线初期使用的是单机 MySQL。但随着需求不断增长,单机 MySQL 已经无法满足当前的需求,我们需要进行分库分表。

分库分表后,数据分布在不同服务器的数据库上,数据库的自增主键无法满足 ID 的唯一性了。此时我们如何为不同的节点生成全局唯一的主键呢?—— 分布式 ID

分布式 ID 需要满足哪些要求?

1、全局唯一

2、高可用:生成分布式 ID 的服务要保证可能性接近 100%

3、高性能:生成速度要快

4、方便易用

以上四点为分布式 ID 的基本要求,一个好的分布式 ID 还需要满足下列需求:

1、安全

2、有序递增

3、有具体的业务含义:生成的 ID 如果能有具体的业务含义,可以让定位问题以及开发更加透明化

4、独立部署:分布式系统专门有一个服务用来生成分布式 ID,可以和业务相关的服务解耦。

分布式 ID 常见的解决方案有哪些?

数据库

数据库主键自增

通过关系型数据库的自增主键来产生唯一 ID

以 MySQL 为例:

CREATE TABLE `sequence_id` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`stub` char(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建一个表,其主键自增。

BEGIN;
REPLACE INTO sequence_id (stub) VALUES ('stub');
SELECT LAST_INSERT_ID();
COMMIT;

插入数据我们使用 replace into 代替 insert into,解释如下:

这种方式的优缺点——

优点:实现简单

缺点:并发量不大,存在数据库单点问题、ID 没有业务含义、安全问题(通过 ID 自增量来判断每天的订单量)、每次获取 ID 都要访问数据库

数据库号段模式

对于数据库主键自增的方法,每有一个订单就需要访问一次数据库,性能比较差。我们可以通过批量获取,存在内存中,需要用到的时候直接从内存中取即可。

以 MySQL 为例:

1、创建一个数据库表

CREATE TABLE `sequence_id_generator` (
`id` int(10) NOT NULL,
`current_max_id` bigint(20) NOT NULL COMMENT '当前最⼤id',
`step` int(10) NOT NULL COMMENT '号段的⻓度',
`version` int(20) NOT NULL COMMENT '版本号',
`biz_type` int(20) NOT NULL COMMENT '业务类型',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

current_max_id 和 step 都是用来获取批量 ID,获取的批量 ID 为:current_max_id -- current_max_id + step

version 解决并发问题(乐观锁)

2、插入一行数据

INSERT INTO `sequence_id_generator` (`id`, `current_max_id`, `step`, `version`,
`biz_type`)
VALUES
 (1, 0, 100, 0, 101);

3、通过 select 获取指定业务下的批量唯一 ID

SELECT `current_max_id`, `step`,`version` FROM `sequence_id_generator` where
`biz_type` = 101

4、不够用更新后重新 select

UPDATE sequence_id_generator SET current_max_id = 0+100, version=version+1 WHERE
version = 0 AND `biz_type` = 101
SELECT `current_max_id`, `step`,`version` FROM `sequence_id_generator` where
`biz_type` = 101

优缺点 ——

优点:ID 有序递增

缺点:数据库单点问题、ID 没有业务含义、安全问题

NoSQL

一般情况下,NoSQL 方案使用 Redis 多一些。我们通过 Redis 的 incr 命令即可实现对 ID 原子顺序递增。

127.0.0.1:6379> set sequence_id_biz_type 1
OK
127.0.0.1:6379> incr sequence_id_biz_type
(integer) 2
127.0.0.1:6379> get sequence_id_biz_type
"2"

为了提高可用性和并发,我们可以使用 Redis 集群。(Redis Cluster)

优缺点 ——

优点:性能不错且 ID 有序递增

缺点:和数据库主键自增方案缺点类似

算法

UUID

UUID,Universal Unique Identifier(通用唯一标识符)。UUID 包含 32 个 16 进制数字。(8-4-4-4-12)

JDK 提供了现成的生成 UUID 的方法

UUID.randomUUID();

UUID 可以保证唯一性,因为其生成规则包括 MAC 地址、时间戳、名字空间、随机或伪随机数、时序等元素,UUID 不会重复。但虽然 UUID 可以做到全局唯一性,但是我们很少使用它。

UUID 作为 MySQL 主键的时候非常不合适:

1、主键要尽量越短越好

2、UUID 无序,InnoDB 引擎中,数据库主键的无序性会严重影响性能(B+ 树)

UUID 优缺点 —— 

优点:生成速度快、简单易用

缺点:空间消耗大、不安全(MAC 地址泄露)、无序、没有具体业务含义、需要解决重复 ID 问题(机器时间不对的情况下,可能生成重复 ID)

Snowflake(雪花算法)

基于 Snowflake 算法的开源实现,比如美团的 Leaf.

优缺点 ——

优点:生成速度快,ID 有序自增、比较灵活(根据业务加入业务ID)

缺点:需要解决重复 ID 问题(机器时间不对导致重复 ID)

开源框架

UidGenerator

Leaf(团子)

 

Tinyid(滴滴)

 

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

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

相关文章

2-80 基于matlab-GUI,实现kalman滤波对目标物的位置进行检测跟踪

基于matlab-GUI,实现kalman滤波对目标物的位置进行检测跟踪。检测汽车中心和最大半径,与背景差分选择较大差异的区域进行形态学处理,用冒泡法对目标面积从大到小排序。程序已调通,可直接运行。 2-80 kalman视频跟踪滤波 - 小红书 (xiaohongsh…

光学涡旋Talbot阵列照明器的matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 光学涡旋 Talbot 阵列照明器是一种利用光学涡旋(Optical Vortex)和 Talbot 效应(Talbot Effect)相结合的技术&…

【HTML源码】上传即可使用的在线叫号系统源码

这个叫号系统的过程是这样的 接了一个任务,某学校要对学生进行逐个面试,希望能有类似医院门诊那种叫号系统。 条件:首先说硬件,就是教室里边一台笔记本电脑,同屏到教室外面的电视机。 需求:软件需求是可…

汉诺塔递归解决思路图解分析,python代码实现

目录 4.假设四层汉诺塔,n4,利用整体思想分解为两层的情况 3.分解到n3 3.1 分解上面n4时第一个步骤: 3.2 分解上面n4时第三个步骤: 2.继续分解到n2 (同理略) 1.当分解到n1 python代码 问题&#xff1…

【Linux】升级OpenSSH版本规避远程代码执行漏洞

本文首发于 ❄️慕雪的寒舍 升级OpenSSH版本规避远程代码执行漏洞。 说明 今天早上逛别人的博客的时候看到了这个重磅消息。OpenSSH爆出能远程通过root身份执行任意代码的漏洞&#xff0c;影响版本是 8.5p1 < OpenSSH < 9.8p1&#xff0c;奇安信的报告可以点我查看。 上…

计算机三级网络第4套练习记背

计算机三级网络第4套练习记背

全志/RK安卓屏一体机:医疗自助服务终端,支持鸿蒙国产化

医疗自助服务终端 为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通…

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…

day44.动态规划

718.最长重复子数组 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 思路:1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义: dp[i][j] &#xff1a;以下标i - 1为结尾的A&#xff0c;和以下标j - 1为结尾的B&…

【论文速读】|RO-SVD:一种用于 AIGC 应用的可重构硬件版权保护框架

本次分享论文&#xff1a;RO-SVD: A Reconfigurable Hardware Copyright Protection Framework for AIGC Applications 基本信息 原文作者&#xff1a;Zhuoheng Ran, Muhammad A.A. Abdelgawad, Zekai Zhang, Ray C.C. Cheung, Hong Yan 作者单位&#xff1a;香港城市大学电…

linux 内核代码学习(七)

linux内核代码的研究中断了一段时间了&#xff0c;现在又重新开始了研究&#xff0c;个人觉得linux内核的学习是没有上限的&#xff0c;总是一个温故而知新的过程&#xff0c;是一个不断积累的过程。首先还是要先搭建一个方便自己学习和研究的平台&#xff0c;经过不断的尝试&a…

Java的IO模型详解-BIO,NIO,AIO

一、BIO相关知识 Java 的 BIO (Blocking I/O) 模型是基于传统的同步阻塞 I/O 操作。在这种模型中&#xff0c;每个客户端连接都需要一个独立的线程来处理请求。当线程正在执行 I/O 操作时&#xff08;如读取或写入&#xff09;&#xff0c;它会被阻塞&#xff0c;直到操作完成…

三级_网络技术_55_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)在不改变路由表项的前提下&…

django学习入门系列之第十点《案例 用户登录》

文章目录 案例 用户登录安全认证django中的隐藏值获得用户账户密码空值 往期回顾 案例 用户登录 安全认证 ​ 如果提交数据后&#xff0c;发现并没有跳转到自己想要的界面&#xff0c;是因为django比Flask多一层 ”安全机制“ 的东西 解决方法&#xff1a; {% csrf_token %…

使用maven搭建微服务框架

徒手搭建cloud 1.认准SpringBoot,SpringCloud,SpringCloudAlibaba版本之间的对用关系 官网给出了声明&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki 2.选择好版本之后 spring bootspring cloudspring cloud alibaba2.3.12.RELEASEHoxton.SR102.2.5.REL…

Ps:工具预设面板

Ps菜单&#xff1a;窗口/工具预设 Window/Tool Presets 工具预设 Tool Presets面板可以为 Photoshop 的图像编辑工作带来极大的便利。 定义好相关的工具预设后&#xff0c;可以直接调用&#xff0c;而不管现在处于什么工具或什么样的参数状态&#xff0c;省去了再次设置参数的麻…

使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测

对于 菊岛邦夫—Vineyard Kikushima 而言&#xff0c;Raspberry Pi 生态系统提供了支持和信息&#xff0c;通过基于温度和湿度监测的有针对性的最低限度杀虫剂方案&#xff0c;来提高葡萄的健康产量。 Vineyard Kikushima&#xff1a;http://vykikushima.greater.jp/vineyards…

finalshell 用 root 账号连接 ubuntu

我们平时在操作 linux 系统时&#xff0c;经常需要上传文件&#xff0c;修改文件&#xff0c;普通账号只能通过 vim 等工具修改&#xff0c;诸多不便。为了实现跟 windows 一样&#xff0c;双击直接编辑保存&#xff0c;需要下面步骤。 1. ubuntu 安装 ssh 1.1 安装 SHH 服务…

LuaJit分析(十)luajit自定义修改

通过分析luajit字节码文件格式可知&#xff0c;luajit文件由文件头和原型数组组成&#xff0c;而原型又包括原型头和原型体&#xff0c;文件头中包含了字节码文件的一些关键信息&#xff0c;目前的反编译工具根据标准的luajit2.0文件格式解析文件&#xff0c;如果对字节码文件的…

[Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

目录 1.哈夫曼编码1.题目链接2.算法原理详解 && 代码实现 2.abb1.题目链接2.算法原理详解 && 代码实现 3.旋转字符串1.题目链接2.算法原理详解 && 代码实现 1.哈夫曼编码 1.题目链接 哈夫曼编码 2.算法原理详解 && 代码实现 哈夫曼编码&…