zoukankan      html  css  js  c++  java
  • 分布式系统ID生成方案

    自增ID

    不错,可以限度抑制ID的大小。但需要有一个中心化的节点作为解决原子性问题。可以选用Redis,MySQL,Zookeeper。成本有点高。

    UUID

    分布式,而且唯一!缺点是生产的ID太长。

    Twitter的SnowFlake算法

    该算法可以生产分布式的自增ID。切生产的ID只有8字节,64位。其数据结构如下:

    • 1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0
    • 41位,用来记录时间戳(毫秒)。

      • 41位可以表示2411个数字,
      • 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2411,减1是因为可表示的数值范围是从0开始算的,而不是1。
      • 也就是说41位可以表示2411个毫秒的值,转化成单位年则是(2411)/(1000606024365)=69
    • 10位,用来记录工作机器id。

      • 可以部署在210=1024个节点,包括5位datacenterId5位workerId
      • 5位(bit)可以表示的最大正整数是251=31,即可以用0、1、2、3、....31这32个数字,来表示不同的datecenterId或workerId
    • 12位,序列号,用来记录同毫秒内产生的不同id。

      • 12位(bit)可以表示的最大正整数是2121=4095,即可以用0、1、2、3、....4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号

    由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。

    该算法生产的Id是在每台机器上都是按时间戳自增的

    可以根据实际需求变动该算法:比如可以工作机器Id长度。扩大序列号和时间戳。

  • 相关阅读:
    475.Heaters java
    爬取豆瓣新热门电影数据
    ORALCE逻辑存储结构
    UnicodeDecodeError: 'utf-8' codec can't decode byte 问题
    ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
    oracle和mysql区别
    ORACLE ITL事务槽
    oracle的锁种类知识普及
    仅主机、NAT、桥接模式
    oracle11g和12c区别
  • 原文地址:https://www.cnblogs.com/shijiaqi1066/p/8618418.html
Copyright © 2011-2022 走看看