C# 流水號生成器開發


前言


 本文將使用一個Nuget公開的組件技術來實現一個流水號生成器,提供了一些簡單的API,來方便的實現一個通用的流水號。

 

在visual studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:

Install-Package HslCommunication

NuGet安裝教程  http://www.cnblogs.com/dathlin/p/7705014.html

聯系作者及加群方式(激活碼在群里發放):http://www.hslcommunication.cn/Cooperation

 

 

Summary


 

實現一個簡單的流水號生成器其實是很簡單的事,可以使用InterLock的原子操作來實現線程間的同步操作,然后提供一個API來獲取值,關鍵就在於當前值的記錄存儲,無論如何,當程序關閉重新打開的時候,繼續從上次的值記錄開始繼續,如果每次都存儲文件,性能將會非常的低下,所以在此處實現了一個高性能的流水號生成器,采用樂觀並發模型存儲,在下面的代碼里測試了生成100萬個流水號的時間,就可以對比性能。

 

Reference


 

流水號組件所有的功能類都在 HslCommunication.BasicFramework 命名空間,所以再使用之前先添加

using HslCommunication.BasicFramework

How to Use


 首先,流水號的類就應該設置在服務器端,這樣就能對所有的客戶端進行掌控申請。服務器端的實例化如下所示:

        private void FormSeqTest_Load(object sender, EventArgs e)
        {
            softNumericalOrder = new HslCommunication.BasicFramework.SoftNumericalOrder(
                "ABC",              // "ABC201711090000001" 中的ABC前綴,代碼中仍然可以更改ABC
                "yyyyMMdd",         // "ABC201711090000001" 中的20171109,可以格式化時間,也可以為"",也可以設置為"yyyyMMddHHmmss";
                7,                  // "ABC201711090000001" 中的0000001,總位數為7,然后不停的累加,即使日期時間變了,也不停的累加,最好長度設置大一些
                Application.StartupPath + @"\numericalOrder.txt"  // 該生成器會自動存儲當前值到文件去,實例化時從文件加載,自動實現數據同步
                );
        }
        

        private HslCommunication.BasicFramework.SoftNumericalOrder softNumericalOrder;    // 序列號生成器對象

注意:序號的位數最高可以設置為20位,即2的64次方,任何系統都夠用了,一秒鍾生成1億個,可以使用5800年

 然后我們就可以在按鈕里進行申請流水號了:

        private void userButton1_Click(object sender, EventArgs e)
        {
            // 獲取流水號,帶有默認的數據頭,也即實例化中的"ABC"
            string seqNumber = softNumericalOrder.GetNumericalOrder();
            textBox1.AppendText(seqNumber + Environment.NewLine);
        }


        private void userButton3_Click(object sender, EventArgs e)
        {
            // 獲取流水號,帶有自定義的數據頭
            string seqNumber = softNumericalOrder.GetNumericalOrder("XYZ");
            textBox1.AppendText(seqNumber + Environment.NewLine);
        }

 上面的兩個按鈕展示了兩種方式,流水號的頭可以根據自己的需求填入自己的值,那么我們兩個按鈕隨便點幾次吧。

然后我們去看看那個txt文件的值:

 

性能測試


以下代碼測試瞬間的100萬次請求,和多線程的效率是一樣的,因為內部已經有混合鎖的同步機制。

        private void userButton2_Click(object sender, EventArgs e)
        {
            // 百萬次的流水號測試
            DateTime start = DateTime.Now;
            for (int i = 0; i < 1000000; i++)
            {
                string seqNumber = softNumericalOrder.GetNumericalOrder("XYZ");
            }
            double spend = (DateTime.Now - start).TotalMilliseconds;
            textBox1.AppendText("耗時:" + spend + Environment.NewLine);
        }

 執行完成后,顯示如下:

結果看來,花了949毫秒,性能已經非常的強悍,測試機器為I5的4590CPU,具體時間依照電腦性能會有微小的差別。

 

我們最后還是要去那個txt文件進行驗證下這個流水號是不是正確,因為我們剛才調用了100萬次方法,那么現在的值應該是1000021吧

 

至此,這個功能的代碼開發介紹完畢,如果有不明白的,可以進文章開始處的QQ群進行交流。


免責聲明!

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



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