业务ID 生成规则

在实际业务中,是否碰到过这种场景:

我们需要一个单号,要在业务系统里面保证唯一,保证增长?

在运营过程,需要知道业务单发生的时间,最好不用经过系统查找就知道发生的时间?

在排障过程中,不用再次查找就知道,订单的一些信息?

业务ID 经常需要生成以方便后续跟踪使用。一般需要满足以下特性:

1. 唯一性

2. 可阅读

3. 增长

4. 数字类型?

5. 其他信息(payload)

所以,业务ID的生成,这里涉及两个问题:

1. ID 的规则,也就是ID 最终长什么样,满足什么约束

2. ID 生成策略

比如,一个常见的订单号生成规则可能如下:{yyyyMMddHHmm}[0-9][0-9]{4}

这个规则满足了以下约束:

1. 17位数字, 数据库存储可以用BIGINT 存储, 各系统接口可以使用Long 类型交互

2. 可以阅读, 通过{yyyyMMddHHmm} 快速的知道订单的创建时间

3. 可以猜测类型, 如中间的[0-9],支持10种类型, 这个数据丰富信息,可不存。

4. 支持的最大并发在每分钟10000,在系统确实有每分钟10000个订单,这个单号生成策略就够了

当然,上述订单号规则,只是一种实例,不过对大多数小系统足够了。即便是这样,上述规则,也有一些缺陷。

比如Long 范围的限定情况下, 使用了类似string 的 拼接技术,未能充分使用Long的范围。

如果ID 规则,不用太多考虑可读性的话, 可以像设计序列化协议一样,设计的更为紧凑,以容纳更多信息, 比如Long 有64bit,可以按照bit 长度划分成若干段。

现实中,有很多系统为了单号的可读性,经常会超出Long的最大值,所以设计为 NChar(128) 也比较常见。

原文地址:https://www.cnblogs.com/lykm02/p/9019979.html

时间: 2024-10-03 22:54:29

业务ID 生成规则的相关文章

业务ID 生成策略

业务ID 生成策略,从技术上说,基本要借助一个集中式的引擎来帮忙实现. 为了扩大业务ID生成策略的并发问题,还有更为技巧性的提升. 先来介绍普遍的分布式ID生成策略: 1. 利用DB的自增主键 这里又有两种做法,一种是 单独创建一个只有自增主键的表,来负责主键自增,业务表从这里取得自增的主键返回给业务主键生成组件使用. 另外一种: 业务中不使用DB的自增主键, 自增主键仅存在DB层面,并增加业务主键字段,并加以约束.这种比较常见. 通常的步骤为: A. Create table `tbl_biz

服务器唯一id生成规则

在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些id是long的,比如说玩家id. 先贴代码来看: private static AtomicInteger id = new AtomicInteger(0); public static long getId() { return (ServerKit.getServerId() & 0xFFF

hibernate对应id 生成规则

数据库的设计和操作中,我们通常会给表建立主键. 主键,可以分为自然主键和代理主键. 自然主键表示:采用具有业务逻辑含义的字段作为表的主键.比如在用户信息表中,采用用户的身份证号码作为主键.但是这样一来,随着业务逻辑的变化,主键就有可能要更改.比如,假设哪天身份证号码升级成19,2位,那....... 代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据.比如说在用户信息表中,增加一个用户ID的字段.用来表示该条用户信息的记录. 通常情况下,用的比较多的是代理主

分布式系统ID生成办法

前言 一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多的关注.但是对于大厂的那种大规模复杂业务.分布式高并发的应用场景,显然这种ID的生成方式不会像小项目一样仅仅依靠简单的数据自增序列来完成,而且在分布式环境下这种方式已经无法满足业务的需求,不仅无法完成业务能力,业务ID生成的速度或者重复问题可能给系统带来严重的故障.所以这一次,我们看看大厂都是

分片(Sharding)的全局ID生成

前言数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 不能有单点故障.以时间为序,或者ID里包含时间.这样一是可以少一个索引,二是冷热数据容易分离.可以控制ShardingId.比如某一个用户的文章要放在同一个分片内,这样查询效率高,修改也容易.不要太长,最好64bit.使用long比较好操作,如果是96bit,那就要各种移位相当的不方便,还有可能有些组件不能支持这么大的ID.先来看看老外的做法,以时间顺序:

分布式ID生成

在看代码的时候遇到一个snowflake算法,查了一下发现是Twitter的一个分布式ID生成算法,能够在分布式环境中生成一个全局唯一的ID,然后上网找了一些业界的做法,目前看到了携程和美团的方案,做一下笔记. 背景1 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求:特别一点的如订单.骑手.优惠券也都需要有唯一ID做标识

mysql全局唯一ID生成方案(二)

MySQL数据表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都可以用这个ID唯一确定: 随着数据的不断扩张,为了提高数据库查询性能,降低查询热点,一般都会把一张表按照一定的规则分成多张数据表,即常说的分表: 分表除了表名的索引不同之外,表结构都是一样的,如果各表的‘ID’字段仍采用‘AUTO_INCREMENT’的方式的话,ID就不能唯确定一条记录了. 这时就需要一种处于各个分表之外的机制来生成ID,我们一般采用一张单独的数

分布式系统全局唯一ID生成

一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一ID的系统是非常必要的. 二.分布式系统唯一ID的特点 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求. 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数

分布式全局唯一ID生成策略?

一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. 1.1 唯一ID的特性 整个系统ID唯一; ID是数字类型,而且是趋势递增; ID简短,查询效率快. 1.2 递增与趋势递增 递增 趋势递增 第一次生成的ID为12,下一次生成的ID是13,再下一次生成的ID是14. 什么是?如:在一段时间内,生成的ID是递增的趋势.如:再一段时间内生成的ID在[