zoukankan      html  css  js  c++  java
  • 惟一ID生成方法

    几乎所有的业务系统,都存在生成惟一ID的需求,例如:
    用户ID:user_id
    订单ID: order_id
    消息ID: msg_id

    常见的ID生成有三大类方法:

    一、中间件实现

    1、利用Mysql的auto_increment,Oracle的Sequence实现
    优点:简单,递增
    缺点:伸缩性、扩展性差

    2、利用Redis的Incr实现
    优缺点:同方法1,但由于Redis是内存操作,性能较方法1好 (需考虑Redis序列化配置与性能之间的取舍权衡)

    3、利用其它中间件实现

    二、独立的ID生成服务

    4、批量ID生成服务
    方法1之所以性能不高,是因为每次生成ID都需要访问数据库,所以数据库的压力大。可以考虑每次从数据库里取一批ID,缓存到本地,用完一批之后再访问数据库取下一批,即批量ID生成服务。
    优点:性能较方法1大幅提高,数据库压力大大降低
    缺点:服务重启后会出现ID”空洞”,另一方面,为了实现惟一ID需求,引入独立的服务,使系统复杂性提高

    5、其它的服务代码+中间件实现独立的ID生成服务
    一般来说:服务代码可以单独部署,业务系统通过RPC或HTTP方式调用它。也可以服务代码与业务系统部署在一起,业务系统通过进程内的方法调用来调用它。

    三、本地ID生成算法

    6、UUID
    优点:无限扩展
    缺点:太长 ,无序,对B-Tree索引字段,索引成本过高

    7、SnowFlake算法
    核心思想为一个long型的ID:

    • 41bit作为毫秒数
    • 10bit作为机器编号
    • 12bit作为毫秒内序列号
    • 算法单节点每秒理论上最多可以生成1000*(212),也就是409.6W的ID。最大支持210,也就是1024个节点。
      优点:性能满足要求,满足扩展性与伸缩性要求
      缺点:对服务器时间要求必须准确,如果时间往前调,可能造成与旧的ID冲突。
      8、自定义ID算法
      参考SnowFlake算法,通常为时间+(多段)自定义字段,从而实现趋势递增。
      优点:定制化,性能满足要求,满足扩展性与伸缩性要求
      缺点:同方法7

    总结: ID生成算法常见做法无非三类:利用中间件,ID生成服务,本地ID生成算法。利用中间件一般又分为利用数据库、Redis和其它中间件实现;独立的ID生成服务通常是少量代码+中间件实现,而服务既可以单独部署,也可以随业务系统共同部署;本地ID生成算法,以SnowFlake算法作为参考,可以实现自定义的ID生成算法。

    欢迎转载,转载请务必注明出处
  • 相关阅读:
    WinForm画网格并填充颜色
    CodeCombat最后一题GridMancer
    TeeChart缩放
    TeeChart的网络资料
    TeeChart设置图表的标题
    TeeChart取消3D
    TeeChart的坐标轴
    TeeChart入门
    win7下配置IIS
    C#中的编译开关
  • 原文地址:https://www.cnblogs.com/mzsg/p/11977825.html
Copyright © 2011-2022 走看看