TinyId生成器

简介: TinyId生成器 的nextId、getNextSegmentId,一个是获取segmentId,一个是获取nextId。也即生成的过程中,首先会生成一批数据的maxId和delta、reminder等信息,然后获取nextId。而这个过程中,首先需要有idGenerator对象。目前可以看到其多次使用double check,基于单例模式。同时基于缓存,使用了抽象工厂模式,获取idGenerator的时候。

tinyId生成器是滴滴开源的一款分布式id生成器。

一、流程图

下面是它的流程图:

     tinyid_final.png


     从流程图中我们可以看到它的流转方式。同时其最为重要的两个接口:nextId、getNextSegmentId,一个是获取segmentId,一个是获取nextId。也即生成的过程中,首先会生成一批数据的maxId和delta、reminder等信息,然后获取nextId。而这个过程中,首先需要有idGenerator对象。目前可以看到其多次使用double check,基于单例模式。同时基于缓存,使用了抽象工厂模式,获取idGenerator的时候。


二、表结构


CREATETABLE `tiny_id_info` (`id` bigint(20)NOTNULL AUTO_INCREMENT COMMENT '自增主键',`biz_type` varchar(63)NOTNULL DEFAULT '' COMMENT '业务类型,唯一',`begin_id` bigint(20)NOTNULL DEFAULT '0' COMMENT '开始id,仅记录初始值,无其他含义。初始化时begin_id和max_id应相同',`max_id` bigint(20)NOTNULL DEFAULT '0' COMMENT '当前最大id',`step` int(11) DEFAULT '0' COMMENT '步长',`delta` int(11)NOTNULL DEFAULT '1' COMMENT '每次id增量',`remainder` int(11)NOTNULL DEFAULT '0' COMMENT '余数',`create_time` timestampNOTNULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',`update_time` timestampNOTNULL DEFAULT '2010-01-01 00:00:00' COMMENT '更新时间',`version` bigint(20)NOTNULL DEFAULT '0' COMMENT '版本号',PRIMARY KEY (`id`),UNIQUE KEY `uniq_biz_type` (`biz_type`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT 'id信息表';CREATETABLE `tiny_id_token` (`id` int(11)unsignedNOTNULL AUTO_INCREMENT COMMENT '自增id',`token` varchar(255)NOTNULL DEFAULT '' COMMENT 'token',`biz_type` varchar(63)NOTNULL DEFAULT '' COMMENT '此token可访问的业务类型标识',`remark` varchar(255)NOTNULL DEFAULT '' COMMENT '备注',`create_time` timestampNOTNULL DEFAULT '2010-01-01 00:00:00' COMMENT '创建时间',`update_time` timestampNOTNULL DEFAULT '2010-01-01 00:00:00' COMMENT '更新时间',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT 'token信息表';

基于业务类型bizType和步长step、delta,可以生成的id。


三 、使用的设计模式

单例模式,多次使用double check
抽象工厂模式  获取id生成器 对象的时候使用,结合缓存使用
工厂模式


四、时序图

服务端:

d8bd03a4dbc4f7dc7fe0c86089512021.png


客户端:

b52a5ae5264a434a36e65957d4264065.png

五、问题

但是这里会有一个问题,如果我们想生成单号时,比如订单号或者财务单号的时候,通常会带有前置或者后缀,此时如果使用id生成器,就不太合适。此时需要定制自己的规则,基于业务,此时可以加上一张规则表,这样就可以基于规则去生成。

比如:流水号或者订单号生成可能存在前缀或者后缀,此时可以先在配置表中定义好前缀和后缀的规则,然后就可以进行生成了。同时为了方便单号的信息生成,在当前的单号中,随机生成其中几位。

目录
相关文章
|
24天前
|
机器学习/深度学习 人工智能 自然语言处理
生成器(Generator)
生成器(Generator)
|
6月前
|
弹性计算 运维 Shell
随机引语生成器
【4月更文挑战第30天】
92 1
|
6月前
|
Python
|
安全 Python
一日一技:一个生成器如何当两个用?
一日一技:一个生成器如何当两个用?
91 0
|
JSON 分布式计算 数据格式
Follwfile 生成器1 | 学习笔记
快速学习 Follwfile 生成器1
134 0
Follwfile 生成器1  |  学习笔记
|
大数据 PHP 数据库
Generator 生成器|学习笔记
快速学习 Generator 生成器
Generator 生成器|学习笔记
|
开发者 Python
生成器的使用介绍 | 学习笔记
快速学习 生成器的使用介绍
117 0
|
机器学习/深度学习 开发者 Python
生成器的练习 | 学习笔记
快速学习 生成器的练习
|
JavaScript 前端开发 算法
ES6中的生成器函数是什么?
我们知道 JavaScript 函数是从上到下执行的,但 ES6 在2016年6月发布时,这一切都改变了,它带来了在执行过程中暂停函数的能力,又能从暂停处继续执行。
110 0
ES6中的生成器函数是什么?