分布式ID生成
雪花算法(分布式自增长ID)
一、UUID
1、简介
优点:
- 简单,代码⽅便。
- ⽣成ID性能⾮常好,基本不会有性能问题。
- 全球唯⼀,在遇⻅数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。
缺点:
- 没有排序,⽆法保证趋势递增。
- UUID往往是使⽤字符串存储,查询的效率⽐较低。
- 存储空间⽐较⼤,如果是海量数据库,就需要考虑存储量的问题。
- 传输数据量⼤。
- 不可读。
2、代码实现
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
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Java代码:
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; } }