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

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

为舒兰等地区用户提供了全套网页设计制作服务,及舒兰网站建设行业解决方案。主营业务为成都网站设计、成都做网站、舒兰网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

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

1、单系统使用object

 
 
 
  1. ///  
  2.    /// 单号助手 
  3.    ///  
  4.    public class BillNoHelper 
  5.    { 
  6.  
  7.        ///  
  8.        ///  防止创建类的实例 
  9.        ///  
  10.        private BillNoHelper() { } 
  11.        private static readonly object locker = new object(); 
  12.        private static int _sn = 0; 
  13.        ///  
  14.        /// 生成单据编号 
  15.        ///  
  16.        ///  
  17.        public static string GenerateId() 
  18.        { 
  19.            lock (locker)   //lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 
  20.            { 
  21.                if (_sn == 9999) 
  22.                { 
  23.                    _sn = 1; 
  24.                } 
  25.                else 
  26.                { 
  27.                    _sn++; 
  28.                } 
  29.                return DateTime.Now.ToString("yyMMddHHmmss") + _sn.ToString().PadLeft(4, '0'); 
  30.            } 
  31.        } 
  32.        ///  
  33.        /// 唯一值 
  34.        ///  
  35.        ///  
  36.        public static string guid() 
  37.        { 
  38.            return Guid.NewGuid().ToString().Replace("-", ""); 
  39.        } 
  40.        ///  
  41.        /// GuidExtension 
  42.        ///  
  43.        ///  
  44.        ///  
  45.        public static string IsNum(Guid guid) 
  46.        { 
  47.            var s = guid.ToString(); 
  48.            var sb = new StringBuilder(); 
  49.            for (int i = 0; i < s.Length; i++) 
  50.            { 
  51.                if (Char.IsNumber(s, i)) 
  52.                { 
  53.                    sb.Append(s.Substring(i, 1)); 
  54.                } 
  55.            } 
  56.            return sb.ToString(); 
  57.        } 
  58.  
  59.  
  60.        #region 生成 Coupon Key  
  61.        private static readonly object locker2 = new object(); 
  62.        private static int _sn2 = 0; 
  63.        ///  
  64.        /// 生成key 12位  字母+数字  
  65.        ///  
  66.        ///  
  67.        public static string GenerateCouponKey()// 
  68.        { 
  69.            string s; 
  70.            lock (locker2) 
  71.            { 
  72.                if (_sn2 == 9999999) 
  73.                { 
  74.                    _sn2 = 1; 
  75.                } 
  76.                else 
  77.                { 
  78.                    _sn2++; 
  79.                } 
  80.                s = $"Qq@,.*745u787#$@,.><;'{DateTime.Now.Ticks}{_sn2}"; 
  81.            } 
  82.            return MD5_16(s); 
  83.  
  84.        } 
  85.        private static string MD5_16(string p_str) 
  86.        { 
  87.  
  88.            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); 
  89.            byte[] data = System.Text.Encoding.Default.GetBytes(p_str); 
  90.            byte[] md5Data = md5.ComputeHash(data); 
  91.            string strResult = System.BitConverter.ToString(md5Data, 4, 8); 
  92.            md5.Clear(); 
  93.            strResult = strResult.Replace("-", "").ToUpper(); 
  94.            return strResult; 
  95.        } 
  96.        #endregion 
  97.  
  98.    } 

2、数据唯一索引

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

3、使用redis分布式锁

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

新闻名称:高并发下怎样生成唯一的订单号?
网站链接:http://www.shufengxianlan.com/qtweb/news44/132894.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联