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

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

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

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

目录
相关文章
|
10月前
|
人工智能 算法
2025 生成式人工智能认证,如何构建知识能力价值闭环
生成式人工智能(AI)认证助力职场人士在2025年AI浪潮中脱颖而出。通过系统化学习,涵盖AI方法论、提示工程及伦理法律等领域,构建知识桥梁;强化实践能力,熟悉工具操作与问题解决;最终释放价值潜力,实现职业跃迁。GAI认证由培生Certiport推出,结合理论与实操,全面评估专业能力,赋能各类从业者,在技术发展中稳步前行。
|
缓存 监控 安全
优化Elasticsearch 集群配置
优化Elasticsearch 集群配置
428 4
|
前端开发 JavaScript
vue实现页面截图、保存图片功能
vue实现页面截图、保存图片功能
1692 1
|
Java 数据库连接 mybatis
shardingsphere集成mybatis/mybatis-plus快速实现简单分片
shardingsphere集成mybatis/mybatis-plus快速实现简单分片
1760 0
|
JavaScript
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】
这篇文章详细介绍了Vue.js中的插槽概念,包括默认插槽、具名插槽和作用域插槽的使用方式和实际应用示例,通过代码演示了如何在组件中定义和使用插槽来实现内容的灵活替换和展示。
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】
|
存储 Oracle 关系型数据库
OceanBase有什么优势?
【8月更文挑战第12天】OceanBase有什么优势?
885 3
|
人工智能 自然语言处理 自动驾驶
Prompt入门到进阶
本文介绍了如何有效利用AI工具,特别是ChatGPT,通过优化提问技巧来获得更高质量的答案。首先阐述了AI工具在各行业的广泛应用,并强调了良好提问的重要性。接着,文章详细解释了提问的基本原则——CLAR原则(明确、合乎逻辑、准确、相关),以及更高级的LACES模型(增加限定条件、分配角色、提供背景、给出示例、拆分任务)。通过案例演示,展示了如何运用这些原则和模型撰写书籍的不同章节。最后,文章总结了设计高效提示的关键要素,并鼓励读者通过实践来提升与AI交互的能力,从而在工作和生活中获得更高的效率和创新。
371 1
|
移动开发 前端开发 JavaScript
使用html-to-image代替html2canvas,结合jspdf实现下载pdf(下载截图下载前端dom元素)
本文介绍了在前端项目中,当使用`html2canvas`遇到问题时,如何使用`html-to-image`库作为替代方案,结合`jspdf`实现将DOM元素生成为PDF文件并提供下载。文章首先讨论了`html2canvas`可能遇到的问题,并提供了该库的使用示例代码。随后,详细介绍了`html-to-image`库的安装和使用方法,展示了如何将DOM元素转换为Canvas,再利用`jspdf`生成PDF文件。最后,文章通过示例代码说明了整个转换和下载的过程,并展示了效果截图。
1631 0
|
监控 安全 Linux
在Linux中,如何设置定时任务(cron job)?
在Linux中,如何设置定时任务(cron job)?
|
缓存 应用服务中间件 Linux
局域网自建YUM仓库
在公司的局域网内自建一个yum仓库,对于不能连外网的环境非常有用。同时也提高了内网服务器的下载速度。
859 0

热门文章

最新文章

下一篇
开通oss服务