算法目標:支持中小型支付系統,單機房生成訂單號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