通用的序列號生成器庫

2022-01-10 01:09:30 字數 1977 閱讀 7534

正如文章《通用的業務編號規則設計實現(附原始碼)

》 文章裡需要乙個多例項和執行緒安全的序列化生成器,在sql server 2012+ 版本 有乙個通過.net程式集的序列號transact-sql 函式 這篇文章向大家介紹乙個使用sql server 和sql azure 以及mongodb 實現的序列號生成器。

在github上有個專案 ,我fork了乙份,增加了乙個mongodb 實現,位址是下面我介紹下使用mongodb實現的sequence 儲存,主要就是實現介面istatestore

。這裡實現的關鍵點就是在更新資料的時候如何保證原子性的操作,mongo 可以使用findandmodify命令, findandmodify可以從資料庫查詢返回乙個文件的同時更新/插入/刪除文件,原子操作,執行緒安全,功能強大,原型複雜。

publicasynctask updateasync(sequencekeysequencekey, isequencesequence)

); vardoc = updatedsequenceentity.modifieddocument;

returndoc != null;

} findandmodify命令中每個鍵對應的值如下所示。

findandmodify 字元竄,集合名。

query 查詢文件,用來檢索文件的條件。

sort 排序結果的條件。

update 修改器文件,對所找到的文件執行的更新。

remove 布林型別,表示是否刪除文件。

new 布林型別,表示返回的是更新前的文件還是更新後的文件。預設是更新前的文件。

"update"和"remove"必須有乙個,也只能有乙個。要是匹配不到文件,這個命令會返回乙個錯誤。

這個命令有些限制。它一次只能處理乙個文件,也不能執行upsert操作,只能更新已有文件。

相比普通更新來說,findandmodify速度要慢一些。大概耗時相當於一次查詢,一次更新和一次getlasterror順序執行所需的時間。

使用起來非常簡單,下面我們使用mongodb 作為**示例:

通過nuget 安裝getaddress.sequence.mongo:

根據業務需求建立乙個序列化生成器,也就是sequencekey ,mongo 使用它的objectid 來作為key

var stateprovider = getstateprovider();

var sequencegenerator = new sequencegenerator(stateprovider);

var sequence = await createsequence(stateprovider,increment: 0, startat: 5);

var sequencekey = await stateprovider.addasync(sequence);

使用這個sequencekey 就可以用呼叫了

var stateprovider = getstateprovider();

var sequencegenerator = new sequencegenerator(stateprovider);

var nextvalue1 = await sequencegenerator.nextasync(new sequencekey );

專案裡有完整的單元測試用例,跑完整個單元測試用例,mongodb的資料展示一下:

我們把資料儲存在乙個叫做sequences的collection裡,_id 列就是我們的sequencekey。startat 表示起點, increment 表示步長, maxvalue 表示最大值, minvalue 表示最小值,cycle 表示達到最大值,從頭開始迴圈,currentvalue 表示當前值。

序列號生成器

生成序列號,最大值為max val。如果達到max val,從0開始。public class serialgenerator return serialno 求整數有幾位,如234是3位。param i return private static final int getrnum int i i...

錯誤的序列號生成器

public class incorrectserialgenerator return serialno public static int getserialno return serialno 求整數有幾位,如234是3位。param i return private static final...

基於snowflake的Id序列號生成器

背景 在分布式微服務系統中,通常需要全域性唯一的序列號,需求實現簡單高效,通常的做法可以用資料庫的自增id,uuid生成等。但資料庫自增id侷限在於依賴於資料庫表,在效率上有所折扣,尤其是高併發量的場景。而uuid一般比較長,關鍵是無序的。twitter的snowflake解決了這種需求,最初twi...