java订单编号工具类_[idmiss-common] Java 工具类之- 顺序订单号的生成
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 工具类之- 顺序订单号的生成相关推荐
- 弘辽科技:淘宝订单编号会透露个人信息吗?淘宝如何查看订单编号
在淘宝平台上每成交一个订单都会有对应的订单信息和订单编号,那么有一些朋友在淘宝平台上下单购物的时候,有非常强的安全意识,所以想要确认一个问题就是这个淘宝订单编号会透露个人信息吗? 会. 淘宝订单编号即 ...
- java导入自定义类_导入自定义Java类
我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用.请帮我. 我有两个文件.其中之一是包含主要功能的java文件.在里面: ... VaporVisitor visitor = new V ...
- java long 对应mybati类型_修改 mybatis-generator 中数据库类型和 Java 类型的映射关系...
使用 mybatis-generator 发现数据库类型是 tinyint(4) , 生成 model 时字段类型是 Byte ,使用的时候有点不便 数据库的类型和 Model 中 Java 类型的关 ...
- java继承类型的用法_详解Java中使用externds关键字继承类的用法
理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...
- java爬取网页数据_如何使用爬虫工具采集数据
网络爬虫是一种按照一定规则,自动抓取万维网数据的脚本.按照一定规则,指的是爬虫程序需要解析网页的dom结构,针对dom结构爬取自己感兴趣的数据. (图1) 这就是一个网页源码的dom结构,我们需要一级 ...
- python映射实体类_将Python(django)实体类转换为Java的好方法 - java
我正在寻找一种"复制" /将模型从Python源代码转换为Java源代码的好方法.我的想法是在服务器上使用Python django框架生成实体模型类.另一方面,我想将实体类转换为 ...
- xsd 生成 java 类_如何从Java类生成XSD
xsd 生成 java 类 In last few posts, we learned about Java JAXB and how to generate java class from XSD. ...
- java 匿名类_浅谈Java的匿名类
在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码.就像下面这样.那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗? 思考以下代码 ...
- java comparator接口类_常见的接口与类 -- Comparator
接口Comparator 1.1 前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法.实际上Java中除了比较一个接口 ...
- 什么是java程序的主类_什么是Java 应用程序的主类?
问题阐述 在进行Java 应用程序开发时,为了使应用程序能够运行,这个应用程序必须要含有一个主类,请问什么是Java 应用程序的主类? 专家解答 Java 应用程序是由若干类和接口组成的,为了使Jav ...
最新文章
- 获取${}中的值? 比如说var a=${date },无法取出date中的值
- 中山大学计算机是A类学科吗,中山大学a类学科有哪些?附中大a类学科名单
- 12 种经典亿级流量架构之资源隔离思想与方法论
- 循环神经网络 递归神经网络_递归神经网络-第5部分
- window安装python27和配置环境变量
- 《编程珠玑》课后答案
- CCNA考试题库中英文翻译版及答案2
- linux卸载驱动命令,卸载打印机驱动程序 (Linux)
- 字节跳动开启员工暴富计划,大手笔回购期权,有人最高能赚175%
- 文档翻译免费工具(网页版)PDF翻译,word翻译
- JAVA生成带LOGO的二维码
- 路由器dns服务器为空,家用路由器设置里的DNS服务器是什么?有什么作用呢?
- 1059604-93-1,m-PEG13-Ms甲磺酸基是亲核取代反应的良好离开基
- docker部署开发环境
- 蓝魔w41原版 android 4.1固件,DX160固件Android8.1V1.04.150
- MyBatis-Plus——MyBatis-Plus概述与集成
- 滚石导航网站源码v3.0 织梦模板+测试版+非常适合网址导航网站使用
- win7设置密码次数超限技巧
- 游戏中的基本数学概念-矢量与点(转载)
- 【Leetcode之算法思想】