13位純數字訂單號生成 - java


需求背景,系統之前的訂單號是用毫秒時間戳作為訂單號。
並發量大時會出現很多重復的訂單號,因為需要改造。
改造的要求是仍使用13位純數字,支持線上三台機器最大1000TPS並發訪問量。

以下是改造代碼

static class Generator13{
        public final static String machineCode13 = "0";
        private final static AtomicInteger sub = new AtomicInteger(0);
        public static String make(){
            StringBuffer sb = new StringBuffer();
            sb.append(machineCode13);
            long timestamp = System.currentTimeMillis()/1000;
            sb.append((timestamp+"").substring(1));
            int subValue = sub.incrementAndGet();
            if(subValue > 999){
                sub.getAndSet(0);
                return make();
            }
            if(subValue<10){
                sb.append("00");
            } else if(subValue<100){
                sb.append("0");
            }
            sb.append(subValue);
            return sb.toString();
        }
    }

這段訂單生成代碼支持
單台最大TPS1000,
最大10台機器並發,
3.17年內無重復訂單號

在有十台機器的情況下,能滿足最大10000 TPS。
遠遠超出了現有的並發量

缺點
單台最大1000TPS,如果某個瞬間超出1000TPS,就必定會有重復訂單號存在。
因為訂單號第一位作為機器碼,有泄露非業務信息的情況,但同時也方便了查詢日志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM