在我們電商交易系統裏面經常會生成訂單號,一般採用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);
}
}