分布式ID生成的几种方案(后续待补充)

news2024/12/23 18:01:40

分布式ID生成的几种方案

分布式ID的特性

唯一性:确保生成的ID是全网唯一的;
高可用性:确保任何时候都能正确的生成ID;

UUID

算法核心思想是结合机器的网卡、当地时间、一个随机数来生成UUID;
优点:
本地生成,生成简单且性能好,没有网络消耗;
缺点:

  1. 不易存储:UUID长度过长,16字节128位,通常以36长度的字符串表示,很多场景不适用;
  2. 信息不安全:给予MAC地址生成UUID的算法可能造成MAC地址泄露;
  3. ID作为逐渐是在特定的环境会存在一些问题,比如DB逐渐的场景下,UUID就非常不适用;
  • ① MySQL官方明确的建议逐渐要尽量越短越好,36字符长度的UUID不符合要求
  • 对MySQL索引不利:如果作为数据库逐渐,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

数据库自增ID

使用数据库的ID自增策略,如MySQL的auto_increment。并且可以使用两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。
优点:

  1. 简单易用:大多数数据库都支持自增ID,使用起来非常方便,只需要在创建表的时候设置ID字段为自增即可。
  2. 保证唯一性:数据库自增ID可以保证在同一张表中的唯一性。
  3. 性能高:数据库自增ID的生成速度非常快,因为它只是简单地在上一个ID的基础上加1。

缺点:

  1. 不适合分布式系统:在分布式系统中,如果每个数据库节点都生成自增ID,可能会导致ID冲突。
  2. 无法预知ID:由于ID是在插入数据时由数据库生成的,所以在插入数据前无法知道ID的值。
  3. ID可能会耗尽:如果ID字段的类型设置得不合理,可能会导致ID提前耗尽。

Redis生成ID

Redis的所有命令操作都是单线程的,本身提供像incr和increby这样的自增原子命令,所以能保证生成的ID肯定是唯一有序的;
优点:

  1. 适合分布式系统:Redis可以生成全局唯一的ID,适合在分布式系统中使用。
  2. 可以预知ID:在插入数据前,可以先从Redis中获取到ID。

缺点:

  1. 需要额外的服务:需要运行一个Redis服务。
  2. 性能可能较低:虽然Redis是内存数据库,读写速度非常快,但是由于网络通信的延迟,生成ID的速度可能会比数据库自增ID慢。
  3. 数据持久性问题:如果Redis服务出现故障,可能会导致ID丢失。

类雪花算法

这种方案大致来说是一种以为划分命名空间来生成ID的一种算法,这种方案吧64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:
在这里插入图片描述

优点:

  1. 全局唯一性:在分布式系统中,雪花算法可以生成全局唯一的ID;
  2. 高效率:雪花算法可以在短时间内生成大量的ID;
  3. 无需以来数据库:与数据库自增ID相比,雪花算法不需要依赖数据库,避免了数据库的IO操作;
  4. ID趋势递增:雪花算法生成的ID是趋势递增的,这对于需要排序的场景非常有用。
  5. 可以根据自身业务特性分配bit位,非常灵活。

缺点:

  1. 机器时钟回拨问题:如果服务器的系统时间回拨,可能会导致ID重复
  2. ID含义暴露:由于雪花算法的ID是由时间戳、机器ID等组成,可能会暴露一些系统信息;
  3. 依赖机器硬件:雪花算法依赖机器ID和数据中心ID,需要在物理环境中尽显配置;
  4. ID可能会耗尽:如果单机的请求量过大,可能会在1毫秒内用完可以生成的ID

参考文献:
https://tech.meituan.com/2017/04/21/mt-leaf.html

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

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

相关文章

深度学习的数学基础--Homework2

学习资料:https://www.bilibili.com/video/BV1mg4y187qv/?spm_id_from333.788.recommend_more_video.1&vd_sourced6b1de7f052664abab680fc242ef9bc1 神经网络的特点:它不是一个解析模型,它的储存在一堆参数里面(确定一个超平…

sql注入方式之联合注入

1.1 靶场环境 系统centos7 IP地址192.168.1.24 1.2 联合注入原理 联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的字段要数要相同,不然会出现报错。 1.3 找注入点 找注入点,当输入id1 an…

环形链表 II - LeetCode 热题 26

大家好!我是曾续缘😛 今天是《LeetCode 热题 100》系列 发车第 26 天 链表第 5 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环&#xf…

linux特殊引号

可见引号的不同,可以实现对不同内容的引用以及解析

