基于 Redis 生成分布式订单号

环境依赖:

//spingBoot <version>2.6.6</version>
//jdk11
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

代码简单易理解直接上成品;

package com.wyj.my_redis.util;

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.util.Date;

/**
 * @author: yijun.wen
 * @date: 2022/4/15 11:00 上午
 * @description:
 */
@Component
public class OrderGenerateUtils {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 全局自增数
     */
    private static int count = 1;

    /**
     * 格式化的时间字符串
     */
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    private String REDIS_ORDER_NUM_KEY_PRE = "fms:order:";

    /**
     * 生成16位订单编号:8位日期+2位业务场景+6位以上 Redis 自增 id
     *
     * @param type 业务场景
     * @return
     */
    public String getOrderNum(int type) {
        StringBuilder sb = new StringBuilder();
        String date = getNowDateStr();
        // 拼接key值
        String key = REDIS_ORDER_NUM_KEY_PRE + date;
        Long increment = incr(key, count);
        sb.append(date);
        // (动态匹配)2位业务场景 1:支付宝,2:微信,3:订单编号
        sb.append(String.format("%02d", type));
        String incrementStr = increment.toString();
        if (incrementStr.length() <= 6) {
            sb.append(String.format("%06d", increment));
        } else {
            sb.append(incrementStr);
        }
        return sb.toString();
    }

    /***
     * 
     * @param key
     * @param delta
     * @return
     */
    public Long incr(String key, long delta) {
        Long increment = redisTemplate.opsForValue().increment(key, delta);
        if (increment.equals(1L)) {
            redisTemplate.expire(key, 1, TimeUnit.DAYS);
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 获取当前时间年月日字符串
     *
     * @return
     */
    private static String getNowDateStr() {
        return sdf.format(new Date());
    }
}

作者:eajur

出处:https://www.cnblogs.com/eajur/p/16148805.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Eajur  阅读(319)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示