分布式id如何生成

后端bug开发工程师
• 阅读 624

1.UUID生成

通过网卡、时间、随机数来保证生成的唯一的字符串。 优点: (1)本地生成,生成简单 (2)速度快 (3)高可用; 缺点: (1)无序,如果存入mysq,影响B+的操作性能,因为B+树是需要排序的; (2)占用空间较大(36个字符);

2.数据库自增长

优点: (1)生成简单; (2)严格递增; 缺点: (1)性能较差 (2)可靠性较差。

3.通过mysql批量生成

记录max_id,然后通过update t set max_id=max_id+step where max_id=last_id;这种乐观锁更新的方式保证唯一性,然后可以提前生成两批放在本地内存中,能够提升性能。 优点: (1)相比方案2性能更佳; 缺点: (1)还是依赖数据库的稳定性; (2)因为id是一批批存在本地服务器中的,如果服务器重启可能造成id不连续。

4.使用redis的incr来生成

优点:性能较高 缺点:redis如果出现问题,可能导致id重复

5.雪花算法:

实现原理:总共64个2二进制位:从左往右 第一位为固定的0,代表正整数 接下来的41位表示时间戳,精确到毫秒,值为当前时间戳-算法开始时间戳; 接下来10位用来表示机器的机房id、机器编号; 接下来的12位用来表示同一毫秒的自增序号。 这个算法的关键是如何生成机房id,和机器编号 其实有两种方案 (1)通过redis来生成,通过lua脚本来保证原子性:使用hash结构,有两个key,一个是机房id ,一个是机器id,刚开始机房id=0,机器id=0,服务启动的时候,先判断机器id是否等于31了?如果等于则机房id+1,机器id设置为0,循环往复; (2)通过生成zk的永久顺序节点,不过现在很多都是容器启动,ip地址会变,就会导致生成很多节点,最好还是换成临时顺序节点; 优点: (1)本地生成,性能较高,按时间有序; 缺点: (1)强依赖机器时间。

6.美团的leaf

主要支持两种模式,一种是方案3,一种是方案5。 针对方案5的时钟问题,leaf做了处理,要求每台机器需要上报时间到zk上面,然后来校验时间是否变化,这种我感觉并没有彻底解决这个问题。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
分布式系统的主键生成方案对比 | 京东云技术团队
UUID​UUID(通用唯一识别码)是由32个十六进制数组成的无序字符串,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。