1、简述
在分布式系统中,ID 生成是一个非常关键的基础能力。传统的 UUID(如 v4)虽然随机性强,但存在:
-
无序,不利于数据库索引
-
无法按时间排序
-
长度大,不适合高写入场景
为了解决这些问题,IETF 提出了新的 UUIDv7 标准:
✔ 基于时间戳(毫秒级) + 随机数 ✔ 有序递增(适合数据库索引) ✔ 高性能、高并发 ✔ 分布式环境中唯一性优秀
它非常适合作为主键 ID 的替代方案,甚至可以替代 Snowflake。本文将带你在 Spring Boot 中集成 UUIDv7,并给出完整实践示例。
2、UUIDv7
UUIDv7 是一种 基于 Unix 时间戳(毫秒) + 随机数 的新型 UUID。
格式结构:
|
字段 |
说明 |
|---|---|
|
timestamp (48 bits) |
毫秒时间戳,递增、有序 |
|
version (4 bits) |
UUIDv7 标识 |
|
sub-second random (12 bits) |
毫秒内随机 |
|
random (62 bits) |
额外随机部分 |
其特点:
-
按时间排序,插入数据库几乎不会产生碎片
-
不依赖中心节点
-
高并发下唯一性强
非常适合微服务、分布式数据库、日志系统等场景。
3、实践样例
使用行业最成熟的 UUID 生成库:
com.github.f4b6a3:uuid-creator
在 pom.xml 添加依赖
<dependency>
<groupId>com.github.f4b6a3</groupId>
<artifactId>uuid-creator</artifactId>
<version>5.3.4</version>
</dependency>
3.1 创建 UUIDv7 工具类
package com.example.demo.util;
import com.github.f4b6a3.uuid.UuidCreator;
public class UuidV7Utils {
public static String generate() {
return UuidCreator.getTimeOrderedEpoch().toString(); // UUIDv7
}
}
核心方法:
UuidCreator.getTimeOrderedEpoch() → UUIDv7
3.2 在 Controller 中使用
@RestController
@RequestMapping("/uuid")
public class UuidController {
@GetMapping("/v7")
public String uuid() {
return UuidV7Utils.generate();
}
}
结果输出:
018f0c65-8ef6-7a2c-bb13-82d86182a290
3.3 在 JPA 实体中用 UUIDv7 作为主键(强烈推荐)
如果你正在使用 MySQL / Postgres / Oracle,可以直接用 UUIDv7 作为主键:
@Entity
@Table(name = "orders")
public class Order {
@Id
private String id;
private String content;
@PrePersist
public void prePersist() {
if (id == null) {
id = UuidV7Utils.generate();
}
}
}
这样你会发现:
-
ID 自动生成
-
可排序
-
插入性能比 UUIDv4 好得多
4、示例:订单接口 CRUD(UUIDv7 作为主键)
OrderRepository
public interface OrderRepository extends JpaRepository<Order, String> {
}
OrderController
@RestController
@RequestMapping("/order")
public class OrderController {
private final OrderRepository repository;
public OrderController(OrderRepository repository) {
this.repository = repository;
}
@PostMapping
public Order create(@RequestBody Order order) {
return repository.save(order);
}
@GetMapping("/{id}")
public Order find(@PathVariable String id) {
return repository.findById(id).orElse(null);
}
@GetMapping
public List<Order> list() {
return repository.findAll();
}
}
5、数据库性能优势
UUIDv4:
550e8400-e29b-41d4-a716-446655440000 (随机)
UUIDv7:
018f0c65-8ef6-7a2c-bb13-82d86182a290 (时间有序)
使用 UUIDv7 作为主键,可获得:
|
指标 |
UUIDv4 |
UUIDv7 |
|---|---|---|
|
索引效率 |
🔴 差 |
🟢 极佳 |
|
写入速度 |
🔴 分散 |
🟢 顺序写入 |
|
ID 唯一性 |
🟢 强 |
🟢 强 |
|
可排序 |
🔴 无 |
🟢 强 |
|
分布式适用性 |
🟢 强 |
🟢 强 |
在 MySQL / Postgres 中效率提升明显。
6、批量生成 UUIDv7 示例
@GetMapping("/batch")
public List<String> batch() {
return IntStream.range(0, 10)
.mapToObj(i -> UuidV7Utils.generate())
.toList();
}
输出结果:
018f0c66-2a79-7e57-982b-06d631b98af0
018f0c66-2a79-7e58-b5c8-47b51959b74a
018f0c66-2a79-7e59-8eef-c5e35d72f52f
7、总结
本文带你掌握了UUIDv7 的基本原理和Spring Boot 如何集成 UUIDv7:
-
如何生成 UUIDv7
-
在 JPA 中使用 UUIDv7 做主键
-
完整 CRUD 接口示例
-
批量生成与数据库性能分析
UUIDv7 是未来趋势,几乎可以完美替代:
-
UUIDv4
-
Snowflake
-
Redis 自增 ID
并且性能更好、实现更简单。
565

被折叠的 条评论
为什么被折叠?



