怎么使用Java实现批量生成流水号
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍"怎么使用Java实现批量生成流水号"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Java实现批量生成流水号"文章能帮助大家解决问题。
千家信息网最后更新 2025年02月23日怎么使用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安全错误
数据库的锁怎样保障安全
迷你和我的世界是谁先炸的服务器
北大ftp服务器
怀柔区网络技术哪家好
网络安全 永恒之蓝实验
软件开发企业成本是什么
软件开发前端和后端工资
怀旧服服务器人口最多的职业
办公现场网络安全检查
更新数据库字符连接串失败
艾普蕾全球撤稿数据库 介绍
浙江网格数据库
网络安全bios的作用
高级网络安全工程师考试
什么是软件开发三权分立
软件开发的典型基线
数据库表里字段的值相加
数据库的属性
如何提供服务器的访问速度
软件开发岗位如何
1024gb服务器内存
车载网络技术的产生
北京erp 软件开发承诺守信
excel连接万德数据库
新媒体网络技术的考核
软件开发工程师三年规划
qq数据库多维数据集
steam无法搜索服务器
佛山4u服务器散热器厂商
2019热门网络技术
内网 域名解析服务器