• 生成序列号


    在开发过程中经常要用到序列号,比如订单号,这里介绍两种方法,一种是Redis生成,一种是Sql

    一、Redis生成序列号例子

     public string GetFileName()
            {
                var nextDay = DateTime.Now.AddDays(1);
                var dueTime = new DateTime(nextDay.Year, nextDay.Month, nextDay.Day, 0, 0, 0).Subtract(DateTime.Now);//第二天凌晨过期
                var IncomeNumber = RedisCacheHelper.Instance.GetIncrValue(PictureLibraryConsts.FileNameKey, 1, true, dueTime);
                var fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + IncomeNumber.ToString().PadLeft(8, '0');
                return fileName;
            }

    其中RedisCacheHelper.Instance.GetIncrValue方法如下:

     /// <summary>
            /// 根据原子性获取key的自增值
            /// </summary>
            /// <param name="key">自增的key</param>
            /// <param name="key">自增的value</param>
            /// <param name="autoRemoveKey">是否自动删除</param>
            /// <param name="expireTime">删除key的过期时间</param>
            /// <returns></returns>
            public long GetIncrValue(string key, long value = 1, bool autoRemoveKey = true, TimeSpan expireTime = default(TimeSpan))
            {
                if (string.IsNullOrEmpty(key)) throw new Exception("key为空");
                try
                {
                    var increaseValue = redisClient.Increment(key, value);
                    //第一次获取时,并且自动删除Key
                    if (increaseValue == 1 && autoRemoveKey)
                    {
                        var _expireTime = expireTime == default(TimeSpan) ? TimeSpan.FromDays(2) : expireTime;//默认时间为2天
                        SetExpireTime(key, _expireTime);
                    }
                    return increaseValue;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    二、利用SQL生成序列号(来自慕课网)

    本文的sql用的是mysql

    首先建一张表如下:

    然后新建存储过程如下:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `CreateOrderNo`()
    BEGIN
        DECLARE v_cnt INT;
        DECLARE v_timestr INT;
        DECLARE rowcount BIGINT;
        set v_timestr=DATE_FORMAT(now(),'%Y%m%d');
        select ROUND(rand()*100,0)+1 into v_cnt;
        start TRANSACTION;
            update order_seq set order_sn=order_sn+v_cnt where timestr=v_timestr;
            if row_count()=0 then
                insert into order_seq(timestr,order_sn)VALUES(v_timestr,v_cnt);     
            end if;
            select CONCAT(v_timestr,LPAD(order_sn,7,0)) as order_sn
            from order_seq where timestr=v_timestr;
        COMMIT;
    END
  • 相关阅读:
    java 缓存框架java caching system使用示例
    2020牛客寒假算法集训营2
    VJ train1 O统计问题 题解
    ACM#学习心得0
    2020牛客寒假集训营1
    高精度加减乘除
    VJ train1 I彼岸
    VC编译常见错误
    EVC开发MapXMobile 环境搭建
    用Evc+Pocket PC 2003 开发MapxMobie
  • 原文地址:https://www.cnblogs.com/come-on-come-on/p/11359738.html
Copyright © 2020-2023  润新知