本文目录导读:

Java生态中已经有许多成熟的分布式ID生成方案,并且很多都提供了完善的API和客户端库,以下是几个主流方案及其对应的Java API:
雪花算法(Snowflake)
原生实现
许多框架自带雪花算法实现:
// Hutool import cn.hutool.core.lang.Snowflake; Snowflake snowflake = new Snowflake(1, 1); long id = snowflake.nextId(); // MyBatis-Plus import com.baomidou.mybatisplus.core.toolkit.IdWorker; long id = IdWorker.getId();
Leaf(美团)
美团开源的分布式ID生成系统,提供HTTP和RPC接口。
<!-- Maven依赖 -->
<dependency>
<groupId>com.sankuai.inf.leaf</groupId>
<artifactId>leaf-boot-starter</artifactId>
<version>1.0.1</version>
</dependency>
@Autowired
private LeafService leafService;
// 获取ID
Result result = leafService.getId("your-key");
long id = result.getId();
UidGenerator(百度)
基于snowflake的改进方案。
<dependency>
<groupId>com.baidu.fsg</groupId>
<artifactId>uid-generator</artifactId>
<version>1.0.0</version>
</dependency>
@Resource private UidGenerator uidGenerator; long uid = uidGenerator.getUID(); // 解析UID ParseUid parseUid = uidGenerator.parseUID(uid);
Tinyid(滴滴)
基于数据库号段模式的ID生成器。
<dependency>
<groupId>com.xiaoju.uemc</groupId>
<artifactId>tinyid-client</artifactId>
<version>1.0.0</version>
</dependency>
// 获取分布式ID
Long id = TinyId.nextId("test");
// 批量获取
List<Long> ids = TinyId.nextId("test", 10);
CosId
国产开源项目,支持多种生成模式。
<dependency>
<groupId>me.ahoo.cosid</groupId>
<artifactId>cosid-core</artifactId>
<version>2.0.0</version>
</dependency>
// 雪花算法 IdGenerator snowflakeIdGenerator = new SnowflakeIdGenerator(1); long id = snowflakeIdGenerator.generate(); // 号段模式 SegmentId segmentId = new SegmentId(); long id = segmentId.generate();
Redis生成方案
// 使用Redis原子操作
@Autowired
private StringRedisTemplate redisTemplate;
public long generateId(String key) {
return redisTemplate.opsForValue().increment(key, 1);
}
// 批量获取
public List<Long> batchGenerateId(String key, int size) {
// 使用Redis的incrBy
Long start = redisTemplate.opsForValue().increment(key, size);
return LongStream.range(start - size + 1, start + 1)
.boxed().collect(Collectors.toList());
}
ZooKeeper生成方案
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.5.0</version>
</dependency>
public class ZookeeperIdGenerator {
private CuratorFramework client;
public long generateId(String path) throws Exception {
// 使用ZNode的版本号作为ID
Stat stat = client.checkExists().forPath(path);
return stat.getVersion();
}
}
推荐选择
- 单机部署:Hutool的雪花算法
- 集群部署:Leaf或CosId
- 高并发场景:UidGenerator
- 简单需求:Redis方案
这些方案都已经在生产环境中验证,可以根据具体需求选择最适合的。