RedisTemplate序列号自增id(当前日期+序列号)

参照 https://blog.csdn.net/weixin_42851487/article/details/82842055

@Autowired
private RedisService redisService;

测试实例

redisService.getSerialBizId("CG","yyyyMMddHH",5)

/**
 * 生成单据号
 * @param prefixBizCode
 * @param timeFormatter
 * @param numLength
 * @return
 */
public String getSerialBizId(String prefixBizCode, String timeFormatter, int numLength) {
   String serialNumLength="";
   for(int i=0; i<numLength; i++){
      serialNumLength+="0";
   }
   if(StringUtil.isEmpty(timeFormatter)){
      timeFormatter="yyyyMMddHHmmss"; //yyyyMMddHHmmss
   }
   //默认序列号位数
   if(StringUtil.isEmpty(serialNumLength)){//默认
      serialNumLength="000000";
   }

   SimpleDateFormat sdf=new SimpleDateFormat(timeFormatter);
   Date date=new Date();
   String formatDate=sdf.format(date);
   String key= prefixBizCode+formatDate;
   Long incr = getIncr(key, getCurrent2TodayEndMillisTime());
   if(incr==0) {
      incr = getIncr(key, getCurrent2TodayEndMillisTime());//从000001开始
   }

   DecimalFormat df=new DecimalFormat(serialNumLength);//流水号位数
   return prefixBizCode+formatDate+df.format(incr);
}

/**
 *  根据key获取redis值
 * @param key
 * @param liveTime
 * @return
 */
public Long getIncr(String key, long liveTime) {
   RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
   Long increment = entityIdCounter.getAndIncrement();

   if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
      entityIdCounter.expire(liveTime, TimeUnit.MILLISECONDS);//单位毫秒
   }
   return increment;
}

/**
 * 系统日期的毫秒数
 * @return
 */
public Long getCurrent2TodayEndMillisTime() {
   Calendar todayEnd = Calendar.getInstance();
   // Calendar.HOUR 12小时制
   // HOUR_OF_DAY 24小时制
   todayEnd.set(Calendar.HOUR_OF_DAY, 23);
   todayEnd.set(Calendar.MINUTE, 59);
   todayEnd.set(Calendar.SECOND, 59);
   todayEnd.set(Calendar.MILLISECOND, 999);
   return todayEnd.getTimeInMillis()-new Date().getTime();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值