1. 程式人生 > 其它 >基於 Redis 生成分散式訂單號

基於 Redis 生成分散式訂單號

環境依賴:

//spingBoot <version>2.6.6</version>
//jdk11
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

程式碼簡單易理解直接上成品;

package com.wyj.my_redis.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author: yijun.wen
 * @date: 2022/4/15 11:00 上午
 * @description:
 */
@Component
public class OrderGenerateUtils {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 全域性自增數
     */
    private static int count = 1;

    /**
     * 格式化的時間字串
     */
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    private String REDIS_ORDER_NUM_KEY_PRE = "fms:order:";

    /**
     * 生成16位訂單編號:8位日期+2位業務場景+6位以上 Redis 自增 id
     *
     * @param type 業務場景
     * @return
     */
    public String getOrderNum(int type) {
        StringBuilder sb = new StringBuilder();
        String date = getNowDateStr();
        // 拼接key值
        String key = REDIS_ORDER_NUM_KEY_PRE + date;
        Long increment = incr(key, count);
        sb.append(date);
        // (動態匹配)2位業務場景 1:支付寶,2:微信,3:訂單編號
        sb.append(String.format("%02d", type));
        String incrementStr = increment.toString();
        if (incrementStr.length() <= 6) {
            sb.append(String.format("%06d", increment));
        } else {
            sb.append(incrementStr);
        }
        return sb.toString();
    }

    /***
     * 
     * @param key
     * @param delta
     * @return
     */
    public Long incr(String key, long delta) {
        Long increment = redisTemplate.opsForValue().increment(key, delta);
        if (increment.equals(1L)) {
            redisTemplate.expire(key, 1, TimeUnit.DAYS);
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 獲取當前時間年月日字串
     *
     * @return
     */
    private static String getNowDateStr() {
        return sdf.format(new Date());
    }
}