1.使用场景

通常,在做一些表单的功能时,需要生成唯一不重复的订单单号,本文提供的帮助类可以适合大多数场景的单号生成使用,拿来即用,方便快捷无重复。而且,在高并发的情况下也是可以使用的。

之前看到有人提供的【时间(时分秒)】+【随机数字】的方式,个人认为这种方式并不能保证唯一,因为生成的随机数是可能重复的,在高并发的情况下,在同一秒内是有可能产生两个相同的编号的。

本文使用的方法是【时间(时分秒)】+【累加数】的方式,使用一个静态int变量存储值,在项目运行过程中int值是不断累加的,一般项目中每秒生成的订单号不会大于1000条,所以是肯定不会重复的。假如有个非常特殊的项目每秒产生的订单号可能远大于1000条,那么只需更改GenerateNo方法中的:

if (_sn == )
{
_sn = ;
}

将1000调整为更大的整数或者int.MaxValue即可,如果考虑所有单号的位数一致性,可以将_sn.ToString().PadLeft(3, '0')中的3调整为10或更大的位数。

2.代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks; namespace Helper
{
/// <summary>
/// 单号生成帮助类
/// 2019-10-15 12:10 by boxuming 创建
/// </summary>
public class OrderHelper
{
private static readonly object Locker = new object();
private static int _sn = 0; /// <summary>
/// 生成单号
/// </summary>
/// <param name="pre">单号前缀</param>
/// <returns></returns>
public static string GenerateNo(string pre = "")
{
lock (Locker) //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
{
if (_sn == 1000)
{
_sn = 0;
}
else
{
_sn++;
}
Thread.Sleep(100);
return pre + DateTime.Now.ToString("yyyyMMddHHmmss") + _sn.ToString().PadLeft(3, '0');
}
}
}
}

最新文章

  1. JS/HTML 保存图片到本地:HTML &lt;a&gt; download 属性
  2. 条款10:令operator=返回一个*this的引用
  3. Git PHP提交
  4. 源代码jar包中中文注释乱码
  5. XML 解析中,如何排除控制字符
  6. C语言:类似linux内核的分等级DEBUG宏(打印宏)
  7. 2017,科学使用strace神器(附代码,举栗子)
  8. Android studio导出AAR包问题整理。
  9. overflow使用說明
  10. Android OpenGL ES 开发(一): OpenGL ES 介绍
  11. 简述一下MVC和MVVM
  12. 第30章 部署 - Identity Server 4 中文文档(v1.0.0)
  13. 使用npm安装appium时的坑
  14. (等比数列)P1423 小玉在游泳 洛谷
  15. poj3417lca+树上差分
  16. Python的set集合
  17. php curl抓取类分享
  18. codeforces 957 A. Tritonic Iridescence
  19. 使用vs的查找功能,简单大概的统计vs中的代码行数
  20. java8新特性(六):Stream多线程并行数据处理

热门文章

  1. 良心送分题(牛客挑战赛35E+虚树+最短路)
  2. HTML元素脱离文档流的三种方法
  3. keil中使用——变参数宏__VA_ARGS__
  4. Edit Video
  5. ESP8266 LUA脚本语言开发: 测试下诱人的程序
  6. struct utmp
  7. Spring Boot 知识笔记(thymleaf模板引擎)
  8. C# 获得本地通用网卡信息
  9. [技术博客]ubuntu+nginx+uwsgi+Django+https的部署
  10. 【Linux脚本学习案例】shell脚本多通道并发执行存储过程