基于Redisson的RAtomicLong实现全局唯一工单号生成器

最近几年,我一直从事的是运营平台业务开发。每天,我们都需要处理大量的工单配置工作。为了生成工单号,我们建立了一张专用的数据库表,用于记录和生成工单号。每次创建工单时,我们会查询这张表,根据年份字段、月份字段和模块编码找到最大的自增序列号。随后,我们将自增序列号加一,与模块编码、年月序列号拼接以生成工单号,并将相关信息写入表中。这种方法一直使用得很顺利,因为工单配置的量并不是特别大,一直都没有出现问题。然而,最近我们为第三方提供了一个工单推送的接口,他们一次性推送了大量的工单,这导致不仅生成了许多重复工单号,而且还引起了接口性能方面的问题。因此,我们决定对工单号生成方式进行改进,本文我们将介绍下我们新的生成方法。

redisson.jpg

实现思路

这次我们采用了 Redisson 的 RAtomicLong 来生成一个以固定字符加上年月为键的自增数。随后,将自增数转换为36进制字符串,以年月和36进制字符串拼接形成全局唯一的工单号。

代码实现

SerialIdService.java

@Service
@Slf4j
public class SerialIdService {private static final String ID_KEY = "xiuji:";private static final int BASE_36 = 36;private static final Integer SEQUENCE_LENGTH = 5;@Resourceprivate RedissonClient redissonClient;public String workSerialId() {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMM");String dateStr = LocalDate.now().format(formatter);//使用了Redisson的AtomicLong对象生成唯一序列号RAtomicLong atomicLong = redissonClient.getAtomicLong(ID_KEY+dateStr);//设置过期时间为35天if(atomicLong.get() == 0){atomicLong.expire(Duration.ofDays(35));}//将唯一序列号转换为36进制的字符串,长度为4位,用于减少ID的长度String sequenceStr = Long.toString(atomicLong.incrementAndGet(), BASE_36).toUpperCase();//36进制的序列号若小于4位,则用0补齐高位if (sequenceStr.length() < SEQUENCE_LENGTH) {sequenceStr = String.format("%4s", sequenceStr).replace(' ', '0');;}String serialId = dateStr+sequenceStr;log.info("生成的工单号:{}",dateStr+sequenceStr);return dateStr+sequenceStr;}}

生成的工单号示例:

240121AXT6
240121AXT7
240121AXT8
240121AXT9
240121AXTA
240121AXTB
240121AXTC
240121AXTD
240121AXTE
240121AXTF
240121AXTG
240121AXTH
240121AXTI
240121AXTJ

总结

通过Redisson的RAtomicLong,我们成功实现了一个简单而强大的全局唯一工单号生成器。该生成器保证了唯一性,且在分布式环境中表现出色。在实际应用中,可以根据业务需求进行调整和扩展,以满足更复杂的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频图像的color range简介

介绍 研究FFmpeg发现&#xff0c;在avcodec.h中有关于color的解释&#xff0c;主要有四个属性&#xff0c;primaries、transfer、space和range。 color primaries&#xff1a; 基于RGB空间对应的绝对颜色XYZ的变换&#xff0c;决定了最终三原色RGB分别是什么颜色&#xff1b;…

Linux上软件安装

软件安装常见方式 二进制发布包 软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可。 RPM包 软件已经按照redhat的包管理工具规范RPM进行打包发布&#xff0c;需要获取到相应的软件RPM发布包&#xff0c;然后用RPM命令进行安装&#xff0c;但…

开源模型应用落地-qwen模型小试-入门篇(五)

一、前言 这是关于qwen模型入门的最后一篇文章。主要介绍如何使用魔搭的API在本地调用qwen模型。此外&#xff0c;通过阅读这一系列的文章&#xff0c;如果您真的亲自动手实践过&#xff0c;我相信您已经掌握了qwen模型的基本使用方法。 二、术语 2.1. ModelScope社区 打造下一…

【运维】安装双系统之后,如何删除主硬盘的Linux的引导,图文教程

前置条件&#xff1a;已经安装了windows10系统和Linux系统&#xff0c;而且windows10系统是C盘主要盘&#xff0c;Linux系统是安装在别的硬盘上&#xff0c;这个时候C盘主要盘里面的引导分区里是由Linux的引导的&#xff0c;所以打开电脑之后才能让你选是使用windows系统还是使…

pyqt5+python子域名扫描程序

import sysfrom PyQt5 import uic from PyQt5.QtWidgets import * #requests库内置了不同的方法来发送不同类型的http请求 import requests#BS主要功能是从网页抓取数据&#xff0c;提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能 from bs4 import Beau…

ValueError: Unable to read workbook: could not read strings from data.xlsx解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

flutter在windows系统上实现左右水平滑动问题

在个问题在github也有记录&#xff1a;https://github.com/flutter/flutter/issues/105095 就是flutter使用listview等可以滑动的组件来左右滚动的时候&#xff0c;不能正常工作&#xff0c;也就是无效&#xff0c;所以下面大家开始讨论这个问题。 翻阅大家讨论的内容&#x…

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

AArch64 是随 ARMv8 ISA 一起引入的 64 位架构&#xff0c;用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。&#xff0c;而不能执行 A32 或 T32 指令。但是&#xff0c;与 AArch32 中不同&#xff0c;在64位状态下&#xff0c;指令可以访问 …

初识Mybatis框架技术(上)

文章目录 MyBatis简介MyBatis特性搭建MyBatis 核心配置文件详解 MyBatis简介 MyBatis特性 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis可以使用简单的XML或注解用于配置和原始…

前端基础面试题大全

一、Vue 文章目录 一、Vue1、vue 修改数据页面不重新渲染**数组/对象的响应式 &#xff0c;vue 里面是怎么处理的&#xff1f;** 2、生命周期Vue 生命周期都有哪些&#xff1f;父子组件生命周期执行顺序 3、watch 和 computed 的区别4、组件通信&#xff08;组件间传值&#xf…

DAY05_Spring—SpringAopAop案例-缓存控制

目录 1 Spring AOP1.1 AOP介绍1.2 关于AOP名词介绍1.3 通知类型1.4 切入点表达式1.5 AOP入门案例1.5.1 导入jar包1.5.2 准备代码1.5.3 配置切面类1.5.4 编辑配置类1.5.5 编辑测试代码 1.6 关于表达式写法1.6.1 关于annotation切入点相关代码 1.7 关于通知方法测试1.7.1 抽取切入…

Visual Studio 下载安装教程,附安装包和工具,Visual Studio 2022,Visual Studio所有版本都有

前言 Visual Studio是微软推出的一款C编译器&#xff0c;将“高级语言"翻译为"机器语言&#xff08;低级语言)"的程序&#xff0c;VS是一个非常完整的开发工具集&#xff0c;包括了所有软件生命周期中所需的大部分工具&#xff0c;如UML工具、代码管控工具、集…