生成当天递增唯一的流水号的几种方式

news2024/11/20 14:17:58

说明:当开发中,如交易、文件传输过程中的文件名,可能需要我们使用一串唯一的数字来锁定这一条“交互记录”,即流水号。

本文介绍几种生成6位递增唯一,且每日重置的流水号的方式。

方式一:使用Redis

我们可以将上次生成流水号的日期,以及生成的流水号存入到Redis中,需要生成流水号时去Redis中将这两个值取出来做判断。

  • 如果日期不是今天,则从1开始,重新生成;

  • 如果日期是今天,则将流水号的值递增1,返回;

代码如下:

(generateSerialNumber(),生成流水号方法)

    private static final String REDIS_KEY_PREFIX = "serialNumber:";
    private static final String LAST_GENERATED_DATE_KEY = REDIS_KEY_PREFIX + "lastGeneratedDate";
    private static final String SERIAL_NUMBER_KEY = REDIS_KEY_PREFIX + "now";
 
    public synchronized String generateSerialNumber() {
        // 获取当前日期
        String today = LocalDate.now().toString();

        // 如果Redis中没有日期数据,或者Redis中的日期和当前日期不一致
        if (!today.equals(redisTemplate.opsForValue().get(LAST_GENERATED_DATE_KEY))) {
            redisTemplate.opsForValue().set(LAST_GENERATED_DATE_KEY, today);
            redisTemplate.opsForValue().set(SERIAL_NUMBER_KEY, "0");
        }

        // 流水号自增1,并格式化后返回
        long serialNumber = redisTemplate.opsForValue().increment(SERIAL_NUMBER_KEY,1);
        return String.format("%06d", serialNumber);
    }

(演示)

    public void generate(){
        for (int i = 0; i < 10; i++) {
            System.out.println(generateSerialNumber());
        }
    }

(只要是同一天,流水号就递增1返回,不是同一天则重置,从1重新开始)

在这里插入图片描述

可在Redis中看到这两个值,即最后一次生成流水号的时间,以及生成的流水号

在这里插入图片描述

方式二:存储过程

我们可以在数据库里维护一张表(rb_generate_serial_number),这张表里面的数据是最近一次生成的流水号时间(generate_date)以及流水号(last_number)。相当于把存到Redis中的那两个值放到数据库表中存储。如下:

在这里插入图片描述

然后写一个存储过程,当在DAO层去调用存储过程时,就生成一个新的流水号。存储过程如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `rb_generate_serial_number`()
BEGIN
  DECLARE currentSerialNumber INT;
  DECLARE lastCreateDate DATE;

  -- 从表中获取上次生成的流水号和生成的日期
  SELECT last_number, generate_date INTO currentSerialNumber, lastCreateDate FROM o_serial_number_log;

  -- 检查流水号是否为NULL,如果为NULL,则将其重置为1
  IF currentSerialNumber IS NULL THEN
    SET currentSerialNumber = 0;
  END IF;

  -- 检查日期是否为NULL,如果为NULL,则重置流水号为1并更新生成流水号的时间为今天
  IF lastCreateDate IS NULL THEN
    SET currentSerialNumber = 0;
    SET lastCreateDate = CURDATE();
  END IF;

  -- 检查生成流水号的日期是否为今天
  IF lastCreateDate = CURDATE() THEN
    -- 如果日期是今天,则递增流水号
    SET currentSerialNumber = currentSerialNumber + 1;
  ELSE
    -- 如果日期不是今天,则重置流水号为1并更新生成流水号的时间为今天
    SET currentSerialNumber = 1;
    SET lastCreateDate = CURDATE();
  END IF;

  -- 更新数据库中的流水号和日期
  UPDATE o_serial_number_log SET last_number = currentSerialNumber, generate_date = lastCreateDate;

  -- 返回6位流水号
  SELECT LPAD(currentSerialNumber, 6, '0') AS o_serial_number_log;
END

在代码中写一个Mapper方法,xml里面直接调用这个存储过程,如下:

    <select id="generateSerialNumber" resultType="java.lang.String">
        call rb_generate_serial_number()
    </select>

在浏览器中测试,访问该接口,返回流水号的值。因为数据库里面记录的时间不是当天,则从1开始。

在这里插入图片描述

数据库表同时更新;

在这里插入图片描述

方式三:查询业务表

如果你的业务表中,已包含以上两个字段,则可以在生成流水号时,去查询业务表中最新的流水号,然后递增1作为新生成的流水号。

如果日期不是当天,则重置从1开始。

总结

生成唯一递增,且每日重置的流水号,关键就在于将上次生成流水号的信息存储出来,本次生成时再取出来做简单的判断。据此分出三种方式:

  • 存在Redis中,需要考虑Redis宕机的情况;

  • 存在数据库表中,需要额外写存储过程;

  • 从现有的数据库表中获取,需要在业务代码里写判断;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCompass 大模型评测

OpenCompass 大模型评测 关于测评的三个问题为什么需要测评&#xff1f;我们需要评测什么&#xff1f;怎么测试大预言模型&#xff1f; 主流大模型评测框架OpenCompass能力框架OpenCompass评测流水线设计 随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为…

3.RHCSA脚本配置及通过node2改密码

运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分.

《WebKit 技术内幕》之八(1):硬件加速机制

《WebKit 技术内幕》之八&#xff08;1&#xff09;&#xff1a;硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页&#xff0c;因为GPU的作用主要是用来绘制3D图形并且性能特别好&#xff0c;这是它的专长所在&#xff0c;它…

Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc

文章目录 1.OpenAPI 规范2.Swagger: 接口管理的利器3.Swagger 与 SpringFox&#xff1a;理念与实现4.Swagger 与 Knife4J&#xff1a;增强与创新5.案例&#xff1a;Spring Boot 整合 Swagger35.1 引入 Swagger3 依赖包5.2 优化路径匹配策略兼容 SpringFox5.3 配置 Swagger5.4 S…

