分布式-全局ID生成

为什么存在全局ID这个问题?

在分布式环境下,数据库是可以拆分(sharding)的,一张表的自增机制(比如MySQL)只能保证该表唯一,在 数据合并到历史库,迁移或查询,如果出现id冲突无异于噩梦。那么业界有哪些方案呢? 

  • UUID
    首先,UUID有以下几部分组成:
    • 当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余部分相同。
    • 时钟序列
    • 全局唯一的IEEE机器识别号。如果有网卡,从网卡MAC地址获得,没有网卡从其他地方获得。

        优势:API简单、易用。

        不足: 占用空间大,字符串本身无法加工,可读性不强。

  • ID生成表模式
    使用Mysql自增长ID的机制,先创建单独的数据库,然后创建一个表:
    CREATE TABLE `tickets` {
        `id` bigint(20) unsigned NOT NULL auto_increment,
        `stub` char(1) NOT NULL default '',
        PRIMARY KEY(`ID`),
        UNIQUE KEY `stub` (`stub`)
    } ENGINE=MyISAM

    可以使用 如下的SQL,在一个事务里提交

    REPLACE INTO ticket(stub) VALUES('a');
    SELECT LAST_INSERT_Id();

    这个方案优势简单易用,也有一定的高可用性方案,不足是使用了mysql数据库的独特语法 REPLACE INTO 

  • redis生成ID
    Redis的所有命令操作都是单线程的,本身提供像 incr 和 incrby这样的自增原子命令,所以能保证生成的ID肯定是唯一有序的。
    优点:不依赖与数据库,灵活方便,且性能高于数据库;数字ID天然排序,对分页或者需要排序的结果很有帮助。
    缺点:如果系统中没有Redis,还需要引入新的组件,增加系统复杂度;需要编程编程和配置的工作量比较大。
  • Snowflake
    Twitter开发了一套全局的ID生成服务:Snowflake。snowflake系统生成64位的ID。由3部分组成:
    • 41位的时间序列(精确到毫秒,41位的长度可以使用69年)
    • 10位的机器标识(10位的长度最多支持部署1024个节点)
    • 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

       优点:高性能、低延迟;独立的应用;按时间有序

       缺点:需要独立的开发和部署

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值