Java分布式ID生成API有了吗

wen java案例 1

本文目录导读:

Java分布式ID生成API有了吗

  1. 雪花算法(Snowflake)
  2. Leaf(美团)
  3. UidGenerator(百度)
  4. Tinyid(滴滴)
  5. CosId
  6. Redis生成方案
  7. ZooKeeper生成方案
  8. 推荐选择

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方案

这些方案都已经在生产环境中验证,可以根据具体需求选择最适合的。

抱歉,评论功能暂时关闭!