使用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; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM