




推荐组合方案:时间戳+机器标识+序列号,如202505201530220010001;其次Snowflake(64位整数编码)及数据库辅助方案(seq_generator表+缓存);需避坑伪随机、时间回拨、字符混淆等问题。
Java中生成唯一业务编号,核心是兼顾唯一性、可读性、有序性、高性能,不能只靠UUID.randomUUID()——它虽全局唯一但不可读、无序、长度长,不适合订单号、单据号等业务场景。
这是电商、金融系统最常用的高并发安全方案,例如:202505201530220010001(年月日时分秒 + 机房ID + 机器ID + 毫秒内序列)。
yyyyMMddHHmmss或更紧凑的62进制编码(如System.currentTimeMillis()转base62)减少长度Twitter开源的Snowflake是经典解法,64位整数编码(1位符号 + 41位时间 + 10位机器ID + 12位序列),Java已有成熟封装:
IdWorker(默认workerId=1,datacenterId=1,需初始化时指定)当业务允许少量DB交互,且需严格连续/可控格式(如SO2025050001),可用以下方式:
立即学习“Java免费学习笔记(深入)”;
seq_generator表,字段:business_type、current_value、step;每次用UPDATE ... SET current_value = current_value + #{step}获取新号REPLACE INTO ... SELECT MAX() + 1或Oracle的SEQUENCE.NEXTVAL,但要注意分布式下锁表或性能瓶颈
别让编号成为系统瓶颈或故障源:
数量指数上升Math.random()或System.nanoTime()单独做主键,它们不具备跨JVM唯一性基本上就这些。选型看场景:高并发选Snowflake类方案,强顺序选DB+缓存,简单内部系统可用时间戳+随机后缀。关键是统一管理生成逻辑,别散落在各Service里硬编码。