您现在的位置是:亿华云 > 域名

高并发下怎样生成唯一的订单号?

亿华云2025-10-02 18:45:42【域名】9人已围观

简介本文转载自微信公众号「UP技术控」,作者conan5566。转载本文请联系UP技术控公众号。一个软件系统,肯定到处充满着各种单据,也必然需要有各种单据号与之对应。比如:电商行业的订单号、支付流水号、退

本文转载自微信公众号「UP技术控」,高并作者conan5566。发下转载本文请联系UP技术控公众号。样生

 一个软件系统,订单号肯定到处充满着各种单据,高并也必然需要有各种单据号与之对应。发下比如:电商行业的样生订单号、支付流水号、订单号退款单号等等。高并SCM的发下采购单号、进货单号、样生出货单号、香港云服务器订单号盘点单号等。高并在一个企业内部或者一个2C的发下平台,无法避免的样生需要通过某个单据号来进行沟通。所以一个好的单据号必然是便于沟通的。那么如何创建全局唯一的单据号。

1、单系统使用object

/// <summary>    /// 单号助手    /// </summary>    public class BillNoHelper    {         /// <summary>        ///  防止创建类的云服务器实例        /// </summary>        private BillNoHelper() {  }        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 == 9999)                {                     _sn = 1;                }                else                {                     _sn++;                }                return DateTime.Now.ToString("yyMMddHHmmss") + _sn.ToString().PadLeft(4, 0);            }        }        /// <summary>        /// 唯一值        /// </summary>        /// <returns></returns>        public static string guid()        {             return Guid.NewGuid().ToString().Replace("-", "");        }        /// <summary>        /// GuidExtension        /// </summary>        /// <param name="guid"></param>        /// <returns></returns>        public static string IsNum(Guid guid)        {             var s = guid.ToString();            var sb = new StringBuilder();            for (int i = 0; i < s.Length; i++)            {                 if (Char.IsNumber(s, i))                {                     sb.Append(s.Substring(i, 1));                }            }            return sb.ToString();        }        #region 生成 Coupon Key         private static readonly object locker2 = new object();        private static int _sn2 = 0;        /// <summary>        /// 生成key 12位  字母+数字         /// </summary>        /// <returns></returns>        public static string GenerateCouponKey()//        {             string s;            lock (locker2)            {                 if (_sn2 == 9999999)                {                     _sn2 = 1;                }                else                {                     _sn2++;                }                s = $"Qq@,.*745u787#$@,.><;{ DateTime.Now.Ticks}{ _sn2}";            }            return MD5_16(s);        }        private static string MD5_16(string p_str)        {             System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();            byte[] data = System.Text.Encoding.Default.GetBytes(p_str);            byte[] md5Data = md5.ComputeHash(data);            string strResult = System.BitConverter.ToString(md5Data, 4, 8);            md5.Clear();            strResult = strResult.Replace("-", "").ToUpper();            return strResult;        }        #endregion    } 

2、数据唯一索引

利用数据库索引的特性生成唯一id.

3、使用redis分布式锁

在同一时间只会有一个客户端能获取到锁,其它客户端无法同时获取,这把锁在一段有限的时间之后,一定会被释放(正常释放或异常释放)。

很赞哦!(1273)