首页 > 其他分享 >分布式id

分布式id

时间:2023-07-30 23:11:49浏览次数:35  
标签:存储 递增 生成 MySQL 服务器 id 分布式

自增id

b + 树节点是有序的,所以id最好也是有序的,这样存储数据效率高一点,如果不是递增的,那讲数据存储到数据库中效率较低,还得找树的值,递增的话直接按id插入到树中即可,而乱序则还得找相应的位置才能进行插入。

  • 趋势递增:总体来看顺序是递增的。
  • 单调递增:下一个一定比上一个大。
  • 信息安全:如果id是连续的,那么恶意用户可以根据id来判断 出总体数据量大小。

UUID

性能较高,jdk本地类就可以自己生成
缺点:

  • 长度太长,在Mysql中存储的长度越短效率越高,存储到MySQL中效率较低
  • UUID是无序的。存储到MySQL中还得计算树节点的位置,所以效率较低,不适合互联网。
  • 不安全,可以根据UUID获取到MAC地址,最新版好像已经解决了这个问题。
  • 无法进行范围查询。

雪花算法

image
1bit: 符号位,不做处理。
4bit: 时间戳,单位是毫秒。
10bit: 工作机器id,一般是这样用的: 前五位用来表示机房id,后五位来表示每个机房下的每台机子的id,具体问题具体分析,根据项目的不同,自定义的操作也不同。
12bit: 自增id,每毫秒能生成2^12个不同的id。

优点:

  • 递增
  • 安全 没办法根据时间范围判断出记录条数,每毫秒可以生成2^12个id,但是不是每毫秒都能生成这么多id。

缺点:

  • 由于雪花算法是根据时间戳来生成id的,所以如果时间回拨的话,可能会出现重复的问题。在日常使用计算机的过程中,计算机会定时去向服务器去同步时间,如果服务器时间与本地时间不同的话会进行设置,这时候可以出现回拨,因为CPU是通过震荡来计算当前时间的,一旦运行时间过长,那么会有误差,所以需要与服务器同步。

雪花算法变种

百度uid generator

github: https://github.com/baidu/uid-generator

分布式id服务

MySQL

之前所说的MySQL自动生成的id是无法生成全局唯一id的,所以我们可以新建一张表,中的其中一个字段专门生成id,其他表需要使用id的时候直接去这张表中获取,这样就能保证了全局唯一id。
MySQL对数据进行读写时需要对磁盘进行io,磁盘io性能并发较差。每次业务操作都需要读写一次数据库表,数据库压力会很大。
可以加MySQL 副本来增加服务器,根据服务器的不同,生成不同的id,例如有两台MySQL服务器,一台服务器生成偶数id,一台服务器生成奇数id。

Redis

redis也可以实现这个操作,只要专门设置一个key了存储自增id,每次获取id的时候,直接进行自增即可。redis原子性且性能号。
由于redis是内存数据库,一旦服务down调,那么服务器中保存的id会消失,而redis的持久化机制是根据规则来进行持久化,在持久化的过程中,每到达规则,这时候挂掉,每持久化数据,那么id就会丢失一部分,id可能会出现重复。

分布式id微服务

美团leaf

美团在雪花算法中进行了加强,

标签:存储,递增,生成,MySQL,服务器,id,分布式
From: https://www.cnblogs.com/lyraHeartstrings/p/17591756.html

相关文章

  • Linux环境Arduino IDE中配置ATOM S3
    linux选择ubuntu发行版。硬件设备有多小呢:功能超级强大。之前的ROS1和ROS2案例已经全部移植完成并测试结束(三轮纯人力校验......
  • 【题解】[ABC312E] Tangency of Cuboids(adhoc)
    【题解】[ABC312E]TangencyofCuboids少见的at评分\(2000+\)的ABCE题,非常巧妙的一道题。特别鸣谢:@dbxxx给我讲解了他的完整思路。题目链接ABC312E-TangencyofCuboids题意概述给定三维空间中的\(n\)个长方体,每个长方体以其一条体对角线的两个端点的坐标形式......
  • mermaid学习笔记
    mermaid功能(基础)关于设计各种图来梳理工程接口流程图定义graph[TB|BT|LR|RL]说明是流程图(参数代表从上往下还是从左往右)其他概念---:实线|-->:带箭头实线|==>:带箭头粗实线并且在也可以(==|--)text(--|==)(-|>)来实现线上有文本的格式定义对象:对象[xxx]代表......
  • 解决报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 13:
    data_frame=pd.read_csv(Filepath,encoding='utf8')在使用上述代码读取csv文件时报错“UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xa1inposition13:invalidstartbyte”上述报错是说:“utf-8”编解码器无法解码位置13中的字节0xa1:无效的起始字节此时,可以......
  • IDEA设置
    IDEA设置1.字体大小设置File->Settings->Editor->Font2.取消自动更新File->Settings->Appearance&Behavior->SystemSettings->Updates3.代码提示忽略大小写File->Settings->Editor->CodeCompletion->Matchcase4.修改项目文件等......
  • bitwarden 私有化部署android无法登陆问题解决
    安卓版bitwarden安装使用中登陆提示“发生错误。Exceptionmessage:java.security.cert.CertPathValidatorException:Trustanchorforcertificationpathnotfound.”这个错误是因为Bitwarden的证书文件中缺少中间证书导致安卓系统的证书校验异常解决方式,生成带证书链的证......
  • CSS 浅探flex布局中使用的overflow ,及width/height=0
    关于overflow,w3school定义是:overflow:auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。我对于overflow:auto的初级理解是,设置父元素height/width,若子元素溢出,则自动显示纵向/横向滚动条。很长时间我是这么理解的,但是现在和flex布局一起就发现有点问题,在深入了解后......
  • 编辑centos系统 硬盘 的uuid 和系统启动硬盘分区的uuid
    硬盘的UUID是为系统中的存储设备提供的唯一标识字符串,不管设备是什么类型的,都需要在系统中添加新的设备,例如硬盘,如果添加错误会造成系统找不到硬盘启动失败,我们在挂在分区的过程中需要找到分区的UUID表示,写到fstab文件中,这样系统在启动的时候就能找到分区为UUID的表示,如果找......
  • Linux命令uuidgen是什么意思?
     Linux命令uuidgen用于生成一个128位的唯一标识符(UUID,UniversallyUniqueIdentifier),其基于时间戳和MAC地址等信息生成,用于标识不同的文件、对象等。可以用于创建唯一的文件名、数据库记录等。命令语法: uuidgen[OPTIONS]OPTIONS为可选参数,常用的参数有:–-r,–random:基......
  • 【题解】[ABC312G] Avoid Straight Line(容斥,树上统计,dfs)
    【题解】[ABC312G]AvoidStraightLine题目链接[ABC312G]AvoidStraightLine题意概述给定一棵\(n\)个节点的树,第\(i\)条边连接节点\(a_i\)和\(b_i\),要求找到满足以下条件的三元整数组\((i,j,k)\)的数量:\(1\lei<j<k\len\);对于树上任意一条简单路径,都不同时经......