分布式ID解决方案

分布式ID解决方案

可供选择的分布式ID方案

  1. UUID
    优点:

    - 简单,代码方便
    - 生成ID性能非常好,基本不会有性能问题
    - 全球唯一,永不重复
    

    缺点:

    - 没有排序,无法保证趋势递增
    - UUID存的是字符串,查询效率比较低
    - UUID 存储空间以及数据传输数据量大
    
  2. 基于数据库的自增ID

  3. 基于 Redis 的自增ID
    使用Redis的原子操作 INCR和INCRBY来实现
    比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+自增长号
    优点:

    - 不依赖于数据库,灵活方便,且性能优于数据库
    - 数字ID天然排序,对分页或者排序的结果有帮助
    
  4. 基于MongoDB的ObjectId

  5. Snowflake
    twitter 开发的一套全局唯一ID生成服务 Snowflake

    1. 41位的时间序列(精确到毫秒,41位的长度可以使用69年)
    2. 10位的机器标识(10为的长度最多支持1024个节点部署)
    3. 12位的计数序号
  6. 类snowflake算法

    1. 百度的uid-generator
    2. 美团Leaf

本人比较偏向于基于Redis的方式生成自增ID。现在的项目基本都会引入Reids做缓存中间件,因此不会因为额外的组件。生产环境中的Reids,基本上都基于主从,或者集群可以防止单点故障。
同时代码实现也比较简单。比如ID = YYYYMMDD + 自增长号。后台使用两个字段值来作为ID,排序时先根据时间,再根据自增长ID进行排序。