商品訂單ID簡易算法


算法目標:支持中小型支付系統,單機房生成訂單號QPS<=1w,保證訂單號絕對唯一,機房內趨勢遞增;

 

序列號生成算法(字符串訂單號):

{2字節,機房唯一序列號}{14字節,年月日時分秒}{3字節,毫秒}{3字節,微秒}{4字節,自增序列號}

 

舉例:

機房A:

"{01}{20171028195147}{655}{851}{0001}" =》"01201710281951476558510001" 

"{01}{20171028195147}{655}{851}{0002}" =》"01201710281951476558510002"


機房B:
"{02}{20171028195147}{010}{118}{0001}" =》"02201710281951470101180001"

 

分析:

機房序列號:機房唯一標識,自分配

年月日時分秒:如題

毫秒:如題

微秒:如題

自增序列號count:這里使用redis集群(同機房機器須使用相同的集群)生成,根據"{2字節,機房序列號}{14字節,年月日時分秒}{3字節,毫秒}{3字節,微秒}"作為key,使用INCR命令生成,當INCR返回1時,給KEY設置過期時間EXPIRE,防止同一微秒生成相同的訂單號

偽代碼如下:

cout = INCR 0120171028195147655851
if count == 1:
EXPIRE 0120171028195147655851 60
最終訂單號 = "01201710281951476558510001" 

 看到另一個不錯的實現算法

function build_order_no(){
  return "ID".date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

這套算法可以支撐非大型電商平台的訂單系統,如果要追求更高的QPS,可以參考snowflake算法;
————————————————

 


版權聲明:本文為CSDN博主「帶魚兄」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/daiyudong2020/article/details/78378490


免責聲明!

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



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