# distributed-id
**Repository Path**: automvc/distributed-id
## Basic Information
- **Project Name**: distributed-id
- **Description**: Generate global unique id number in distributed environment.
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2020-06-21
- **Last Updated**: 2022-05-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: id, leaf, distribute, tinyid
## README
Bee
=========
世界上有一样的电话号码吗?
## 分布式ID还存在的问题:
分段模式与雪花到底有什么区别?
一个是依赖DB,一个是依赖时间的.
依赖DB分段批量获取的算法,是可以产生全局唯一,且批内连续单调递增的ID。但多个请求分别调用生成一批,多个批都插入数据到库,还是不会连续的。强依赖DB。
雪花生成的是不连续,全局唯一,但只能是趋势递增的ID,部分区间连续,整体不连续。过于依赖时间。
能不能找到一种,既不依赖DB,也不依赖时间的算法呢?答案是,肯定有的,找吧(本文就能找到)!
DB表自增ID真的不能用在分布式场景吗?
这个都被大家忽略了:
DB表自增ID,也是可以改为具有分布式特性的,SerialUniqueId就是!
## distributed-id
distributed-id 是ORM框架Bee使用的分布式ID生成方案。
提供不用依赖DB,不用依赖时钟的生成算法;
提供DB表主键自增也可具有分布式全局唯一数字id特性的生成算法.
分布式环境下生成连续单调递增(在一个workerid内),全局唯一数字id.
**Bee** 网址:
https://github.com/automvc/distributed-id
**Bee在gitee** 的网址:
https://gitee.com/automvc/distributed-id
## 环境要求
jdk1.7+
## 功能介绍:
**雪花算法:PearFlowerId**
改进的雪花算法——姑且称为梨花算法吧 (忽如一夜春风来,千树万树梨花开)。
改进目标:解决雪花算法的时钟回拨问题;部分避免机器id重复时,号码冲突问题。
**SerialUniqueId**
SerialUniqueId:分布式环境下生成连续单调递增(在一个workerid内),全局唯一数字id.
连续单调递增ID生成算法SerialUniqueId:不依赖于时间,也不依赖于任何第三方组件,只是启动时,用一个时间作为第一个ID设置的种子,设置了初值ID后,就可获取并递增ID。在一台DB内与传统的一样,连续单调递增(而不只是趋势递增),而代表DB的workerid作为DB的区别放在高位,从所有DB节点看,则满足分布式DB生成全局唯一ID。本地(C8 I7 16g)1981ms可生成1亿个ID号,利用上批获取,分隔业务,每秒生成过10亿个ID号不成问题,能满足双11的峰值要求。可用作分布式DB内置生成64位long型ID自增主键。只要按本算法设置了记录的ID初值,然后默认让数据库表id主键自增就可以(如MYSQL)。
**OneTimeSnowflakeId**
* OneTimeSnowflakeId,进一步改进了梨花算法。
* 不依赖时间的梨花算法,Workerid应放在序号sequence的上一段,且应用SerialUniqueId算法,使ID不依赖于时间自动递增。
* 使用不依赖时间的梨花算法OneTimeSnowflakeId,应保证各节点大概均衡轮流出号,这样入库的ID会比较有序,因此每个段号内的序列号不能太多。
* 支持批获取ID号。可以一次取一批ID(即一个范围内的ID一次就可以获取了)。可以代替依赖DB的号段模式。
* 应用订单号等有安全要求的场景,可随机不定时获取一些批的号码不用即可。
*
* 可间隔时间缓存时间值到文件,供重启时设置回初值用。若不缓存,则重启时,又用目前的时间点,重设开始的ID。只要平均不超过419w/s,重启时造成的时钟回拨都不会有影响(但却浪费了辛苦攒下的每秒没用完的ID号)。要是很多时间都超过419w/s,证明你有足够的能力做这件事:间隔时间缓存时间值到文件。
*
* +------+----------------------+----------+-----------+-----------+
* | sign | time(second) | segment | workerid | sequence |
* +------+----------------------+----------+-----------+-----------+
* 1 bit 31 bits 9 bits 10 bits 13 bits
快速开始:
=========
## 1. 引入distributed-id
#### 1.1 maven工程,添加如下依赖
注:目前v 1.7.3还未提交到maven,可下载最新源码.
```xml
org.teasoft
bee
1.7.3
org.teasoft
honey
1.7.3
```
#### 1.2 也可以直接下载jar文件
## 2. 使用样例
[链接](../../../bee-exam/tree/master/src/main/java/org/teasoft/exam/bee/distribution).
联系与欢迎:
=========
#### 作者的电子邮箱email: honeysoft@126.com
#### 如有任何相关建议,欢迎给作者发邮件,不胜感激!
#### 更多设计思想,请关注微信公众号: 软件设计活跃区
#### 为了能及时解答大家的疑问,可以加入Bee的QQ技术群(ORM框架Bee交流群):992650213
#### 同时,也欢迎你加入到Bee框架的开发之中,相信有你的加入,Bee会更加美好!