0
点赞
收藏
分享

微信扫一扫

使用 StringRedisTemplate 实现自增流水号


  •  controller 

@Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("/generateRkNumber")
    public R generateRkNumber() {
        try{
            String currentDate = SequenceUtil.getCurrentDate();
            String key = SequenceUtil.REDIS_RUKU_PREFIX + currentDate;
            long sequence = stringRedisTemplate.opsForValue().increment(key);
            String seq = SequenceUtil.getSequence(sequence);
            StringJoiner sj = new StringJoiner("");
            sj.add(SequenceUtil.SEQ_RUKU_PREFIX).add(currentDate).add(seq);// 日期拼接序列号
            return R.ok(sj.toString());
        }catch (Exception e){
            log.error("生成流水号异常:"+e.getMessage(),e);
            return R.failed(e.getMessage());
        }
    }

  • SequenceUtil

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.StringJoiner;

/**
 * 自增流水号: 前缀 + yyyyMMdd + 序列号
 **/
public class SequenceUtil {

    // 序列号的长度
    static final int DEFAULT_LENGTH = 4;
    // REDIS入库单号前缀
    public static final String REDIS_RUKU_PREFIX = "serial.number:ruku:";
    // 入库流水号前缀
    public static final String SEQ_RUKU_PREFIX = "RK";

    /**
     * 格式化 key
     * @param seq
     * @return
     */
    public static String getSequence(Long seq) {
        String str = String.valueOf(seq);
        int len = str.length();
        // 取决于业务规模
        if (len >= DEFAULT_LENGTH) {
            return str;
        }
        int rest = DEFAULT_LENGTH - len;
        StringJoiner stringJoiner = new StringJoiner("");
        for (int i = 0; i < rest; i++) {
            stringJoiner.add("0");
        }
        stringJoiner.add(str);
        return stringJoiner.toString();
    }

    /**
     * 获取当前年月日
     * @return
     */
    public static String getCurrentDate(){
        LocalDate localDate = LocalDate.now();
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
        return df.format(localDate);
    }
}

举报

相关推荐

0 条评论