正如文章《通用的業務編號規則設計實現(附原始碼)
》 文章裡需要乙個多例項和執行緒安全的序列化生成器,在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...