IDConverter 类说明文档
public class IDConverter {
public static long combineInt2Long(int high, int low) {
// 使用无符号转换避免负数符号扩展问题
return (((long) high & 0xFFFFFFFFL) << 32) | ((long) low & 0xFFFFFFFFL);
}
public static int[] seperateLong2Int(long val) {
int[] res = new int[2];
res[1] = (int) (val & 0xFFFFFFFFL); // 低位
res[0] = (int) ((val >>> 32) & 0xFFFFFFFFL); // 高位,使用逻辑右移
return res;
}
}
概述
IDConverter 是一个用于在分布式交易系统中处理ID转换的工具类。它提供了将两个32位整数合并为一个64位长整数,以及将64位长整数拆分为两个32位整数的功能。
功能说明
combineInt2Long 方法
将两个32位整数(高位和低位)合并成一个64位长整数。
seperateLong2Int 方法
将一个64位长整数拆分成两个32位整数数组,索引0为高位,索引1为低位。
设计目的
在分布式交易系统中,需要生成全局唯一的订单ID。该类的主要目的是:
- 组合分布式ID: 将柜台ID(高32位)和本地订单ID(低32位)组合成一个全局唯一的64位订单ID
- 信息编码: 在单一ID中同时携带柜台信息和订单信息,便于后续解析和追踪
- 简化处理: 提供便捷的方法来组合和拆分ID,方便在不同系统组件间传递和解析
使用场景
主要用于订单系统的ID生成,特别是在以下场景中:
- 多柜台分布式交易系统中生成唯一订单ID
- 需要根据订单ID反向解析出所属柜台和本地订单编号的场景
- 系统间数据传输时保持ID的完整性和可解析性
优势
- 简单直观: 实现简洁,易于理解和维护
- 信息丰富: 单个ID包含了柜台和订单两层信息
- 双向转换: 支持组合和拆分操作,使用灵活
- 高效性能: 采用位运算实现,执行效率高
注意事项
- 输入的两个整数都应为正数,避免符号位影响
- 确保高低位整数值在32位范围内,防止数据溢出
- 在分布式环境中使用时,需保证各柜台ID的唯一性
行业对比
虽然此方案能满足基本需求,但在实际工业级应用中,更推荐使用以下成熟的分布式ID生成方案:
- Snowflake算法: Twitter开源的分布式ID生成算法,具有时间有序性,是业界广泛采用的标准方案
- UUID: 通用唯一识别码,适用于各种分布式场景
- 专门的ID生成服务: 如美团的Leaf、百度的UidGenerator等