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

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

本文介绍几种生成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宕机的情况;

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—22.括号生成【中等】

2023每日刷题&#xff08;七十九&#xff09; Leetcode—22.括号生成 算法思想 实现代码 class Solution { public:vector<string> generateParenthesis(int n) {vector<string> ans;int m n * 2;string path(m, 0);function<void(int, int)> dfs [&…

自己构建webpack+vue3+ts

先看看我的目录结构&#xff08;我全局使用TS&#xff09;&#xff1a; 一、安装配置webpack打包 安装esno npm install esnoesno 是基于 esbuild 的 TS/ESNext node 运行时,有了它&#xff0c;就可以直接通过esno *.ts的方式启动脚本&#xff0c;package.json中添加 type:…

力扣62. 不同路径

动态规划 思路&#xff1a; 定义 dp[r][c] 为到达坐标 (r, c) 的路径数&#xff1a; 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达&#xff1b;状态转移方程&#xff1a; dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…

二维码地址门牌管理系统:社区新风向

文章目录 前言一、集成先进技术的系统二、便捷居民体验三、支持社区管理四、未来展望与可扩展性 前言 随着科技的不断发展&#xff0c;智能化管理已经深入到我们的生活中。二维码门牌管理系统作为一款创新产品&#xff0c;在社区管理领域迅速引起广泛关注。这款系统不仅提升了…

CTFhub-bak文件

CTFhub-Web-信息泄露-备份文件下载-bak文件 题目信息 解题过程 看到提示说和index.php有关&#xff0c;在url后面加index.php.bak&#xff0c;跳转到http://challenge-7a4da2076cfabae6.sandbox.ctfhub.com:10800/index.php.bak网址&#xff0c;即&#xff1a; 跳转到下载页…

彻底搞定让人头痛的nginx location 路径匹配规则

nginx location 路径匹配规则 一、前言二、说在前面三、开始表演 一、前言 很多同学&#xff0c;在配置nginx的时候&#xff0c;都会遇到一个头痛的问题&#xff0c;就是location 的路径应该怎么写&#xff1f;到底要不要加斜杠&#xff0c;有点傻傻分不清楚。今天就来帮助大家…

蓝桥杯真题(Python)每日练Day3

题目 题目分析 为了找到满足条件的放置方法&#xff0c;可以带入总盘数为2和3的情景&#xff0c;用递归做法实现。 A中存在1 2两个盘&#xff0c;为了实现最少次数放入C且上小下大&#xff0c;先将1放入B&#xff0c;再将2放入C&#xff0c;最后将1放入C即可。同理当A中存在1 …

柔性数组和C语言内存划分

柔性数组和C语言内存划分 1. 柔性数组1.1 柔性数组的特点&#xff1a;1.2 柔性数组的使用1.3 柔性数组的优势 2. 总结C/C中程序内存区域划分 1. 柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array)这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff…

以太坊账户地址与比特B地址生成方法对比

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 以太坊和比特B地址在生成方…

C语言——内存函数介绍和模拟实现(memcpy、memmove、memset、memcmp)

之前我们讲过一些字符串函数&#xff08;http://t.csdnimg.cn/ZcvCo&#xff09;&#xff0c;今天我们来讲一讲几个内存函数&#xff0c;那么可能有人要问了&#xff0c;都有字符串函数了&#xff0c;怎么又来个内存函数&#xff0c;这不是一样的么&#xff1f; 我们要知道之前…

【C语言】指针进阶之sizeof和strlen函数的对比

目录 1.sizeofyu 2.strlen函数 3.sizeof与strlen的对比 1.sizeof >>sizeof计算变量所占内存内存空间 大小 的&#xff0c;单位是 字节 &#xff0c;如果操作数是类型的话&#xff0c;计算的是使⽤类型创建的变量所占内存空间的大小。 >>sizeof 只关注占⽤内存空…

Spring5系列学习文章分享---第一篇(概述+特点+IOC原理+IOC并操作之bean的XML管理操作)

目录 Spring&#xff08;概述特点IOC原理IOC并操作之bean的XML管理操作&#xff09;概述Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分ioc,aopSpring特点 loc(概念和原理)什么是 IOCIOC 底层原理IOC 过程图 IOC&#xff08;接口&am…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求&#xff1a; 搜索栏展示当前登陆的个人用户的搜索历史记录&#xff0c;删除个人历史记录。用户在搜索栏输入某字符&#xff0c;则将该字符记录下来 以zset格式存储的redis中&#xff0c;记录该字符被搜索的个数以及当前的时间戳 &#xff08;用…

阿里云优惠整理,最新2024阿里云优惠政策解读

阿里云优惠政策有哪些&#xff1f;2024年阿里云优惠政策风向改了&#xff0c;之前一直是老用户与狗的营销策略&#xff0c;今年阿里云2核2G、3M固定带宽服务器99元居然开启了老用户购买权限&#xff0c;并且续费不涨价&#xff0c;阿里云这波操作确实让用户赢麻了&#xff0c;在…

MBR扇区修复和GRUB引导修复实验

修复MBR扇区 步骤一&#xff1a;在进行实验之前我们需要新加一块磁盘&#xff0c;并对新加磁盘进行分区处理&#xff0c;用来备份sda磁盘的MBR及分区表信息。&#xff08;注&#xff1a;在实验中可以不像我如此这么繁琐&#xff0c;一个主分区&#xff0c;并格式化挂载即可&am…

PyQt5 快速入门(一)

第一节按钮控件,文本控件,输入框,app图标 文章目录 一.GUI按钮控件 二.文本控件 三.输入框 四.让窗口显示在屏幕中央 五.让窗口显示在屏幕中央 总结 一.GUI按钮控件 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButtonif __name__ __main__:app …

UG制图-视图与投影

当我们进入图纸页后&#xff0c;我们需要对产品进行投影然后进行标注 注意&#xff1a;如果是从零件3D中直接进入制图&#xff0c;默认情况下图框所在的图层是不显示的&#xff0c;我们可以通过菜单或者快捷键ctrl L进入图层设置模块&#xff0c;将图层170和173勾选为显示 我…

MacM1Pro Parallels19.1.0 CentOS7.9 Install PostgrepSQL

相关阅读 MacM1Pro安装 Parallels Desktop 19.1.0 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装Parallels Tools https://blog.csdn.net/qq_41594280/article/details/135398780 MacM1Pro Parallels安装CentOS7.9 https://blog.csdn.n…

Java JVM内存结构 虚拟机栈 本地方法栈 方法区 直接内存

Java Virtual Machine &#xff0c;Java 程序的运行环境&#xff08;Java 二进制字节码的运行环境&#xff09;。 常见的 JVM&#xff1a; 来源维基百科&#xff1a;https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines 学习路线&#xff1a; 参考资料&#x…

141基于matlab的齿轮系统非线性动力学特性分析

基于matlab的齿轮系统非线性动力学特性分析&#xff0c;综合考虑齿侧间隙、时变啮合刚度、综合啮合误差等因素下&#xff0c;参数阻尼比变化调节下&#xff0c;输出位移、相图、载荷、频率幅值结果。程序已调通&#xff0c;可直接运行。 141 matlab齿轮非线性动力学 (xiaohongs…