生成固定前缀固定长度的不重复字符串使用方法(可用于生成电商系统中的订单号,出库单号等等)

本文介绍如何利用Java的AtomicInteger和Redis来创建固定前缀的不重复字符串,适合电商系统生成订单号和出库单号,避免并发冲突。方法一借助原子操作确保序列性,方法二利用Redis的原子增删操作确保唯一性。
摘要由CSDN通过智能技术生成

生成固定前缀固定长度的不重复字符串使用方法(可用于生成电商系统中的订单号,出库单号等等)
第一个方法,需要用到Java自带的原子类

private final AtomicInteger currentNum = new AtomicInteger(0);
public String code(Long userId) {
        // 简单加密
        userId = userId * 2 + 88;
        //原子自增,再对10000取模,不足4位的用0补充
        // 出现重复的场景(几乎不可能):系统在1秒内产生10000+单,同时第n和第n+9999单为同一用户时
        String numStr = String.format("%04d", currentNum.getAndIncrement() % 10000);
        return prefix + Long.toHexString(userId) + numStr + StringUtil.dateToString(new Date(), "yyMMddHHmmss");
    }

第二个方法,需要用到redis

public String nextCode(String bizCode) {
        if (StringUtils.isNotBlank(this.redisHost)) {
            String yyyyMMdd = LocalDateTime.now().format(DateTimeFormatter.BASIC_ISO_DATE);
            String dateKey = RedisKeys.getPermsKey(bizCode + ":" + this.env + ":" + yyyyMMdd);
            Long increment = this.stringRedisTemplate.opsForValue().increment(dateKey, 1L);
            if (Objects.equals(1L, increment)) {
                this.stringRedisTemplate.delete(RedisKeys.getPermsKey(bizCode + ":" + this.env + ":" + LocalDateTime.now().minusDays(1L).format(DateTimeFormatter.BASIC_ISO_DATE)));
            }

            return String.format(bizCode + yyyyMMdd + "%06d", increment);
        } else {
            throw new AppException("请先开启redis", "sys." + this.appExceptionHandler.getAppId() + ".500");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值