惟一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 这个记录标识往往就是数据 ...
随机推荐
- js如何获取鼠标位置
获取鼠标位置,首先需要加载js文件: 然后设置一个div,给定大小: 最后进行具体操作: //首先要先设置一个div,给定大小 <div id="m"></div ...
- group_concat() 函数 拼接字符串长度有限制
最近,在做一个行转列的存储过程,遇到一个问题,问题如下: 我用group_concat()函数 来整合一个月每天的操作量,并将每天的操作量用CONCAT()函数拼接成 “MAX(IF(t.a = '2 ...
- linux读xml文件问题
由于从配置文件中读取到的路径名的最后多了个0x0A,害我折腾了半天. 提示也很奇葩: I/O warning : failed to load external entity 关键是从这个提示看不出是 ...
- swift 高级模式匹配 if case
let age = 22 let sex = "girl" if (sex == "girl" && age >= 18 &&am ...
- Breadcrumb 面包屑
显示当前页面的路径,快速返回之前的任意页面. 基础用法 适用广泛的基础用法. 在el-breadcrumb中使用el-breadcrumb-item标签表示从首页开始的每一级.Element 提供了一 ...
- zabbix(1)基础知识
一.工作原理 一个监控系统运行的大概的流程是这样的: zabbix agent需要安装到被监控的主机上,它负责定期收集各项数据,并发送到zabbix server端,zabbix server将数据存 ...
- vue修饰符 .lazy .number .trim
.lazy 在输入框中,v-model 默认是同步数据,使用 .lazy 会转变为在 change 事件中同步 , 也就是在失去焦点 或者 按下回车键时才更新 <template> < ...
- JS apply 、call和bind
JS当中的call .apply.和bind 这三个方法都是js function当中自带的方法,用来改变this的指向. call()方法 语法格式: fun.call(thisArg[,arg1[ ...
- Springboot 上传报错: Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: The multi-part request contained parameter data (excluding uploaded files) that exceede
Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: The ...
- [python] 在指定目录下找文件
import os # 查找当前目录下所有包含关键字的文件 def findFile(path, filekw): return[os.path.join(path,x) for x in os.li ...