JAVA 生成不重复订单号 优化版本 订单号格式为yyyymmdd后面自增
2017-12-18 16:50
423 查看
@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<Integer> redisCacheService; /** * 预先 产生很多订单号 key订单号类型value 预先生产出来的订单号 */ private Map<String, ConcurrentLinkedQueue<String>> orderNumberQueueMap = new ConcurrentHashMap<>(); public synchronized String getOneOrderNumber(String type) { ConcurrentLinkedQueue<String> 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<String> 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个
相关文章推荐
- 关于Java Web 使用 iText 将数据库中的 表 的数据 生成 PDF 格式文件(升級版本)
- Java订单号生成,唯一订单号(日均千万级别不重复)
- 【java】RC4加密转16进制获取长度为40的不重复优惠码字符串 【未优化版本】
- 高并发 sql 生成不重复编号 (订单号) & 如何在高并发分布式系统中生成全局唯一Id
- Java生成自己的软件才能读写的独特格式文件
- 【Java】随机生成范围[min,max]之间的整数数组,且元素值不重复
- 一个简单生成Excel文件格式的java包。
- java中生成无重复随机数的2种方法
- JAVA后端生成Token(令牌),用于校验客户端,防止重复提交
- 新浪微博短链接的生成算法(Java版本)
- java生成无重复随机数的2种方法
- 生成子集(没有重复元素版本)
- testng+maven+java+idea 接口测试入门二:使用reportng优化报告格式
- AXIS1版本 WSDL生成JAVA客户端
- java.util.zip.ZipException: duplicate entry(重复依赖多版本的类库)
- java(优化四) 自动生成pdf文件并保存到本地
- 验证码生成(java版本)
- Java 生成PDF417格式的二维码
- 一个生成josn格式的java类(转)
- C# 同一时间批量生成订单号不重复