首页 > 编程语言 >java 生成流水号 java流水号生成器 转载

java 生成流水号 java流水号生成器 转载

时间:2023-08-01 18:48:18浏览次数:39  
标签:缓存 java String 生成器 流水号 import Calendar

java 生成流水号 java流水号生成器 转载
原文链接:https://blog.51cto.com/u_16099315/6331544

    生成流水线单号格式:业务码+yyyyMMdd+数字

例如: LSH2022102700001

业务码+秒级时间戳+((userId+随机数)加密)

JAVA生成编号工具类

生成流水号(格式:业务码+时间+当天自增号)

业务码+日级时间戳+(查询数据库自增)

java自动生成流水号(格式:业务码+时间+当天自增号)

业务码+日级时间戳+(查询缓存自增)

key为(业务码+日级时间戳)

过期时间为当天的剩余时间

 如何使用Java实现批量生成流水号 附详细实例代码

业务码+日级时间戳+(查询缓存自增) 实现代码

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.concurrent.TimeUnit;

/**

  • 生成流水线单号格式:业务码+yyyyMMdd+数字

  • 例如: LSH2022102700001

  • @author lyn
    /
    @Component
    public class SerialNoUtils {
    /
    *

    • 订单类别头
      */

    public static final String ORDER_CODE = "DD-";
    /**

    • 退货类别头
      */

    public static final String RETURN_ORDER = "THD-";
    /**

    • 退款类别头
      */

    public static final String REFUND_ORDER = "TKD-";
    /**

    • 序号长度
      */
      public static final int SORT_LENGTH = 6;

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private RedissonClient redissonClient;

    /**

    • 生成17位唯一流水号,"LSH"+yyyyMMdd+6位数字
    • 6位数字,如:000001
    • @param bizCode 业务码
    • @return
      */
      public String generateSerialNo(String bizCode) {
      //定义需要返回的流水号
      String serialNo = null;
      //先查询到今天的日期,格式:"yyyyMMdd"
      String todayDate = new SimpleDateFormat("yyyyMMdd")
      .format(new Date());
      //固定字母前缀 拼接 今天日期,组成新的完整的前缀,也就是缓存的key
      String cacheKey = bizCode + todayDate;
      RLock lock = redissonClient.getLock("SerialNoLock" + cacheKey);
      //通过key查询缓存有没有num数据,没有赋初始值并设置过期时间
      try {
      lock.lock();
      if (Boolean.FALSE.equals(redisTemplate.hasKey(cacheKey))) {
      redisTemplate.opsForValue().set(cacheKey, "0", getSeconds(), TimeUnit.SECONDS);
      }
      //再通过key查询缓存有没有num数据,缓存操作根据自身项目封装工具类
      String value = redisTemplate.opsForValue().get(cacheKey);
      Long codeNum = null;
      //如果缓存查询有值,数值+1,再赋值给下一个流水号
      if (null != value) {
      codeNum = Long.parseLong(value) + 1L;
      } else {
      //如果缓存查询没值,直接赋值为1
      codeNum = 1L;
      }
      //流水号 = 缓存key + 拼接的数值 = 前缀 + 日期 + 拼接的数值
      serialNo = getCodeOfSix(cacheKey, codeNum.intValue());
      //设置缓存,调用此方法,会自动将key所对应的value+1,保存时长:今天剩余的时间
      redisTemplate.opsForValue().increment(cacheKey, 1);
      } finally {
      lock.unlock();
      }
      return serialNo;
      }

    /**

    • 将数值拼接成对应的位数

    • @param prefix 前缀:"LSH"+yyyyMMdd

    • @param nowNum 当前要生成的数字

    • @return 拼接好的流水号
      */
      private String getCodeOfSix(String prefix, int nowNum) {

      //需要拼接的数字
      StringBuilder numSb = new StringBuilder(prefix);
      //补零
      int num = SORT_LENGTH - String.valueOf(nowNum).length();
      for (int i = 0; i < num; i++) {
      numSb.append("0");
      }
      numSb.append(nowNum);
      return numSb.toString();
      }
      /**

    • 获取当天结束还剩余多少秒

    • @return
      */
      private static int getSeconds() {
      //获取今天当前时间
      Calendar curDate = Calendar.getInstance();
      //获取明天凌晨0点的日期
      Calendar tomorrowDate = new GregorianCalendar(
      curDate.get(Calendar.YEAR),
      curDate.get(Calendar.MONTH),
      curDate.get(Calendar.DATE) + 1,
      0, 0, 0);
      //返回 明天凌晨0点 和 今天当前时间 的差值(秒数)+1000(防止提前失效)
      return (int) (tomorrowDate.getTimeInMillis() - curDate.getTimeInMillis()) / 1000 + 1000;
      }
      }



