博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 生成不重复订单号 优化版本 订单号格式为yyyymmdd后面自增
阅读量:4074 次
发布时间:2019-05-25

本文共 2684 字,大约阅读时间需要 8 分钟。

博主提供的开源组件 Mybatis-JPA 组件开源地址 

@Service("orderNumberDubbboServiceImpl")public class OrderNumberDubbboServiceImpl implements OrderNumberDubbboService{    private static Logger LOG = Logger.getLogger(OrderNumberDubbboServiceImpl.class);    private static final Integer ONCE_ORDER_NUM_CREATE =        ConverterUtils.toInt(EConfig.getOtherConfigPropertiesValue("once_order_num_create"), 10);    /**     * redis锁操作service     */    @Resource(name = "redisLockServiceImpl")    private RedisLockService redisLockService;    @Resource(name = "redisCacheServiceImpl")    private RedisCacheService
redisCacheService; /** * 预先 产生很多订单号 key订单号类型value 预先生产出来的订单号 */ private Map
> orderNumberQueueMap = new ConcurrentHashMap<>(); public synchronized String getOneOrderNumber(String type) { ConcurrentLinkedQueue
orderNumbers = null; orderNumbers = orderNumberQueueMap.get(type); // 如果有这个类型 并且还有剩余的订单号 if (orderNumberQueueMap.containsKey(type) && (!orderNumbers.isEmpty())) { return orderNumbers.poll(); } initOrderNumber(type); orderNumbers = orderNumberQueueMap.get(type); return orderNumbers.poll(); } /** * 初始化指定类型的订单号 * * @param type 类型 */ private synchronized void initOrderNumber(String type) { // 锁表(用于判断现在是否可以创建订单)一小时的超时时间 if (!redisLockService.addRedisLock("REDIS_LOCK_MAX_ORDER_NUMBER", 2000, 2)) { LOG.infoMsg("获取订单编号失败,订单编码类型为:{}", type); throw new CheckException(PubResult.SYSTEM_BUSY.asResult()); } Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); String date = (new SimpleDateFormat("yyyyMMdd")).format(calendar.getTime()); String key = "order_number_" + date + "_" + type; // key:常量+日期+订单号 value(orderIndex):日期拼接数据 Integer orderIndex = redisCacheService.get(key); orderIndex = orderIndex == null ? 0 : orderIndex; int minOrderIndex = orderIndex + 1; // 每次产生1w个订单号 orderIndex += ONCE_ORDER_NUM_CREATE; redisCacheService.put(key, orderIndex); redisLockService.delRedisLock("REDIS_LOCK_MAX_ORDER_NUMBER"); ConcurrentLinkedQueue
orderNumbers = orderNumberQueueMap.containsKey(type) ? orderNumberQueueMap.get(type) : new ConcurrentLinkedQueue<>(); orderNumberQueueMap.put(type, orderNumbers); for (int i = minOrderIndex; i <= (ONCE_ORDER_NUM_CREATE + minOrderIndex); i++) { orderNumbers.offer(StringUtil.formatOrderNumber(date, i)); } }

思路是 先生成 1w个订单号扔到  队列中,然后 有需要的直接在队列取,如果取不到的话,那么在生成1w个

 

 

 

转载地址:http://erwni.baihongyu.com/

你可能感兴趣的文章
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>