• C#生成唯一不重复订单号


    在弄电商类网站的时候,往往是根据年月日时分秒的格式生成订单号(yyyyMMddHHmmss),为了解决并发性,就直接在生成订单号的区域块加上lock。
      下面,我们来简单测试一下。
    1.新建项目(控制台应用程序)
    2.新建一个类:OrderIdHelper.cs
     /// <summary>
     /// 订单助手
     /// </summary>
     class OrderIdHelper
     {
       private static readonly object Locker = new object();
       private static string _tempId = "";
    
       /// <summary>
       /// 生成订单编号
       /// </summary>
       public static void GenerateId()
       {
         lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
         {
           var orderId = "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss"); //年月日时分秒
    
           if (string.Equals(_tempId, orderId))
           {
             throw new Exception("订单号重复!");
           }
    
           _tempId = orderId;
    
           Console.WriteLine(orderId);
         }
       }
     }
    
    
    3.Program.cs
     class Program
     {
       static void Main(string[] args)
       {
         //创建包含两个线程的数组
         var threads = new Thread[2]
         {
           new Thread(OrderIdHelper.GenerateId),
           new Thread(OrderIdHelper.GenerateId),
         };
    
         foreach (var thread in threads)
         {
           //线程启动
           thread.Start();
         }
    
         Console.Read();
       }
     }
    
    
    4.结果:=====OrderIdDemo_1.rar 点我下载=====
    5.发现一个不错的订单号生成规则,稍作改动: 不重复订单号生成规则(原网址)
    /// <summary>
    /// 订单助手
    /// </summary>
    public class OrderHelper
    {
      /// <summary>
      /// 防止创建类的实例
      /// </summary>
      private OrderHelper() { }
    
      private static readonly object Locker = new object();
      private static int _sn = 0;
    
      /// <summary>
      /// 生成订单编号
      /// </summary>
      /// <returns></returns>
      public static string GenerateId()
      {
        lock (Locker)  //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。
        {
          if (_sn == int.MaxValue)
          {
            _sn = 0;
          }
          else
          {
            _sn++;
          }
          
          Thread.Sleep(100);
    
          return "Wen" + DateTime.Now.ToString("yyyyMMddHHmmss")+ _sn.ToString().PadLeft(10, '0');
        }
      } 
    }
    
    
     6.关于使用GUID的个人见解。
     ①不清楚生成的时间,不方便管理。
      ②官方解释:GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。 此标识符重复的可能性非常小。

    1

  • 相关阅读:
    Mybatis(二) Mybatis通用的写法
    Mybatis(一)Mybatis相关概念
    NodeJS添加Jquery依赖
    安卓、IOS端AEC密钥加密 Java端密钥解密通用实现(16进制表现形式)
    关于博客园首页及详情页美化的代码
    MD5用户密码加密工具类 MD5Util
    .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)
    FtpServer穿透内网访问配置踩坑笔记
    .Net Core之编辑json配置文件
    玩转MQTT-阿里云之MQTT使用(下)
  • 原文地址:https://www.cnblogs.com/Anthony518/p/12009641.html
Copyright © 2020-2023  润新知