生成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)。
      缺点:查询慢。

数据库自增ID

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

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

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

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位了。
      缺点:依赖服务器时间。

Redis

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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页