1.前言

这是我写的工具类之一:根据日期生成唯一顺序订单号。

用Java 配合 Redis 实现包含日期的顺序订单号的生成, 效率可以达到 2500+/s 1000W+/h 个 。

2.基本介绍

框架: Spring Boot

依赖: Redis

实现方式:生成订单号之前找到保存的最大ID值,并且设定过期时间(每天都从1开始生成);然后判断生成订单号队列里的订单号数量,如果达到阈值则生成新的一批订单号,如果没有达到阈值则直接返回订单号。

orderNoInitSize; //(order生成的速度)

orderNoCreateLength; //(需要重新生成的阈值)

orderLength; //(订单顺序号的位数 ,默认6位支持每天生成999999个订单号)

3.完整代码

@Override

public String getOrder(String type) {

DateFormat df = new SimpleDateFormat("yyyyMMdd");

String dayDf=df.format(new Date());

String orderKey=type.toString().concat("_").concat(dayDf);

if(getRedisSize(orderKey)<=orderNoCreateLength) {

this.generateInit(orderKey,type,dayDf);

}

return getOrderNo(orderKey);

}

//初始化

synchronized private void generateInit(String orderKey,String type,String dayDf) {

List orders=new ArrayList<>();

Long max=this.generate(orderKey.concat("_max"), 1, getTodayEndTime());

for(long i=max;i

orders.add(format(i,type.toString(),dayDf,orderLength));

}

redisTemplate.opsForList().leftPushAll(orderKey, orders);

redisTemplate.expireAt(orderKey, getTodayEndTime());

this.generate(orderKey.concat("_max"), orderNoInitSize-1, getTodayEndTime());

}

@SuppressWarnings("unused")

private String format(Long id,String prefix,String date,String minLength){

StringBuffer sb = new StringBuffer();

sb.append(prefix);

sb.append(date);

return sb.toString().concat(String.format("%1$0".concat(orderLength).concat("d"), id));

}

//通过key获取自增并设定过期时间

public Long generate(String key,Date expireTime) {

RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());

counter.expireAt(expireTime);

return counter.incrementAndGet();

}

//通过key获取增加的值 并设定过期时间

public long generate(String key,int increment,Date expireTime) {

RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());

counter.expireAt(expireTime);

return counter.addAndGet(increment);

}

// 获取当天过期时间

private Date getTodayEndTime() {

Calendar todayEnd = Calendar.getInstance();

todayEnd.set(Calendar.HOUR_OF_DAY, 23);

todayEnd.set(Calendar.MINUTE, 59);

todayEnd.set(Calendar.SECOND, 59);

todayEnd.set(Calendar.MILLISECOND, 999);

return todayEnd.getTime();

}

// 获取redis list size

private Long getRedisSize(String key) {

return redisTemplate.opsForList().size(key);

}

//获取订单号

private String getOrderNo(String key) {

return redisTemplate.opsForList().rightPop(key);

}

4.速度测试

Test 测试类,因机器配置不同执行时间会有差异

@Autowired

private OrderGenerateService orderGenerateService;

@Test

public void contextLoads() throws InterruptedException {

long startTime=System.currentTimeMillis();

ExecutorService executor=Executors.newFixedThreadPool(30);

for(int i=0;i<100000;i++) { executor.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println(orderGenerateService.getOrder("PA")); } }); } while(true) { int threadCount = ((ThreadPoolExecutor)executor).getActiveCount(); if(threadCount>=30) {

Thread.sleep(10);

continue;

}

if(threadCount<=0) {

break;

}

}

long endTime=System.currentTimeMillis(); //获取结束时间

System.out.println("程序运行时间: "+(endTime-startTime)+"ms");

}

程序运行时间: 32423ms

5.完整代码

6.完成