快速转换,让图片瞬间变成Excel表格!

摘要&#xff1a;本文将带你探索将图片转换为Excel表格的可行性和方法。通过对一些流行的数据处理软件进行测试&#xff0c;我们发现Photoshop和Excel可以轻松地将图片转换为Excel表格。此外&#xff0c;我们还比较了不同软件之间的差异&#xff0c;并提供了一些建议&#xff0…

docker搭建hbase 全部流程(包含本地API访问)

一、使用docker下载并安装hbase 1、搜索&#xff1a;docker search hbase 2、下载&#xff1a;docker pull harisekhon/hbase&#xff08;一定要下载这个&#xff0c;下面都是围绕此展开的&#xff09; 3、启动容器&#xff1a; docker run -d -p 2181:2181 -p 16000:16000…

做一个简单的倒计时

<div>距离过年还有:<span></span></div><script>let div document.querySelector("div");let span document.querySelector("span");// 获取未来时间戳let future new Date("2024-2-10 00:00:00");// 获取当下…

Midjourney V6有多厉害,看完这27张图你就明白了!

一些结论 当前V6版本仍处于Alpha测试阶段&#xff1a;这意味着产品的某些方面可能会发生变化。 更准确地遵循提示指令&#xff1a;V6在遵循用户的提示指令方面更为准确&#xff0c;特别是对于较长的提示指令。 模型更加连贯&#xff1a;新版本的模型在生成图像时展现出更高的…

SpringBoot+Email发送邮件

引言 邮件通知是现代应用中常见的一种通信方式&#xff0c;特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能&#xff0c;使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送&#xf…

Hypervisor 和Docker 还有Qemu有什么区别与联系?

Hypervisor Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层&#xff0c;可以让多个操作系统和应用共享硬件资源&#xff0c;也叫做虚拟机监视器&#xff08;VMM&#xff09;。 Hypervisor有两种类型&#xff1a;Type I和Type II。 Type I 直接运行在硬件上&a…

如何用“VMware安装Ubuntu”win11系统?

一、 下载Ubuntu 企业开源和 Linux |Ubuntu的 二、 安装 三、 启动虚拟机 选中Try or Install Ubuntu Server&#xff0c;按回车

PY调包侠——Collections高效库

一、【写在前面】 PY是一个调包侠语言&#xff0c;多学一个库可以提高计算速度。Collections提供了各种数据类型和集合工具&#xff0c;可以很方便的处理各种数据结构。如果您有刷力扣的习惯&#xff0c;可以经常看到Collections和itertools的身影&#xff0c;经常用这两个可以…

阿里云 SAE 2.0 正式商用:极简易用、百毫秒弹性效率,降本 40%

作者&#xff1a;黛忻 本文主要介绍阿里云 Serverless 应用引擎&#xff08;以下简称 SAE &#xff09;如何帮助企业跨越技术鸿沟&#xff0c;从传统应用架构无感升级到 Serverless 架构&#xff0c;以更高效、更经济的方式进行转型&#xff0c;快速进入云原生快车道&#xff0…

牛客周赛 Round 29 解题报告 | 珂学家 | 博弈概率DP

前言 整体评价 F题真心好题&#xff0c;很典&#xff0c;学到了很多。D题用了对顶堆&#xff0c;写到一半就想到了更简单的方法&#xff0c;哭。E题是基于众数的构造。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红大战小紫 思路: 模拟 n, m list(map(…

Qt6入门教程 9:QWidget、QMainWindow和QDialog

目录 一.QWidget 1.窗口和控件 2.事件 二.QMainWindow 三.QDialog 1.模态对话框 1.1模态对话框 1.2.半模态对话框 2.非模态对话框 在用Qt Creator创建Qt Widgets项目时&#xff0c;会默认提供三种基类以供选择&#xff0c;它们分别是QWidget、QMainWIndow和QDialog&am…

ChatGPT五大教育潜能与四大教育风险

关于ChatGPT将对学校教育产生何种影响&#xff0c;教育界尚未达成共识。这在很大程度上反映了人们审视ChatGPT教育潜能时所采取的不同视角和立场。如果我们从前面提及的生态视角和学习者发展立场来看&#xff0c;ChatGPT可以与学习者之间建立协作、共生和进化的良性生态关系&am…

【Unity】AB包下载

【Unity】AB包下载 1.使用插件打AB包 a.AB包分类 一般地&#xff0c;将预制体作为AB包资源&#xff0c;不仅需要对预制体本身进行归类&#xff0c;还要对其涉及的动画&#xff08;AnimationClip&#xff09;、动画状态机&#xff08;AnimatorController&#xff09;、以及所…

7、机器学习中的数据泄露(Data Leakage)

找到并修复这个以微妙的方式破坏你的模型的问题。 数据泄露这个概念在kaggle算法竞赛中经常被提到,这个不同于我们通常说的生活中隐私数据暴露,而是在竞赛中经常出现某支队伍靠着对极个别feature的充分利用,立即将对手超越,成功霸占冠军位置,而且与第二名的差距远超第二名…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-1最优控制问题与性能指标

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-1最优控制问题与性能指标

基于OpenSSL的SSL/TLS加密套件全解析

概述 SSL/TLS握手时&#xff0c;客户端与服务端协商加密套件是很重要的一个步骤&#xff0c;协商出加密套件后才能继续完成后续的握手和加密通信。而现在SSL/TLS协议通信的实现&#xff0c;基本都是通过OpenSSL开源库&#xff0c;本文章就主要介绍下加密套件的含义以及如何在O…