美文网首页
如何生成全局唯一

如何生成全局唯一

作者: swoft_ | 来源:发表于2019-08-21 20:06 被阅读0次

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宕机会造成整个系统不可用。

相关文章

  • 分布式系统中生成全局唯一ID方案

    本文主要介绍在一个分布式系统中, 如何去生成全局唯一的 ID。 前言 单纯的生成全局ID并不是什么难题,生成全局的...

  • 如何保证 ID 的全局唯一性?

    如何保证 ID 的全局唯一性? 分库分表之后如何生成全局唯一的数据库主键呢? 数据库中的主键如何选择? 数据库中的...

  • 如何生成全局唯一

    uuid UUID由以下几部分的组合:(1)当前日期和时间。(2)时钟序列。(3)全局唯一的IEEE机器识别号,如...

  • Redis-全局唯一ID

    零、本文纲要 一、全局唯一ID 二、Redis生成全局唯一ID1、snowflake算法全局唯一ID策略2、Red...

  • 设计分布式唯一id生成

    1. 生成全局唯一id 什么时候需要生成全局唯一id db不帮你自动生成的时候。比如: db做了分库分表,没帮你自...

  • 如何生成全局唯一ID

    面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id...

  • 如何生成全局唯一id

    为什么需要全局唯一id 在分布式架构下,经常有需求需要生成全局唯一id,比如优惠券等券码,或者分库分表,每个表都用...

  • 分布式唯一Id(雪花算法),原理+对比+方案

    集群高并发情况下如何保证分布式唯一全局Id生成 为什么需要分布式全局唯一Id,以及分布式Id的业务需求 在复杂分布...

  • 生成全局唯一id的几种方式

    生成全局唯一id的几种方式: 1、uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高;缺点...

  • 全局唯一ID生成策略

    Entrance 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是什么难题,...

网友评论

      本文标题:如何生成全局唯一

      本文链接:https://www.haomeiwen.com/subject/xvoisctx.html