生成序列号

在开发过程中经常要用到序列号,比如订单号,这里介绍两种方法,一种是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

猜你喜欢

转载自www.cnblogs.com/come-on-come-on/p/11359738.html