您现在的位置是:亿华云 > 域名
高并发下怎样生成唯一的订单号?
亿华云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)