SpringBoot使用redis生成订单号的实现示例

 更新时间:2024年09月18日 11:18:55   作者:涛哥是个大帅比  
在电商系统中,生成唯一订单号是常见需求,本文介绍如何利用SpringBoot和Redis实现订单号的生成,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

项目场景:

在开发电商系统等需要生成唯一订单号的应用程序中,我们经常会遇到需要生成唯一订单号的需求。本文将介绍如何使用Spring Boot和Redis来生成唯一的订单号,并提供相应的代码示例。

在开始之前,需要确保已经安装并配置好了Java开发环境、Spring Boot框架和Redis数据库。

解决方案:

订单号生成规则: DD+年月日+5位流水号,流水号当天有效,第二天重新计数。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
 
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.concurrent.TimeUnit;
 
/**
 * redis的increment 递增方法 | 处理防重复和并发问题
 */
@Component
public class OrderNumberCodeUtils {
    private static final String PREFIX = "DD";
    private static final String DATE_FORMAT = "yyyyMMdd";
    private static final String ORDER_SERIAL_NUMBER = "order_serial_number";
 
    private static RedisTemplate redisTemplate;
 
    @Autowired
    public void redisTemplate(RedisTemplate redisTemplate){
        OrderNumberCodeUtils.redisTemplate = redisTemplate;
    }
 
    public static String generateOrderNumber() {
 
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(PREFIX);
        // 获取当前日期
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
        String currentDate = dateFormat.format(new Date());
        stringBuffer.append(currentDate);
        // 获取流水号
        Long increment = redisTemplate.opsForValue().increment(ORDER_SERIAL_NUMBER, 1);
		
		/**
		 * 返回值过期时间,单位为秒。
		 * 如果返回-2,则表示该键不存在;
		 * 如果返回-1,则表示该键没有设置过期时间;
		 */
		Long expire = redisTemplate.getExpire(ORDER_SERIAL_NUMBER, TimeUnit.SECONDS);
		if(expire == -1){
			// 获取距离当天结束的秒数
			LocalDateTime endOfDay = LocalDate.now().atTime(23, 59, 59);
			long secondsToMidnight = LocalDateTime.now().until(endOfDay, ChronoUnit.SECONDS);
            //初始设置过期时间
            redisTemplate.expire(ORDER_SERIAL_NUMBER, secondsToMidnight, TimeUnit.SECONDS);
        }
        String format = String.format("%05d", increment);
        stringBuffer.append(format);
        return stringBuffer.toString();
    }
}

到此这篇关于SpringBoot使用redis生成订单号的实现示例的文章就介绍到这了,更多相关SpringBoot redis生成订单号内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java开发中常用记录

    Java开发中常用记录

    这篇文章主要介绍了Java-编程式事务、Java-Stream、Linux常用命令,需要的朋友可以参考下
    2023-05-05
  • Hibernate一级缓存和二级缓存详解

    Hibernate一级缓存和二级缓存详解

    今天小编就为大家分享一篇关于Hibernate一级缓存和二级缓存详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 在idea中创建SpringBoot项目

    在idea中创建SpringBoot项目

    这篇文章主要介绍了在idea中创建SpringBoot项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java反射与Fastjson的危险反序列化详解

    Java反射与Fastjson的危险反序列化详解

    在 Java 中,Computer.class是一个引用,它表示了 Computer 的字节码对象(Class对象),这个对象被广泛应用于反射、序列化等操作中,那么为什么 parseObject 需要这个引用呢,带着这个问题我们一起通过本文学习下吧
    2024-07-07
  • Java实现url加密处理的方法示例

    Java实现url加密处理的方法示例

    这篇文章主要介绍了Java实现url加密处理的方法,涉及java基于base64、编码转换实现加密解密相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 浅谈Maven镜像更换为阿里云中央仓库(精)

    浅谈Maven镜像更换为阿里云中央仓库(精)

    本篇文章主要介绍了Maven镜像更换为阿里云中央仓库(精),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Springboot接收文件与发送文件实例教程

    Springboot接收文件与发送文件实例教程

    最近工作中遇到个需求,springboot简单的上传文档或者图片,并且进行操作,操作完后进行保存指定路径,下面这篇文章主要给大家介绍了关于Springboot接收文件与发送文件的相关资料,需要的朋友可以参考下
    2023-05-05
  • java并发编程专题(十一)----(JUC原子类)数组类型详解

    java并发编程专题(十一)----(JUC原子类)数组类型详解

    这篇文章主要介绍了JAVA JUC原子类 数组类型详解的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java编程实现用hash方法切割文件

    Java编程实现用hash方法切割文件

    这篇文章主要介绍了Java编程实现用hash方法切割文件,简单介绍了hash的概念,然后分享了使用方法示例,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • 有关Java常见的误解小结(来看一看)

    有关Java常见的误解小结(来看一看)

    下面小编就为大家带来一篇有关Java常见的误解小结(来看一看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论