Authored by tanling

code位数修改

... ... @@ -7,11 +7,23 @@ import lombok.Data;
* <pre>
* 生成订单号bit元数据
* 订单号:
* 2位: 类型(标识是卖家订单号or买家订单号)
* 2位: 类型(标识是卖家订单号or买家订单号)
* 30位: 时间戳(秒级时间) 2的30次方/60/6024/365=34,也就是说可以用30年
* 10位: 序列号, 也就是说 每秒支持1K多的id
* 3位: 服务节点,支持8个服务节点
* </pre>
* 🔽
* 机器号3位不够用,序列号:一台机器一个秒级内不太可能达到10位数量的订单位数过多 ==> 将序列号的右2位变成机器位
* 序列号变8位,机器号变5位
* 🔽
* <pre>
* 生成订单号bit元数据
* 订单号:
* 2位: 类型(标识是卖家订单号or买家订单号)
* 30位: 时间戳(秒级时间) 2的30次方/60/6024/365=34,也就是说可以用30年
* 8位: 序列号, 也就是说 每秒支持2的8次方的订单号
* 5位: 服务节点,支持32个服务节点
* </pre>
*/
@Data
public class CodeBitMeta {
... ... @@ -30,12 +42,12 @@ public class CodeBitMeta {
/**
* 序列号
*/
private byte seqBits = 10;
private byte seqBits = 8;
/**
* 机器位
*/
private byte machineBits = 3;
private byte machineBits = 5;
// 最右边长度为machineBits位为1,其他为0
public long getMachineBitsMask() {
... ...
... ... @@ -38,6 +38,7 @@ public class OrderCodeGeneratorImpl implements OrderCodeGenerator {
MetaConfigService metaConfigService;
long machineId = 0l;
@PostConstruct
public void init() {
... ... @@ -58,7 +59,7 @@ public class OrderCodeGeneratorImpl implements OrderCodeGenerator {
machineId = machineIdProvider.getMachineId();
// 3位 0~8
// 3位 0~7
validateMachineId(this.machineId);
}
... ... @@ -72,7 +73,8 @@ public class OrderCodeGeneratorImpl implements OrderCodeGenerator {
}
//明确指定了配置使用非生产环境时,序列号从1000开始
if (!envIsNull && !OpsEnv.PRD.getName().equalsIgnoreCase(env)){
seq = 1000L;
// 目前序列号8位(0-255): 0-249用于生产环境; 250-255用于测试环境
seq = 250l;
log.info("in order code generator env use not prd config, OrderCodeRule {} seq {}", ocr, seq);
}
log.info("in order code generator init config, OrderCodeRule {} seq {}", ocr, seq);
... ...
package com.yohoufo.order.service.code;
import com.yohobuy.ufo.model.order.common.OrderCodeType;
import com.yohoufo.order.service.code.service.impl.OrderCodeGenerator;
import com.yohoufo.order.service.code.service.impl.OrderCodeGeneratorImpl;
import com.yohoufo.order.service.support.codegenerator.impl.OrderCodeGeneratorImpl;
public class CodeTest {
public static void main(String[] args){
OrderCodeGenerator orderCodeGenerator = new OrderCodeGeneratorImpl();
com.yohoufo.order.service.support.codegenerator.OrderCodeGenerator orderCodeGenerator = new OrderCodeGeneratorImpl();
for (int i =0; i <10 ; i++){
long result = orderCodeGenerator.generate(OrderCodeType.BUYER_TYPE);
System.out.println(result);
System.out.println("反解结果: "+ orderCodeGenerator.expId(result));
System.out.println("========================");
System.out.print(result);
System.out.println(" 反解结果: "+ orderCodeGenerator.expId(result));
}
// System.out.println(1<<3);
... ...