C# 流水号生成器开发
前言
本文将使用一个Nuget公开的组件技术来实现一个流水号生成器,提供了一些简单的API,来方便的实现一个通用的流水号。
在visual studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:
1 | Install-Package HslCommunication |
NuGet安装教程 http://www.cnblogs.com/dathlin/p/7705014.html
联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation
Summary
实现一个简单的流水号生成器其实是很简单的事,可以使用InterLock的原子操作来实现线程间的同步操作,然后提供一个API来获取值,关键就在于当前值的记录存储,无论如何,当程序关闭重新打开的时候,继续从上次的值记录开始继续,如果每次都存储文件,性能将会非常的低下,所以在此处实现了一个高性能的流水号生成器,采用乐观并发模型存储,在下面的代码里测试了生成100万个流水号的时间,就可以对比性能。
Reference
流水号组件所有的功能类都在 HslCommunication.BasicFramework 命名空间,所以再使用之前先添加
1 | using HslCommunication.BasicFramework |
How to Use
首先,流水号的类就应该设置在服务器端,这样就能对所有的客户端进行掌控申请。服务器端的实例化如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 | 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年
然后我们就可以在按钮里进行申请流水号了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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万次请求,和多线程的效率是一样的,因为内部已经有混合锁的同步机制。
1 2 3 4 5 6 7 8 9 10 11 | 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群进行交流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理