如何生成全局唯一

uuid

UUID由以下几部分的组合:
(1)当前日期和时间。
(2)时钟序列。
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),以连字号分为五段形式的36个字符,示例:550e8400-e29b-41d4-a716-446655440000

优点:性能非常高:本地生成,没有网络消耗。

缺点:太长

SnowFlake雪花算法(美团)64-bit

1 符号位 +
41时间戳(当前时间戳- 开始使用的时间戳) +
10机器标示(5位机房id+5位机器id) +
12位序列(毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号)

优点:
简单高效,生成速度快。
时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序递增。
灵活度高,可以根据业务需求,调整bit位的划分,满足不同的需求。
qps:409w/s

缺点
依赖机器的时钟,如果服务器时钟回拨,会导致重复ID生成。
在分布式环境上,每个服务器的时钟不可能完全同步,有时会出现不是全局递增的情况。

数据库自增id

优点:简单,可靠性高。
确定:依赖数据库,id生成依赖数据库的写性能

数据库优化:根据步长,搞多台数据库
缺点:定义好步长之后不易扩展。写还是依赖数据库

优化:数据库定义

+-------------+--------------+------+-----+-------------------+-----------------------------+-----------------------------+
| Field       | Type         | Null | Key | Default           | Extra                       | commoent
+-------------+--------------+------+-----+-------------------+-----------------------------+-----------------------------+
| type        | varchar(128) | NO   | PRI |                   |                             | 业务
| max_id      | bigint(20)   | NO   |     | 1                 |                             | 最大的id
| step        | int(11)      | NO   |     | NULL              |                             | 步长
| desc        | varchar(256) | YES  |     | NULL              |                             |  业务描述
| update_time | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 更新时间
+-------------+--------------+------+-----+-------------------+-----------------------------+-----------------------------+

重要字段说明:type用来区分业务,max_id表示该type目前所被分配的ID号段的最大值,step表示每次分配的号段长度。原来获取ID每次都需要写数据库,现在只需要把step设置得足够大,比如1000。那么只有当1000个号被消耗完了之后才会去重新读写一次数据库。读写数据库的频率从1减小到了1/step

缺点:
ID号码不够随机,能够泄露发号数量的信息,不太安全。
TP999数据波动大,当号段使用完之后还是会hang在更新数据库的I/O上,tg999数据会出现偶尔的尖刺。
DB宕机会造成整个系统不可用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID 一, 问题描述 在分布式系统存在多个 Shard 的...
    hanayona阅读 6,243评论 0 5
  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id...
    幸福乐呵呵阅读 3,764评论 0 0
  • 为什么需要全局唯一id 在分布式架构下,经常有需求需要生成全局唯一id,比如优惠券等券码,或者分库分表,每个表都用...
    cyrilsun阅读 9,538评论 0 50
  • 为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金...
    爱情小傻蛋阅读 3,382评论 0 0
  • 每天脑子到底在想什么 自己也不知道 思想很多 身体很空 没有什么用的 遗忘在星空
    一凡SU阅读 1,364评论 0 0

友情链接更多精彩内容