前言
本文將使用一個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群進行交流。