怎么使用Java实现批量生成流水号
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍"怎么使用Java实现批量生成流水号"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Java实现批量生成流水号"文章能帮助大家解决问题。
千家信息网最后更新 2025年01月16日怎么使用Java实现批量生成流水号
这篇文章主要介绍"怎么使用Java实现批量生成流水号"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Java实现批量生成流水号"文章能帮助大家解决问题。
前言
生成流水号,在企业中可以说是比较常见的需求,尤其是订单类业务。
一般来说,需要保证流水号的唯一性。
如果没有长度和字符的限制,那么直接使用UUID生成一个唯一字符串即可,也可以直接使用数据库表中的主键,主键就是唯一的。
那么,如果限制了流水号必须多少位,这种怎么生成呢?
可以采用"前缀+日期+数字"的方式(ps:此方式是需要用到缓存的)
前缀:为了更好的标识这个流水号是属于哪种类型;
日期:为了防止重复;
数字:为了表示当前的流水所处序号。
需求:生成一个17位数的唯一流水号,"LSH"+yyyyMMdd+6位数字
代码实现
import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.concurrent.atomic.AtomicInteger;public class SerialNoTest { public static void main(String[] args) { String serialNo = generateSerialNo(); System.out.println("生成的流水号:"+serialNo); } /** * 生成17位唯一流水号,"LSH"+yyyyMMdd+6位数字 * 6位数字,如:000001 * @return */ private static String generateSerialNo(){ //定义需要返回的流水号 String serialNo = null; //先查询到今天的日期,格式:"yyyyMMdd" String todayDate = new SimpleDateFormat("yyyyMMdd") .format(new Date()); //固定字母前缀 拼接 今天日期,组成新的完整的前缀,也就是缓存的key String cacheKey = "LSH"+todayDate; //再通过key查询缓存有没有num数据,缓存操作根据自身项目封装工具类 Long codeNum = cacheService.getCache(cacheKey, Long.class); //如果缓存查询有值,数值+1,再赋值给下一个流水号 if (null != codeNum) { codeNum = codeNum + 1L; } else { //如果缓存查询没值,直接赋值为1 codeNum = 1L; } //流水号 = 缓存key + 拼接的数值 = 前缀 + 日期 + 拼接的数值 serialNo = getCodeOfSix(cacheKey, codeNum.intValue()); //设置缓存,调用此方法,会自动将key所对应的value+1,保存时长:今天剩余的时间 cacheService.incr(cacheKey, getSeconds()); return serialNo; } /** * 将数值拼接成对应的位数 * @param prefix 前缀:"LSH"+yyyyMMdd * @param nowNum 当前要生成的数字 * @return 拼接好的流水号 */ public static String getCodeOfSix(String prefix,int nowNum ) { //需要返回的code StringBuilder codeSb = new StringBuilder(); //需要拼接的数字 StringBuilder numSb = new StringBuilder(); //封装的数字对象,里面 value 加了 volatile关键字,保证了线程安全 AtomicInteger count = new AtomicInteger(nowNum); //将数值补足为6位字符串 if (count.get() < 10) { numSb.append("00000").append(count.get()); } else if(count.get() < 100){ numSb.append("0000").append(count.get()); }else if(count.get() < 1000){ numSb.append("000").append(count.get()); }else if(count.get() < 10000){ numSb.append("00").append(count.get()); }else if(count.get() < 100000){ numSb.append("0").append(count.get()); } else if (count.get() >= 100000) { numSb.append(count.get()); } //先拼接前缀 codeSb.append(prefix); //再拼接数字 codeSb.append(numSb); return codeSb.toString(); } /** * 获取当天结束还剩余多少秒 * @return */ public static int getSeconds(){ //获取今天当前时间 Calendar curDate = Calendar.getInstance(); //获取明天凌晨0点的日期 Calendar tommorowDate = new GregorianCalendar( curDate.get(Calendar.YEAR), curDate.get(Calendar.MONTH), curDate.get(Calendar.DATE) + 1, 0, 0, 0); //返回 明天凌晨0点 和 今天当前时间 的差值(秒数) return (int)(tommorowDate.getTimeInMillis() - curDate .getTimeInMillis()) / 1000; }}
假如今天是2021年4月22日,运行项目,生成的第1个流水号则为:LSH20210422000001
第2个流水号则为:LSH20210422000002,依次类推。
需要注意的是:
如果限制了位数,6位数字每天最多能生成10w个流水号,所以,这个数字位数根据具体业务量进行调整。
如果每天的生成数量量不到1w,那么使用4位数字即可。
关于"怎么使用Java实现批量生成流水号"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
流水
流水号
生成
数字
缓存
前缀
日期
数值
位数
查询
字符
时间
知识
限制
业务
字符串
数据
方式
行业
需求
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
泗阳购买网络技术大概费用
geo数据库family
三级数据库技术只考一道C语言
数据库5个SQL语句
数据库如何统一utf8编码
云计算迁移数据库
软件开发项目中各岗位职责
开展网络安全培训内容
共享经济与信息网络技术
网络安全背景素材
数据库规范设计方法简述
增强现实软件开发
网络安全和信息化管理研判会
服务器添加多个ip
浦东新区电商软件开发经验丰富
公安局内设网络安全机构
数据库死锁解决方法
金山区品质软件开发活动方案
宿迁网络技术参考价格
汕头软件开发培训
信息网络安全隔离装置
软件开发开票功能
十四大网络安全事件
2020网络安全qs排名
用友t3不能建立数据库
对软件开发的管理
四川电信的dns服务器
网络安全宣传标语8字
广东标准软件开发代理价钱
网络安全2022年工作计划