会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 高并发下怎样生成唯一的订单号?!

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

时间:2025-11-04 23:11:26 来源:益强数据堂 作者:应用开发 阅读:418次

本文转载自微信公众号「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分布式锁

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

(责任编辑:系统运维)

推荐内容
  • 固态硬盘导入系统教程(使用固态硬盘(SSD)为你的电脑带来飞跃性能提升)
  • 英雄联盟电脑视角锁定教程(提升游戏表现,掌握电脑视角锁定技巧)
  • 魅蓝5与Note6(详细比较两款手机的功能和性能,帮助你做出明智的选择)
  • 金山文档表格电脑使用教程(轻松掌握金山文档表格的使用技巧)
  • 台式电脑内置喇叭安装教程(一步步教你如何给台式电脑安装内置喇叭)
  • 乐视Maxx900(一部真正的智能手机,重新定义移动体验)