生成唯一序列号方法整理

这几种方法只是平时项目中想到的,抛砖引玉 希望能收集大家更好的方法!

一、时间做前缀+随机数保证唯一

用4位数字作日期 0610  + 用毫秒做多编号19  +用数字英文数组【1-9A-Za-z】抽取出几位来做补充

生成这样: 061019a8dec2

二、当前时间置换成对应字符

char[] letters = {'A', 'C', '1', '2', '3','4', 'a', 'e', 'f', 'z'}; //这里根据你的需要初始化不同的字符
        
String tStr = String.valueOf(System.currentTimeMillis());
/*因为tStr的字符只有‘0’-‘9’,我们可以把它看成索引到letters中找相应的字符,这样相当于“置换”,所以是不会重复的。*/
System.out.println(tStr);
StringBuilder sb = new StringBuilder();
for(int i=1;i<tStr.length();i++)
{
  sb.append(letters[tStr.charAt(i)-'0']);
}
System.out.println(sb.toString());




<think> 我们在讨论ID生成方法,根据引用内容,用户想了解各种ID生成方法及其优缺点。引用中提到了数据库自增ID、UUID、雪花算法、消息编码、Redis/Zookeeper生成、Flicker方案(基于MySQL自增)以及Tinyid(分布式ID生成服务)等。 我们需要系统化地整理这些方法,并注意引用来源。由于引用[1]详细列举了前五种方法,引用[2]介绍了Flicker的解决方案,引用[3]给出了一个分布式ID生成服务的简化代码,我们将整合这些信息。 注意:用户要求生成相关问题,并且回答中引用的段落末尾要添加引用标识。 我们将按照以下结构组织回答: 1. 数据库自增ID 2. UUID 3. 雪花算法(Snowflake) 4. 消息编码(两种方式) 5. 使用Redis或Zookeeper 6. Flicker的解决方案(基于MySQL自增的改进) 7. 分布式ID生成服务(如Tinyid) 每个方法包括原理和优缺点。 然后,生成相关问题。 由于用户要求使用中文,且数学表达式用$...$,独立公式单独成段,但本问题中没有数学表达式,所以重点在文字描述。 </think>### ID生成方法详解 在分布式系统中生成全局唯一ID是核心需求,以下是主流方法及其原理: 1. **数据库自增ID** 利用数据库的`auto_increment`特性生成连续ID。 **优点**:简单高效,保证严格递增。 **缺点**:分库分表时难以扩展;插入前无法预知ID值;数据库宕机导致服务中断[^1]。 **优化方案**:Flicker通过专用ID表改进,使用`REPLACE INTO`语句和MyISAM引擎: ```sql CREATE TABLE Tickets64 ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, stub CHAR(1) NOT NULL DEFAULT '', PRIMARY KEY (id), UNIQUE KEY (stub) ) ENGINE=MyISAM; ``` 每次调用`REPLACE INTO Tickets64 (stub) VALUES ('a')`生成新ID[^2]。 2. **UUID** 基于时间、硬件信息等生成128位随机字符串(如`550e8400-e29b-41d4-a716-446655440000`)。 **优点**:本地生成无网络开销,全局唯一性强。 **缺点**:无序性导致数据库页分裂(插入性能下降);128位过长占用存储[^1]。 3. **雪花算法(Snowflake)** 分布式ID生成的核心方案,生成64位ID: $$ \text{ID} = \text{时间戳} \ll 22 + \text{机器ID} \ll 12 + \text{序列号} $$ **优点**:趋势递增;高性能(单机每秒百万ID)。 **缺点**:依赖机器时钟(时钟回拨需处理)[^1]。 **扩展应用**:可将业务数据(如消息内容)作为附加信息嵌入ID[^1]。 4. **Redis/Zookeeper生成** - **Redis**:利用`INCR`/`INCRBY`原子操作生成连续ID - **Zookeeper**:通过顺序节点(如`/id/0000000001`)生成ID **适用场景**:高并发但无需严格递增的场景[^1]。 5. **分布式ID服务(Tinyid)** 独立服务通过HTTP/RPC提供ID,伪代码实现: ```java public class TinyidService { private AtomicLong idGenerator = new AtomicLong(0); public synchronized long generateId() { return idGenerator.incrementAndGet(); } } ``` **优势**:避免单点故障;支持批量获取ID提升性能[^3]。 --- ### 方法对比表 | 方法 | 唯一性 | 有序性 | 生成速度 | 缺点 | |---------------|--------|--------|----------|-----------------------| | 数据库自增ID | 全局 | 严格递增 | 中 | 扩展性差 | | UUID | 全局 | 无序 | 快 | 存储大,插入性能低 | | 雪花算法 | 全局 | 趋势递增 | 极快 | 时钟回拨问题 | | Redis生成 | 全局 | 递增 | 快 | 依赖内存,持久化风险 | | 分布式ID服务 | 全局 | 可配置 | 快 | 架构复杂度高 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值