java订单编号工具类_[idmiss-common] Java 工具类之- 顺序订单号的生成相关推荐

  1. 弘辽科技:淘宝订单编号会透露个人信息吗?淘宝如何查看订单编号

    在淘宝平台上每成交一个订单都会有对应的订单信息和订单编号,那么有一些朋友在淘宝平台上下单购物的时候,有非常强的安全意识,所以想要确认一个问题就是这个淘宝订单编号会透露个人信息吗? 会. 淘宝订单编号即 ...

  2. java导入自定义类_导入自定义Java类

    我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用.请帮我. 我有两个文件.其中之一是包含主要功能的java文件.在里面: ... VaporVisitor visitor = new V ...

  3. java long 对应mybati类型_修改 mybatis-generator 中数据库类型和 Java 类型的映射关系...

    使用 mybatis-generator 发现数据库类型是 tinyint(4) , 生成 model 时字段类型是 Byte ,使用的时候有点不便 数据库的类型和 Model 中 Java 类型的关 ...

  4. java继承类型的用法_详解Java中使用externds关键字继承类的用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  5. java爬取网页数据_如何使用爬虫工具采集数据

    网络爬虫是一种按照一定规则,自动抓取万维网数据的脚本.按照一定规则,指的是爬虫程序需要解析网页的dom结构,针对dom结构爬取自己感兴趣的数据. (图1) 这就是一个网页源码的dom结构,我们需要一级 ...

  6. python映射实体类_将Python(django)实体类转换为Java的好方法 - java

    我正在寻找一种"复制" /将模型从Python源代码转换为Java源代码的好方法.我的想法是在服务器上使用Python django框架生成实体模型类.另一方面,我想将实体类转换为 ...

  7. xsd 生成 java 类_如何从Java类生成XSD

    xsd 生成 java 类 In last few posts, we learned about Java JAXB and how to generate java class from XSD. ...

  8. java 匿名类_浅谈Java的匿名类

    在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...

  9. java comparator接口类_常见的接口与类 -- Comparator

    接口Comparator 1.1 前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法.实际上Java中除了比较一个接口 ...

  10. 什么是java程序的主类_什么是Java 应用程序的主类?

    问题阐述 在进行Java 应用程序开发时,为了使应用程序能够运行,这个应用程序必须要含有一个主类,请问什么是Java 应用程序的主类? 专家解答 Java 应用程序是由若干类和接口组成的,为了使Jav ...

最新文章

  1. 获取${}中的值? 比如说var a=${date },无法取出date中的值
  2. 中山大学计算机是A类学科吗,中山大学a类学科有哪些?附中大a类学科名单
  3. 12 种经典亿级流量架构之资源隔离思想与方法论
  4. 循环神经网络 递归神经网络_递归神经网络-第5部分
  5. window安装python27和配置环境变量
  6. 《编程珠玑》课后答案
  7. CCNA考试题库中英文翻译版及答案2
  8. linux卸载驱动命令,卸载打印机驱动程序 (Linux)
  9. 字节跳动开启员工暴富计划,大手笔回购期权,有人最高能赚175%
  10. 文档翻译免费工具(网页版)PDF翻译,word翻译
  11. JAVA生成带LOGO的二维码
  12. 路由器dns服务器为空,家用路由器设置里的DNS服务器是什么?有什么作用呢?
  13. 1059604-93-1,m-PEG13-Ms甲磺酸基是亲核取代反应的良好离开基
  14. docker部署开发环境
  15. 蓝魔w41原版 android 4.1固件,DX160固件Android8.1V1.04.150
  16. MyBatis-Plus——MyBatis-Plus概述与集成
  17. 滚石导航网站源码v3.0 织梦模板+测试版+非常适合网址导航网站使用
  18. win7设置密码次数超限技巧
  19. 游戏中的基本数学概念-矢量与点(转载)
  20. 【Leetcode之算法思想】

热门文章

  1. VXI-11(网络设备)协议学习
  2. Java面试题基础篇(一)
  3. C语言程序设计第五版谭浩强课后答案 第六章《利用数组处理批量数据》习题答案 (大一大二、考研、计算机二级必看)
  4. asp.net小学生学籍管理系统
  5. aubo机械臂控制方式
  6. BGRABitmap图像操作8:生成纹理,基本的Perlin噪声地图
  7. 2019工业VR/AR应用场景白皮书发布,信通院、海尔、亮风台等联合撰写
  8. 今日头条广告投放的扣费标准是什么?今日头条开屏广告投放指南
  9. 档案管理系统平台:助力实现档案管理现代化
  10. python数据挖掘:基于券商分析师评级报告的投资决策分析,评估券商预测准确度