最新动态新闻

让你轻松掌握天铭网络的第一手信息

烟台网站制作技术问答

c#生成不重复订单号(16位),不需要确认数据库,商城网站建设中常用

2017/06/27

先贴代码吧:

?public class OrderForm

??? {

??????? *****

??????? private static long np1 = 0,np2 = 0,np3 = 1;?//临时计算用。

??????? private static object orderFormNumberLock = new object();//线程并行锁,以保证同一时间点只有一个用户能够操作流水号。如果分多个流水号段,放多个锁,并行压力可以更好的解决,大家自己想法子扩充吧

??????? private string?strOrderNumber = null;//订单号。

??????? ****

????????其它操作、属性,此处内容省略。

??????? ****

??????? ///

??????? /// 初始化订单号码

??????? /// 编码规则:(16进制,从DateTime.MinValue起到此时?#27169;?#24635;天数 ? 今天的总秒数 ? 当前秒内产生的订单序号,其中今天的订单每秒清零。

??????? /// 该方法线程安全。

??????? ///

??????? public void InitializeOrderNumber()

??????? {

??????????? DateTime now = DateTime.Now;

??????????? TimeSpan span = now - DateTime.MinValue;

??????????? long tmpDays = span.Days;

??????????? long seconds = span.Hours * 3600 ? span.Seconds;

??????????? StringBuilder sb = new StringBuilder();

??????????? Monitor.Enter(orderFormNumberLock);?//锁定资源

??????????? if(tmpDays != np1){

??????????????? np1 = tmpDays;

??????????????? np2 = 0;

??????????????? np3 = 1;

??????????? }

??????????? if (np2 != seconds)

??????????? {

??????????????? np2 = seconds;

??????????????? np3 = 1;

??????????? }

??????????? sb.Append(Convert.ToString(np1, 16).PadLeft(5, '0') ? Convert.ToString(np2, 16).PadLeft(5, '0') ? Convert.ToString(np3 ?, 16).PadLeft(6, '0'));

??????????? Monitor.Exit(orderFormNumberLock);?//释放资源

????????????strOrderNumber = sb.ToString();

??????? }

??????? ///

??????? /// 获取订单号表示的?#25484;?/p>

??????? /// 即:反向获取订单号的?#25484;?/p>

??????? ///

??????? public DateTime DateTimeFromOrderNumber

??????? {

??????????? get

??????????? {

??????????????? if (!string.IsNullOrEmpty(OrderNumber))

??????????????? {

??????????????????? return DateTime.MinValue.AddDays(Convert.ToInt64(OrderNumber.Substring(0,5), 16)).AddSeconds(Convert.ToInt64("0x" ? OrderNumber.Substring(5, 5), 16));

??????????????? }

??????????????? else

??????????????? {

??????????????????? return DateTime.MinValue;

??????????????? }

??????????? }

??????? }

}

?

思路:

1.实现:采用时间信息来标识订单是一个好的想法。但在微观尺度上,时间的秒与毫秒就会显的尺度很大,程序很容易在1秒内生成多个订单号,因此还需要添加一个流水号,流水号有多大容量,程序就可以在1秒内生成多少个订单号。

2.要求:订单号应当尽量简短。时间的字符串加起来也不短,如:2015-06-24??11: 12:55,去掉非字符是(4 2 2 2*3)总共14个字符,如果将时间改为16进制存储,则可以省略到10个字符以内。其它6位可以让给流水号使用。

3.结果:

订单号可以追溯到用户下单的秒级别时间;

订单号流水在秒级别内可以达到0xFFFFFF的空量,即:16777215个订单,即每秒中理论可以达到1600万个以?#31995;?#35746;单号,而且不重复。

订单号可以排序:如果存储字符,可以按字符排序,同一个时间段的订单会在一起。如果把订单号转换成数字存储则可以精确排序。

当前时间中的?#25484;冢?#25353;从0001-01-01起到现在的天数,采用16进制存储,比如今天是2015-06-24,换算成天数:2015*365 6*30 24=735679天,换算成16进制:B39BF,仅占5个字符。而5个字符的空量(0xFFFFF的空量)是1048575天,换算成年:2872年。现在是2015年,可以用到850年以后,放心了吧!如果从2000年算起,仅2个字符就行,占用容量更小,其它3个字符位置可以更多的给订单流水号使用或附加其它信息。

当前天中的秒数同理,只是从今天0时开?#25216;?#31639;,也是5个字符,不再辍述。


0
分享到:
2019赫罗纳√西班牙人
幸运28倍投技巧 炸金花手机版赢现金 北京pk10直播官方网站 黄金时时彩计划软件官网 利达娱乐是什么公司 pk10赛车冠军大小计划 非凡炸金花玩的人多吗 缅甸金鼎国际娱乐app psv有什么好玩的游戏 MC娱乐网 北京pk10全天计划 天津时时开奖结果5 时时彩单双计划 亿彩国际彩票网站 北京pk拾app下载 极速赛车全天单期计划