zoukankan      html  css  js  c++  java
  • 分布式生成唯一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,如果在竞争较大的情况下,需要考虑使用分布式锁。因此,性能在高并发的分布式环境下,也不甚理想。

  • 相关阅读:
    win7上装红米4手机驱动提示空间不足
    HBuilder中改造console.info
    Thinkphp 出现 “_CACHE_WRITE_ERROR” 错误的可能解决办法
    Linux上跑两个版本的php,5.4.45和5.3.24
    JavaScript中对日期格式化的新想法.
    怪不得知乎急着招前端开发.
    菜鸟利用python处理大文本数据的血泪路
    Python:数字
    Python:列表,元组
    Python:映像、集合
  • 原文地址:https://www.cnblogs.com/Jomini/p/13848097.html
Copyright © 2011-2022 走看看