美文网首页
订单号:生成指定前缀日期流水号;redis分布式

订单号:生成指定前缀日期流水号;redis分布式

作者: 一个忙来无聊的人 | 来源:发表于2023-01-05 11:02 被阅读0次

流水号生成、分布式

SpringUtil:获取对象用,其他都在注释里面

public class OrderNoUtil {

    /**
     * 时间格式化
     */
    private final static String DATE_STR = "yyyyMMdd";

    /**
     * 占位前缀
     */
    private final static String PLACE_HOLDER = "00000000000";

    /**
     * 订单号生成工具类
     * @param prefix       前缀
     * @param size 流水号位数   最大支持12位,如果不满足需求可以把占位前缀加大
     * @param maxValue  如果redis没有做持久化,redis重启,需要传递最大值
     * @return
     */
    public static String buildOrderNO(String prefix, Integer size, Long maxValue) {
        // 获取redis
        RedisClient redisClient = SpringUtil.getBean(RedisClient.class);
        // 生成前缀  此处为 入参前缀 + 日期 (20230106)
        String keyPreFix = prefix + DateUtil.format(new Date(), DATE_STR);
        if (maxValue != null){
            synchronized (keyPreFix) {
                // 设置redis值为传递的最大值,并且过期时间为24小时
                Long value = redisClient.get(keyPreFix);
                if (value == null || maxValue > value){
                    redisClient.setEx(keyPreFix, maxValue, Duration.ofHours(24L));
                }
            }
        }else {
            if (!redisClient.exists(keyPreFix)){
                synchronized (keyPreFix){
                    if (!redisClient.exists(keyPreFix)){
                        redisClient.setEx(keyPreFix, 0, Duration.ofHours(24L));
                    }
                }
            }
        }
        // 利用redis自增方法,增加
        Long value = redisClient.incr(keyPreFix);
        String valueStr = PLACE_HOLDER + value;
        return keyPreFix + valueStr.substring(valueStr.length() - size);
    }
}

以上仅为个人愚见,如果有更好方案,欢迎大家指出

相关文章

  • 订单号:生成指定前缀日期流水号;redis分布式

    流水号生成、分布式 SpringUtil:获取对象用,其他都在注释里面 以上仅为个人愚见,如果有更好方案,欢迎大家指出

  • 2019-01-16

    利用redis创建自增订单号 需求:编码+日期+订单号数量 生成订单号 简单方便实现带日期的自增单号 测试过没有...

  • go 实现mysql记录流水号生成

    go 实现mysql记录流水号生成 业务 订单编号的生成:PO+日期+当日流水号;如PO2020120301 实现...

  • EF中创建、使用Oracle数据库的Sequence(序列)功能

    ** 背景 ** 项目中订单号原来的生成规则由日期加随机数组成,后期需求决定将订单号生成规则更改为生成日期加当天当...

  • 分布式唯一ID实现

    分布式唯一ID实现在业务开发中,大量场景需要用到唯一ID,比如系统流水号,订单号等等。那么,分布式唯一ID有哪些特...

  • 分布式id生成算法 snowflake 详解

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在支付流水号、订单号等,随者业务数据日渐增长,...

  • dble分页技巧_主键是拆分列_连续翻页

    一 场景描述 对于订单、交易流水之类的表,常见是应用层会生成订单号、交易流水号之类的唯一编号,dble则是以这个唯...

  • 分布式订单号生成策略

    分布式订单号生成策略 1.关于订单号 订单号用于记录用户在电商网站中的下单信息(通常有商品列表、金额、时间等),用...

  • php生成指定长度的随机字符串

    项目开发中,经常会用到生成指定长度的字符串,比如生成随机密码,生成随机id,生成订单号等场景。

  • Redis常用命令

    获取Redis所有Key的方法: 获取所有Key命令:redis-cli keys ‘*’ ; 获取指定前缀的k...

网友评论

      本文标题:订单号:生成指定前缀日期流水号;redis分布式

      本文链接:https://www.haomeiwen.com/subject/iqzdcdtx.html