zoukankan      html  css  js  c++  java
  • C#生成唯一不重复订单号帮助类

    1.使用场景

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

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

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

    if (_sn == 1000)
    {
        _sn = 0;
    }

    将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');
                }
            }
        }
    }
  • 相关阅读:
    登陆界面
    信号和槽
    线程同步
    java script简介
    css粘性定位sticky的使用
    vue中使用qrcodejs2生成二维码
    webpack基本使用
    总结一些h5出现的问题及解决方案
    srcset属性配合w宽度描述符配合sizes属性
    vw实现页面布局
  • 原文地址:https://www.cnblogs.com/bossing/p/11678975.html
Copyright © 2011-2022 走看看