通過redis生成分佈式自增的訂單編號

在我們電商交易系統裏面經常會生成訂單號,一般採用UUID直接生成字符串,理論情況下不會重複,但是還是有可能重複的,並且這種訂單號可讀性特別差,所以我們會選擇用redis來生成訂單號,具體代碼如下:

1,用DateHelper生成由年月日時分秒生成14位數,再通過redis生成6位數。這種可以用BigInteger存儲,理論上可以支持1秒產生100萬個訂單,如果實際生產會更大,可以把倍數值調大。

import com.utils.DateHelper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * <h3>固定生成20位</h3>
 * 2019 1021 1730 56 000001
 * @author hcmony
 * @since V1.0.0, 2019/10/21 10:21
 */
@Configuration
@ConditionalOnBean(JedisPool.class)
public class OrderIdGenerator {
    @Autowired
    private JedisPool jedisPool;

    private static final int DEFAULT_LEN = 6;
    private static final String DEFAULT_KEY = "com.bxm.pay.id";

    public String next() {
        Jedis jedis = jedisPool.getResource();
        try {
            Long value = jedis.incr(DEFAULT_KEY);
            return getDateTime() + StringUtils.leftPad(StringUtils.right(String.valueOf(value), DEFAULT_LEN), DEFAULT_LEN, '0');
        } finally {
            if (null != jedis) {
                jedis.close();
            }
        }
    }

    private String getDateTime() {
        return DateHelper.format(DateHelper.PATTERN_STR14);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章