生成ID的方法

UUID

      UUID是通用惟一识别码(Universally Unique Identifier)的缩写。在Java中使用UUID.randomUUID();来生成一个UUID。
      UUID是一组由16进制组成的32位数。组成是:当前日期+时间+时间序列+机器识别号(全局惟一的IEEE机器识别号,若是有网卡,从网卡MAC地址得到,没有网卡以其余方式得到。)
      标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。
      缺点:查询慢。java

数据库自增ID

      在关系型数据库都实现数据库自增ID。mysql

  • mysql中经过auto_increment,数据库就会自动赋值。设置auto_increment_increment能够设置步长也就是一次加几,auto_increment_offset能够设置初始值从几开始。

      缺点:DB单点故障、扩展性。git

Snowflatke(雪花算法)

      Twitter的工程师为实现递增而不重复的ID实现的。它是开源的在github能够找到源代码。
snowflake
- 1位标识部分,在java中因为long的最高位是符号位,正数是0,负数是1,通常生成的ID为正数,因此为0。
- 41位时间戳部分,这个是毫秒级的时间,通常实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样能够使产生的ID从更小值开始;41位的时间戳能够使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年。
- 10位节点部分,Twitter实现中使用前5位做为数据中心标识,后5位做为机器标识,能够部署1024个节点。
- 12位序列号部分,支持同一毫秒内同一个节点能够生成4096个ID(自增)。
      最后它会转换成18位长整型,随着时间的增加位数会变多,好比以2010年1月1日为epoch,则差很少到2017年中就19位了。
      缺点:依赖服务器时间。github

Redis

      Redis是开源、高性能,基于键值对的储存系统,它的值能够是String、Map、List、Sets、SortedSets类型。12位。
      缺点:占用宽带、Redis集群维护。web