惟一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*(2^12),也就是409.6W的ID。最大支持2^10,也就是1024个节点。
优点:性能满足要求,满足扩展性与伸缩性要求
缺点:对服务器时间要求必须准确,如果时间往前调,可能造成与旧的ID冲突。
8、自定义ID算法
参考SnowFlake算法,通常为时间+(多段)自定义字段,从而实现趋势递增。
优点:定制化,性能满足要求,满足扩展性与伸缩性要求
缺点:同方法7
总结: ID生成算法常见做法无非三类:利用中间件,ID生成服务,本地ID生成算法。利用中间件一般又分为利用数据库、Redis和其它中间件实现;独立的ID生成服务通常是少量代码+中间件实现,而服务既可以单独部署,也可以随业务系统共同部署;本地ID生成算法,以SnowFlake算法作为参考,可以实现自定义的ID生成算法。
惟一ID生成方法的更多相关文章
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- 细聊分布式ID生成方法
细聊分布式ID生成方法 https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=403837240&idx=1&sn=ae9 ...
- 分布式环境下的id生成方法
分布式环境下的id生成方法 前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...
- Twitter的分布式系统中ID生成方法——Snowflake
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...
- 分布式ID生成方法-趋势有序的全局唯一ID
一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...
- 【58沈剑架构系列】细聊分布式ID生成方法
一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...
- 160302、细聊分布式ID生成方法
一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...
- 分布式id生成方法
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- 【转载】细聊分布式ID生成方法
一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...
随机推荐
- mongodb 操作笔记
切换库:use 库名 显示所有的数据库:show dbs 创建集合:db.createCollection("collection_name",{capped:true,size: ...
- 私有npm计划
为什么要建立私有npm 提高代码复用程度,增加团队沉淀 剥离项目依赖,工程更加轻量 引用全量更新,支持版本降级 建立模块文档,降低上手难度 全员把关代码质量,无需重复测试 构建工具已成趋势,优化发布流 ...
- python内存泄露memory leak排查记录
问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...
- 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式
package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...
- Linux性能分析之上下文切换
而在每个任务运行前,CPU 都需要知道任务从哪里加载.又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器 CPU 寄存器,是 CPU 内置的容量小.但速度极快的内存.而程序 ...
- firefox浏览器插件---网址优化
安装:YSlow插件 之后还必须安装firebug.否则YSlow不能使用. 安装:firebug 下面就可以了
- Jmeter之Cookie和Session处理
Jmeter之Cookie和Session处理 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: 2.Session 添加方式:线程组-前置处理器 -HTTP U ...
- DateTime.UtcNow 协调通用时间(UTC)
1.协调通用时间(UTC) 2.本地时间和UTC时间相互转化 DateTime localDateTime = DateTime.Now;//本地时间 DateTime utcDateTime = D ...
- Vue路由的跳转方式
Vue中路由的跳转方式 一.<router-link to=''></router-link> Header.vue <template> <header&g ...
- SQL常见面试题(学生表_课程表_总表)
问题描述: 为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号 ...