近50位科技企业大咖齐聚共探出海之道,中国企业出海应该怎么卷?

4月2日下午,由中国云产业联盟暨中关村云计算产业联盟(简称“云联盟”)组织召开的“科技企业出海经验分享”专题闭门研讨会成功召开,云联盟执行会长兼秘书长龚梅,云联盟副秘书长、汉能投资董事总经理赵兰洋以及来自中国…

若依自带vue-cropper上传图片(可旋转、缩放)

2024.4.4今天我学习了如何使用若依的vue-cropper上传图片组件,在工作中遇到一个需求,需要对上传的图片进行旋转的操作,然后我先找到el-upload组件,使用之后发现它有一个自动上传和非自动上传的功能,是不是就可以通过非…

二:深入理解 JAVA 内存模型 JMM

目录 1、为什么要有内存模型1.1、为什么要有多级缓存?1.2、缓存一致性问题1.3、处理器优化和指令重排 2、并发编程的三大问题2.1、原子性问题2.2、有序性问题2.3、可见性问题2.4、三大特性 3、什么是内存模型?3.1、概念3.2、内存模型到底是怎么保证缓存一…

自动驾驶基础技术-无迹卡尔曼滤波UKF

自动驾驶基础技术-无迹卡尔曼滤波UKF Unscented Kalman Filter是解决非线性卡尔曼滤波的另一种思路,它利用Unscented Transform来解决概率分布非线性变换的问题。UnScented Kalman Filter不需要像Extended Kalman Filter一样计算Jacobin矩阵,在计算量大…

LeetCode-热题100:K 个一组翻转链表

题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节…

在一台恢复测试机器上验证oracle备份有效性

一 目的 定期将生产环境oracle数据库恢复到一台测试环境数据库服务器上,以验证备份是否有效,是否能正常恢复。 二 环境 这里以恢复orcl1库为例,计划在orcl这个实例上进行恢复测试。 三 实验步骤 3.1 在目标端创建和源端一样的备份目录 ①…

从零开始写 Docker(十)---实现 mydocker logs 查看容器日志

本文为从零开始写 Docker 系列第十篇,实现类似 docker logs 的功能,使得我们能够查查看容器日志。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&#x…

51单片机之自己配串口寄存器实现波特率9600

本配置是根据手册进行开发配置的 1、首先配置SCON 所以综上所诉 SCON 0x40 (0100 0000) 2、PCON不用配置 3、配置定时器1 4、波特率的计算 5、配置AUXR 6、对比 7、实现 8、优化(实现字符串) 引入TI (智能延时&…

加州大学欧文分校英语基础语法专项课程03:Simple Past Tense 学习笔记(完结)

Learn English: Beginning Grammar Specialization Specialization Certificate course 3: Simple Past Tense Course Certificate 本文是学习 https://www.coursera.org/learn/simple-past-tense 这门课的学习笔记,如有侵权,请联系删除。…

Java基础笔记(一)

一、面向对象高级基础 1.Java的动态绑定机制 public class DynamicBinding {public static void main(String[] args) {//a 的编译类型 A, 运行类型 BA a new B();//向上转型System.out.println(a.sum());//40 子类sum()注释后-> 30System.out.println(a.sum1());//30 子类…

STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址:STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB,今…

上传应用程序到苹果应用商店的工具和要点

引言 在今天的移动应用市场中,将应用程序上传到苹果应用商店(App Store)是许多开发者的首要任务之一。然而,不同操作系统下的开发者可能需要使用不同的工具和遵循不同的要求来完成这一任务。本文将介绍在 macOS、Windows 和 Linu…

day75 js 正则表达式 window对象轮播图片调用定时器

一 正则表达式: RegExp 对象: 对字符串执行模式匹配的强大工具。 1 创建正则表达式对象 let reg /模式/修饰符 修饰符 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m", …

kmeans聚类sklearn实现(Python实验)

Kmeans毫无疑问,好用又“便宜”的算法,经常在很多轻量化场景中实现。所谓的“聚类”(Clustering),就是通过欧氏距离找哪些点构成一个簇。假设我们空间中有一堆点,通过肉眼大概可以看出有两簇,思…

rman 物理误删除的整库恢复

故障模拟: 有备份情况下,物理删除了 rm -rf /oraback/* 下的所有文件1 环境准备 备份 rman target / log/oraback/rmanbak/0_rmanbak.log <<EOF run{ delete noprompt backup; allocate channel c1 type disk maxpiecesize 1000M; allocate channel c2 type disk max…

java实战基础------一文搞定maven

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;JAVA实战基础 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处…