# smart-id-generator
**Repository Path**: zeaot/smart-id-generator
## Basic Information
- **Project Name**: smart-id-generator
- **Description**: 全局主键生成器,支持按照规则生成主键,默认使用sequence表实现!
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: https://gitee.com/zeaot/smart-id-generator
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-09-18
- **Last Updated**: 2023-02-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 主键生成器, 自定义主键生成, ID生成器, 全局标识
## README
### 一.概述
#### 1.1 项目介绍
* 致力于生成全局分布式系统业务主键或编号;
* 生成性能高效,支持本地缓存容错;
* 支持主键生成格式自定义;
> **关键词**
* 全局主键生成器
* 分布式id 分布式编号 分布式主键
#### 1.2 功能概述
* 高效生成分布式全局主键,可用于分布式系统;
* 生成主键方式包括数据库sequence表实现、redis实现;
* 支持不同key的不同步长增长、不同初始值;
* 同时也支持自定义生成方式,如按照时间前缀yyMMdd、用户编号结尾等;
### 二.api介绍
#### 2.1 核心api
> **依赖引入**
```xml
com.wunong.smart
smart-id-generator-core
1.0.0-SNAPSHOT
```
> **主键值范围**
```java
/**
* id范围取值
*
* @author create by zealot.zt
*/
public interface IdRange {
/**
* 1.用于产生在[min, max] 间的唯一编号;
* 2.超过最大范围时则返回 -1;
* 3.线程安全,且递增
*
* @return
*/
long next();
/**
* 获取区间范围的最小值
*
* @return
*/
long getMin();
/**
* 获取区间范围的最大值
*
* @return
*/
long getMax();
/**
* 是否超过限制
*
* @return
*/
boolean isLimit();
}
```
> **产生序列号**
```java
/**
* 序列生成
*
* @author create by zealot.zt
*/
public interface Sequence {
/**
* 获取下一个序列值
*
* @param key
* @return
*/
long next(String key);
}
```
> **根据指定key生成一批主键**
```java
/**
* 序列器DAO
*
* @author create by zealot.zt
*/
public interface SequenceDAO {
/**
* 产生获取下一个序列区间
*
* @param key 序列标识
* @return
*/
IdRange next(String key);
}
```
#### 2.2 mysql实现
> **依赖引入**
```xml
com.wunong.smart
smart-id-generator-starter
1.0.0-SNAPSHOT
```
> **生成原理**
1. 对指定唯一索引行加更新锁,锁住指定行:select * from x where key = xxx for update
2. 若存在则进行增加步长值,并返回增加成功后的值; update x set step = xxx where key = xxx
3. 否则进行插入,并返回插入的值;insert into xxx values(key, step, gmt_modified)
#### 2.3 redis实现
> **依赖引入**
```xml
com.wunong.smart
smart-id-generator-redis
1.0.0-SNAPSHOT
```
> **生成原理**
1. 使用luna的redis脚步,执行指定key的修改;
2. 若存在指定key,则进行incr原子操作,返回增加后的值;
3. 否则执行key的设置操作,返回设置值;