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
并且性能更好、实现更简单。