标签:缓存,java,String,生成器,流水号,import,Calendar
From: https://www.cnblogs.com/sunny3158/p/17598753.html

相关文章

  • java自动生成流水号
    原文链接:http://www.bxcqd.com/news/495848.html......
  • Java之流水号生成器实现
    Java之流水号生成器实现原文链接:https://www.jianshu.com/p/331b872e9c8f开心一笑提出问题如何使用jAVA生成流水号,同时支持可配置和高并发???解决问题假设你们项目已经整合缓存技术假如你有一定的Java基础假如......下面的代码实现的是一个支持高并发,可配置,效率高的......
  • java打印日志时,如何对字段进行脱敏?
    java打印日志时,如何对字段进行脱敏?原文链接:https://blog.csdn.net/weixin_43901749/article/details/129150818第一步,创建类继承MessageConverter,重写convert方法,添加注解@Component("sensitive")第二步,在logback.xml中增加conversionRule标签在我们开发项目的时候,有些......
  • java日志脱敏(密码/身份证/其他自定义等)logback
    java日志脱敏(密码/身份证/其他自定义等)logback原文链接:https://blog.csdn.net/weixin_39286166/article/details/126889660一.脱敏规则类 importch.qos.logback.classic.pattern.MessageConverter;importch.qos.logback.classic.spi.ILoggingEvent;importorg.apache.c......
  • java中使用异步方式调用接口@Async
    @Async使用:1、首先在启动类上开启注解@EnableAsync2、然后需要异步操作的方法上加上@Async*/publicclassAsyncTest{@Asyncpublicvoidtest()throwsInterruptedException{//做处理Thread.sleep(1000);}/**如果需要返回值的话,通过AsyncResult进行封装*/@AsyncpublicF......
  • javascript按钮通过cookie限制60s后才可以点击
    javascript按钮通过cookie限制60s后才可以点击1️⃣首先创建一个html页面,放入一个按钮 2️⃣设置点击按钮的触发函数一般当点击按钮都会有一些业务需要,在需求结束后,触发saveCookie的方法 3️⃣saveCookie方法当点击查询按钮之后,触发saveCooike方法,按钮倒计时需要一个结束......
  • JavaIO流
    JavaIO流基础概念数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打......
  • 使用Java进行串口通信
    引言 由于java的平台无关特性使得串口编程很困难。因为串口需要一个与特定平台实现的标准的API,而这对于java来说很困难。不幸的是,Sun在java的串口通信上没有太多关注。Sun已经定义了一个叫做JavaComm的串口通信API,但它的实现却不是javaSE(标准版)的一部分。Sun只为少数java平台提......
  • 每个Java开发者都应该知道的5个JDK工具
    JDK是Java语言的软件开发工具包,没有它就无法编译Java程序。目前,有许许多多的JDK工具呈现在大家面前,但最常用的莫过于java.exe、javac.exe、jar等。除了这几个,还有哪些呢?本文作者Joe拥有多年的Java开发经验,其在博客上分享了一篇文章:5JDKToolsEveryJavaDeveloperShouldKnow,笔......
  • 计算机基础与JavaScript初识
    一:编程介绍编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.计算机程序:就是计算机所执行的一系列的指令集合,而程序全部都是用我们所掌握的语言来编写的,所以人们要控制计算机一定要通过计算机语言向计算机发出命令。从事编程的人员,就是程......