几乎所有的业务系统,都存在生成惟一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. Linux 安全工具之extundelete误删除恢复

    一:前言 在Linux中,我们通常会因为误删除文件而感到烦恼,rm -rf +文件  rf参数简直就是每个运维的噩梦,但是大家想过没,为什么删除文件那么快呢,为什么我们copy文件的时候那么慢. 其实 ...

  2. Android studio 项目支持JNI方法

    步骤: 1. build.gradle 配置如下,主要两项 ndk 和 sourceSets apply plugin: 'com.android.application' android { com ...

  3. Linux - 搭建Web项目(Django + nginx + uwsgi)

    工作中碰到需要使用Django + nginx + uwsgi 搭建项目环境 1. 搭建基本环境 需要有python环境,不多做说明 需要安装nginx,不多做说明 需要安装uwsgi: yum in ...

  4. CSS display的几个常用的属性值,inline , block, inline-block

    1.解释一下display的几个常用的属性值,inline , block, inline-block inline(行内元素): 使元素变成行内元素,拥有行内元素的特性,即可以与其他行内元素共享一行 ...

  5. ubuntu快速联网

    1:打开ubuntu 2:设置 特殊:red hat设置视频:http://www.jikexueyuan.com/course/1349_3.html?ss=1

  6. 八十四:redis之redis的集合、哈希操作

    set集合操作 添加元素:sadd set value1 value2... 查看元素:smembers set 移除元素:srem set member 查看集合中的元素个数:scard set 获 ...

  7. Spring Boot Application后台守护Daemon应用

    本地代码启动不报错,部署到服务器之后出现如下一个错误. 系统的日志如下: Error starting ApplicationContext. To display the conditions re ...

  8. H3C 模拟器 pc与sw直连 登录web

    配置与上一节相同 开启web功能,并登录 [sw1]ip http enable [sw1]local-user admin New local user added. [sw1-luser-mana ...

  9. C学习笔记-枚举

    枚举定义 可以使用枚举(enumerated type)声明代表整数常量的符号名称,关键字enum创建一个新的枚举类型 实际上,enum常量是int类型的 枚举的本质就是int型的常量 enum sp ...

  10. 2 基于梯度的攻击——PGD

    PGD攻击原论文地址——https://arxiv.org/pdf/1706.06083.pdf 1.PGD攻击的原理 PGD(Project Gradient Descent)攻击是一种迭代攻击,可 ...