很多场景需要用到订单号,订单号可能会有很多元素组成,比如:特定字符+时间+自增长。其中大多情况下必不可少的是自增长部分。现提供利用redis来实现自增长的几种方式:
每天重置的自增长
/**
* 获取订单号自增长部分,每天重置
* @param key 主键
* @param model 格式模板,例如五位数: 00000
* @param maxNum 最大值
* @author lixiang
* @date 2019年04月18日 - 11:30
* @history 2019年04月18日 - 11:30 lixiang create.
*/
public static String getOrderNumber(String key, String model, int maxNum) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
int expireTime = (int) ((cal.getTimeInMillis() - System.currentTimeMillis()) / 1000);
long num = RedisUtil.incr(key);
// 达到最大值后返回null
if (num > maxNum) {
return null;
}
RedisUtil.expire(key, expireTime);
NumberFormat nf = new DecimalFormat(model);
return nf.format(num);
}
注意:到达最大值后需要怎么处理需自行修改,上面这段代码是适用于到达最大值后进行告警,因此我返回了null。
到达最大值后重置
/**
* 获取订单号自增长部分,到达最大值后重置
* @param key 主键
* @author lixiang
* @date 2019年04月18日 - 11:35
* @history 2019年04月18日 - 11:35 lixiang create.
*/
public static String getOrderNumber(String key, String model, int maxNum) {
NumberFormat nf = new DecimalFormat(model);
long num = RedisUtil.incr(key);
if (maxNum <= num) {
num = 1;
RedisUtil.set(key, num);
}
return nf.format(num);
}
后续有想到其他的再补充吧!