订单号全局唯一
12306项目保证订单号全局唯一的解决方案基于雪花算法。
雪花算法是一种分布式ID生成算法。主要功能是在分布式系统中生成全局唯一的ID,并且这些ID是按照时间有序递增的,索引效率高。
雪花算法使用一个64位的二进制数字作为ID,这64位被分割成四个部分:
- 符号位(1位):最高位是符号位,始终为0,用于标识ID是正数。
- 时间戳(41位):时间戳41位,精确到毫秒级,可以支持69年。
- 工作机器ID(10位):标识位有10位,可以进一步细分为5位数据中心ID和5位工作机器ID,以支持最多32个数据中心和每个数据中心最多32个工作节点。
- 序列号(12位):序列号占12位,用于标识同一毫秒内生成的不同ID,支持每个节点每毫秒产生4096个唯一的ID。
12306项目中订单ID也是由几个部分拼接而成
以毫秒为单位获取当前的时间戳,再减去一个固定的起始时间戳,得到ID的时间戳部分
每个节点在生成ID时都会有一个唯一的节点ID,这个节点ID存放在 Redis。节点ID在最终生成的ID中占据固定的位数为5位,最多支持32个不同的节点。
在同一毫秒内生成多个ID时,通过序列号来区分。
序列号在最终生成的ID中占据固定的位数为7位,意味着每个毫秒内最多可以生成128个不同的ID。
序列号在每个毫秒开始时重置为0,并在每次调用生成ID方法时递增。如果在同一毫秒内生成的ID数量超过了序列号的最大值,则序列号会循环回到0,并且等待到下一个毫秒再生成新的ID,以避免重复。
最后拼接订单ID时,
时间戳需要向左移动 12 位来腾出足够的空间存储5位节点ID和7位序列号,节点ID左移7位,通过位或运算(|),可以将左移后的时间戳、节点 ID和序列号组合成一个长整型数值,再在末尾拼接用户ID后六位数,
组成了全局唯一订单号。
订单号全局唯一
https://xichicheng.github.io/2024/11/20/订单号全局唯一/