分布式ID生成

2023-08-10 08:23:23 浏览数 (1)

一、UUID

1、简介

优点:

  • 简单,代码⽅便。
  • ⽣成ID性能⾮常好,基本不会有性能问题。
  • 全球唯⼀,在遇⻅数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。

缺点:

  • 没有排序,⽆法保证趋势递增。
  • UUID往往是使⽤字符串存储,查询的效率⽐较低。
  • 存储空间⽐较⼤,如果是海量数据库,就需要考虑存储量的问题。
  • 传输数据量⼤。
  • 不可读。

2、代码实现

代码语言:javascript复制
import java.util.UUID;
public class UUIDUtils {
    public static String getUUID() {
//        2c294ec8-9585-4b06-954e-7380979e7ff1
        String uuid = UUID.randomUUID().toString();
        return uuid;
    }
}

三、Redis

1、简介

当使⽤数据库来⽣成ID性能不够要求的时候,我们可以尝试使⽤Redis来⽣成ID。这主要依赖于Redis是单线程的,

所以也可以⽤⽣成全局唯⼀的ID。可以⽤Redis的原⼦操作 INCR和INCRBY来实现。

优点:

  • 不依赖于数据库,灵活⽅便,且性能优于数据库。
  • 数字ID天然排序,对分⻚或者需要排序的结果很有帮助。

缺点:

  • 如果系统中没有Redis,还需要引⼊新的组件,增加系统复杂度。
  • 需要编码和配置的⼯作量⽐较⼤。
  • ⽹络传输造成性能下降。

2、代码实现

pom.xml依赖

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Java代码:

代码语言:javascript复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

public class RedisIdUtils {
    private static final String redisIdKey = "redisKey";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public Long getRedisID() {
//        默认每次步进1,可配置
        Long redisKey01 = stringRedisTemplate.opsForValue().increment(redisIdKey);
        Long redisKey = stringRedisTemplate.opsForValue().increment(redisIdKey, 1);
        return redisKey;
    }
}

三、雪花算法snowflake

详见写的另一篇文章。

雪花算法(分布式自增长ID

代码语言:javascript复制
https://blog.csdn.net/lydms/article/details/124696135

0 人点赞