使用Redis中的incr实行自增,来实现订单号
如何生成唯一的订单序列号?
格式按照:yyyyMMdd+两位业务码+10位的自增序列,
比如20150101**99**0000000001。
思路:
1.获得日期很简单;
2.业务码是调用服务传入的参数;
3.使用Redis来实现10位的自增序列的保存和自增,使用serial.number:{日期}的格式来保存某一天的自增序列的值;
直接上代码:
第一步:
public class StringUtil {
static final int DEFAULT_LENGTH = 10;
/**
* 得到10位的序列号,长度不足10位,前面补0
*
* @param seq
* @return
*/
public static String getSequence(long seq) {
String str = String.valueOf(seq);
int len = str.length();
if (len >= DEFAULT_LENGTH) {// 取决于业务规模,应该不会到达10
return str;
}
int rest = DEFAULT_LENGTH - len;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rest; i++) {
sb.append(‘0‘);
}
sb.append(str);
return sb.toString();
}
}第二步:
public Long incr(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.HOURS);
}
return increment;
}补充:incr是从0开始,如果需要从1开始,需要多加一次,这里需要1开始。还有个坑因为是五位数,所以需要将没有的位数用0去补齐。
第三步:
@Service
public class SerialNumberService {
@Resource
private RedisDao redisDao;//生成导入批次号
private String getOrder() {
String order = "";
String dateString = DateUtils.formatDate(new Date());
Long incr = redisComponent.incr("deviceRepair" + dateString, 24);
if (incr == 0) {
incr = redisComponent.incr("deviceRepair" + dateString, 24);
}
DecimalFormat df = new DecimalFormat("00000");
String[] drs = dateString.split("-");
for (int i = 1; i < drs.length; i++) {
order += drs[i];
}
order = "X" + order + df.format(incr);
return order;
} 相关推荐
baike 2020-05-25
翡翠谷 2019-12-10
ThinkingLink 2019-11-01
liguangix 2018-08-10
jacklife 2017-05-09
smartleizi 2015-12-08
wangdoudou0 2014-02-07
wonner 2017-10-05
Liuzqi 2019-05-03
网上的很多PHP微信支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,希望可以给各位想接入微信支付的带来些许帮助和借鉴意义。直接运行该文件即可给指定的微信用户退款。
PHP二次开发 2018-05-30
YClimb 2019-04-12
phptyong 2019-04-11
cjylean 2019-04-04
PHP100 2019-03-28