分布式生成唯一id

一、使用UUID

  使用 UUID, UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。

  UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。


  优点:
  1)简单,代码方便。
  2)生成ID性能非常好,基本不会有性能问题。
  3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。

 

  缺点:
  1)没有排序,无法保证趋势递增。
  2)UUID往往是使用字符串存储,查询的效率比较低。
  3)存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。
  4)传输数据量大
  5)不可读。

 

二、使用 redis 

  当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。

  比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。可以每天在Redis中生成一个Key,使用INCR进行累加。

 

  优点:
  1)不依赖于数据库,灵活方便,且性能优于数据库。
  2)数字ID天然排序,对分页或者需要排序的结果很有帮助。

 

  缺点:
  1)如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
  2)需要编码和配置的工作量比较大

 

三、利用zookeeper生成唯一ID

  zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。

  很少会使用zookeeper来生成唯一ID。主要是由于需要依赖zookeeper,并且是多步调用API,如果在竞争较大的情况下,需要考虑使用分布式锁。因此,性能在高并发的分布式环境下,也不甚理想。

posted @ 2020-10-20 18:20  抽象Java  阅读(147)  评论(0编辑  收藏  举报