訂單號是電商系統核心標識,需滿足全局唯一、高併發不重、可追溯、長度可控等要求。本文對比四種主流生成算法,分析適用場景。
function generateOrderNoV1(): string {
// 格式:YYYYMMDD + 5位隨機數 = 13位
return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
// 輸出示例:2024011587654
優點:實現簡單、可讀性強、含日期信息。
缺點:高併發下有極低碰撞概率(單日 10 萬單內);不含業務標識。
function generateOrderNoV2(): string {
// 格式:YYYYMMDDHHIISS + 微秒後5位 + 3位隨機 = 20位
$micros = sprintf('%06d', (int)((microtime(true) - floor(microtime(true))) * 1000000));
return date('YmdHis') . substr($micros, 0, 5) . str_pad(mt_rand(1, 999), 3, '0', STR_PAD_LEFT);
}
// 輸出示例:2024011514302512345678
優點:微秒級時間戳大幅降低碰撞率。
缺點:長度較長,純數字無業務語義。
function generateOrderNoV3(): string {
do {
// 主體:YYYYMMDDHHIISS + 8位隨機 = 22位
$main = date('YmdHis') . rand(10000000, 99999999);
// 計算校驗碼:所有數字位求和,取模 100
$sum = array_sum(str_split($main));
$check = str_pad((100 - $sum % 100) % 100, 2, '0', STR_PAD_LEFT);
$orderNo = $main . $check; // 24位
// 生產環境需檢查數據庫唯一性
// if (!orderExists($orderNo)) break;
} while (true);
return $orderNo;
}
// 輸出示例:202401151430251234567890
優點:含校驗碼,可驗證訂單號完整性,防篡改。
缺點:長度 24 位,生成邏輯較複雜。
function generateOrderNoV4(): string {
// 年份編碼:2011=A, 2012=B... 2036=Z (26年週期)
$yearCode = chr(ord('A') + (intval(date('Y')) - 2011) % 26);
// 月份十六進制:1-9, A-C
$monthHex = strtoupper(dechex(intval(date('m'))));
// 日、時間戳後5位、微秒5位、2位隨機
return $yearCode
. $monthHex
. date('d')
. substr(time(), -5)
. sprintf('%05d', (int)((microtime(true) * 100000) % 100000))
. sprintf('%02d', mt_rand(0, 99));
}
// 輸出示例:A422694333616096 (16位)
優點:16 位緊湊,含年月日、時間戳、隨機數,極難碰撞。
缺點:年份編碼 26 年循環,長期系統需規劃避免衝突。
function generateOrderNoRedis(Redis $redis, string $prefix = 'ORD'): string {
// 當日序號:ORD + YYYYMMDD + 6位遞增
$dateKey = $prefix . ':' . date('Ymd');
$seq = $redis->incr($dateKey); // 原子自增
$redis->expireAt($dateKey, strtotime('tomorrow')); // 翌日過期
return $dateKey . ':' . str_pad($seq, 6, '0', STR_PAD_LEFT);
}
// 輸出:ORD:20240115:000001
核心優勢:
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 中小型電商、日單 < 1萬 | 方案一/二 | 開發成本低,滿足需求 |
| 需防篡改、對外展示 | 方案三 | 校驗碼提供完整性驗證 |
| 高併發、大規模分佈式 | Redis 原子遞增 | 唯一性強保證,性能最優 |
| 訂單號長度受限(如 16-20 位) | 方案四 | 緊湊編碼,信息密度高 |
選擇合適的訂單號生成策略,是交易系統穩定運行的關鍵基礎設施。