几乎所有的业务系统,都存在生成惟一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*(2^12),也就是409.6W的ID。最大支持2^10,也就是1024个节点。
    优点:性能满足要求,满足扩展性与伸缩性要求
    缺点:对服务器时间要求必须准确,如果时间往前调,可能造成与旧的ID冲突。
    8、自定义ID算法
    参考SnowFlake算法,通常为时间+(多段)自定义字段,从而实现趋势递增。
    优点:定制化,性能满足要求,满足扩展性与伸缩性要求
    缺点:同方法7

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

惟一ID生成方法的更多相关文章

  1. 关于全局唯一ID生成方法

    引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  2. 细聊分布式ID生成方法

    细聊分布式ID生成方法 https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=403837240&idx=1&sn=ae9 ...

  3. 分布式环境下的id生成方法

    分布式环境下的id生成方法   前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...

  4. Twitter的分布式系统中ID生成方法——Snowflake

    Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...

  5. 分布式ID生成方法-趋势有序的全局唯一ID

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

  6. 【58沈剑架构系列】细聊分布式ID生成方法

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

  7. 160302、细聊分布式ID生成方法

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

  8. 分布式id生成方法

    系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...

  9. 【转载】细聊分布式ID生成方法

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

随机推荐

  1. STL priority_queue

    priority_queue 优先队列(Priority Queues):顾名思义,一个有着优先级的队列.它是一种ADT,和队列的思想差不多—— 排队,数据结构中的队列是不能插队的,不能颠倒排队的顺序 ...

  2. 编译内核时报错./include/net/sch_generic.h:535:28: error: inlining failed in call to always_inline 'qdisc_pkt_len': indirect function call with a yet undetermined callee static inline unsigned int qdisc_pkt_

    直接修改头文件include/net/sch_generic.h中的qdisc_pkt_len函数 将static inline unsigned int qdisc_pkt_len修改为: stat ...

  3. MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》

    最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...

  4. [go]go环境安装-解决安装包不能访问golang.org问题

    安装go和vscode vscode插件列表选择go,安装即可,其他插件暂不安装 手动安装一些vscode配套的调试工具等 直接vscode-go,然后点下面的go-tools就能找到 go get ...

  5. iOS证书详解--转载

    一.成员介绍1.    Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1)    Developer Certification(开发证书)安装在电脑上 ...

  6. java文件分片上传,断点续传

    百度的webUploader的前端开源插件实现的大文件分片上传功能 前端部分 前端页面代码如下,只需要修改自己的文件上传地址接口地址: <!DOCTYPE html> <html l ...

  7. wpf 父控件和子控件 各自触发鼠标按下事件

    父控件 PreviewMouseDown子控件 MouseDown

  8. 表视图为Group类型的注意问题

    使用group类型的tableview时,第一个section距离navigationbar的距离很大,不符合这边的设计图. 使用 myTableView . sectionHeaderHeight  ...

  9. 【D3D12学习手记】The Swap Chain and Page Flipping

    为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...

  10. 转:async异步、thread多线程

    很全面的知识,转来留着 1:https://www.cnblogs.com/xibei/p/11826498.html 2:https://www.cnblogs.com/xibei/p/118742 ...