OrderNumberGenerator.java 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package com.zhentao.util;
  2. import redis.clients.jedis.Jedis;
  3. import java.time.LocalDateTime;
  4. import java.time.format.DateTimeFormatter;
  5. public class OrderNumberGenerator {
  6. private static final String REDIS_KEY = "order_number_counter";
  7. private static final String REDIS_HOST = "localhost";
  8. private static final int REDIS_PORT = 6379;
  9. private static final DateTimeFormatter DATE_TIME_FORMATTER =
  10. DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  11. /**
  12. * 生成格式化订单号(线程安全)
  13. * @return 格式如 ORDER2023051514300000001
  14. */
  15. public static synchronized String generateOrderNumber() {
  16. try (Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT)) {
  17. // 生成递增序号(Redis 原子操作)
  18. Long nextOrderNumber = jedis.incr(REDIS_KEY);
  19. // 格式:ORDER + 年月日时分秒 + 7位序号(不足补零)
  20. return String.format("%s%07d",
  21. DATE_TIME_FORMATTER.format(LocalDateTime.now()),
  22. nextOrderNumber);
  23. }
  24. }
  25. /**
  26. * 初始化 Redis 计数器(可选)
  27. */
  28. public static void initRedisCounter(long initialValue) {
  29. try (Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT)) {
  30. jedis.setnx(REDIS_KEY, String.valueOf(initialValue));
  31. }
  32. }
  33. }