# 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的设置操作,返回设置值;