前言


本文将使用一个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群进行交流。

C# 流水号生成器开发的更多相关文章

  1. Java之流水号生成器实现

    参考:https://www.jianshu.com/p/331b872e9c8f 1.建立一张存放的表 CREATE TABLE `sys_serial_number` ( `id` bigint( ...

  2. java中生成流水号的一个例子(使用关系型数据库)

    在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水 ...

  3. Spring Boot集成全局唯一ID生成器

    流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用.而关于流水号生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本 ...

  4. 编写自定义Yeoman生成器简述

    1. 安装生成器Yeoman提供了generator-generator方便快速编写自己的生成器. 安装: npm install -g generator-generator运行: yo gener ...

  5. 【java】单实例下的 流水号【21位】

    单实例环境,不是分布式 需要流水号 /** * 流水号生成器 * * 年+天号+毫秒+随机数 * 2019+134+480+11位随机数 * 4+3+3+11 = 21位 * * * @author ...

  6. HslCommunication组件库使用说明 (转载)

    一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...

  7. HslCommunication组件库使用说明

    一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...

  8. Java二进制和位运算,这一万字准能喂饱你

    基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...

  9. 构建可扩展的GPU加速应用程序(NVIDIA HPC)

    构建可扩展的GPU加速应用程序(NVIDIA HPC) 研究人员.科学家和开发人员正在通过加速NVIDIA GPU上的高性能计算(HPC)应用来推进科学发展,NVIDIA GPU具有处理当今最具挑战性 ...

随机推荐

  1. 【2.0】使用默认日志slf4j配置

    一.SpringBoot日志简介 SpringBoot使用Commons Logging进行所有内部日志记录,但底层日志实现保持开放状态.为Java Util Logging,Log4j2和Logba ...

  2. java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory

    运行servler报错 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory 或 java.lan ...

  3. C# 线程 正确使用Thread.Join()停止方式

    /// <summary>        /// 停下线程        /// </summary>        private void MyStopTask()     ...

  4. Oracle 客户端 NLS_LANG 的设置

    参考链接1: https://blog.csdn.net/xinzhan0/article/details/78311417#t3 参考链接2: https://blog.csdn.net/xinzh ...

  5. Linux下调试.Net core(1):lldb的安装

    windows下,我们对于.net程序发生Crash,资源泄露,死锁等问题的分析,有神器windbg,那现在我们的.net core程序运行在linux上时,该怎么进行对对Core Dump文件进行分 ...

  6. CSS粘住固定底部的5种方法

    本文主要介绍一个Footer元素如何粘住底部,使其无论内容多或者少,Footer元素始终紧靠在浏览器的底部.我们知道,当内容足够多可以撑开底部到达浏览器的底部,如果内容不够多,不足以撑开元素到达浏览器 ...

  7. JS基础概念

    JS基础概念 1. 算法及流程图 算法类型:1.算数算法:2.事务性算法(解决某个问题的方法和先后顺序). JS语法概述 1. 引入JS的方法 1.用<script src="&quo ...

  8. 巧用同步请求处理react页面刷新问题

    很多时候,我们会遇到这种情况,组件加载需要请求后台数据,然后填充组件.那么我们一般会这样处理:如[使用异步请求的方式]代码: 加载组价的时候,未获得数据,render一个空的div: 然后异步请求数据 ...

  9. vue-update-表单形式复写方法上传图片

    handleSave() { const formData = new FormData(); /* eslint-disable */ for (let key in this.dataInfo) ...

  10. try与except处理异常语句

    ji 简介 与其他语言相同,在python中,try/except语句主要是用于处理程序正常执行过程中出现的一些异常情况,如语法错(python作为脚本语言没有编译的环节,在执行过程中对语法进行检测, ...