订单号规则,不能重复。redis去重 redis集合set应用

订单号规则,不能重复。redis去重 redis集合set应用

redis锁定商品解决并发售卖问题 RedisUtil工具类
https://www.cnblogs.com/oktokeep/p/17917833.html

需求背景:订单号根据日期反转 加上随机数,订单号是否重复,前提是确保当天的订单号不重复,可以确保全局系统中的订单号不重复。

//以下是伪代码
        String reversedDate = 工具类获取反转的日期,比如:20240320,反转后变成:02304202;
        String serialNumber = 工具类生成序列号;
        String orderNo = 订单号前缀 + serialNumber + reversedDate;
        //遍历100次,如果重复的前提下。
        for(int i = 0; i < 100; i++) {
            //保存到redis中,以当前的日期key,订单号作为集合中的值。
            Set<String> orderNoSet = redisUtilService.getSetValue(redis前缀KEY + reversedDate);
            if (CollectionUtils.isNotEmpty(orderNoSet)) {
                if (orderNoSet.contains(orderNo)) {
                    logger.info("订单号重建前:[{}],i=[{}]",orderNo,i);
                    //重复,重新生成一个,在下一次循环中再次检查是否重复。
                    serialNumber = 工具类生成序列号;
                    orderNo = 订单号前缀 + serialNumber + reversedDate;
                    logger.info("订单号重建后:[{}],i=[{}]",orderNo,i);
                } else {
                    //不重复,保持到redis set集合中。允许该订单号使用
                    redisUtilService.setSetValue(redis前缀KEY + reversedDate, orderNo);
                    logger.info("订单号使用1:[{}],i=[{}]",orderNo,i);
                    break;
                }
            }else {
                //初始化,该redis有效期按1天
                redisUtilService.setSetValue(redis前缀KEY + reversedDate, orderNo);
                redisUtilService.expireDay(redis前缀KEY + reversedDate, 1);  //保存1天
                logger.info("订单号使用2:[{}],i=[{}]",orderNo,i);
                break;
            }
        }

 

posted on 2024-03-20 19:15  oktokeep  阅读(49)  评论(1编辑  收藏  举报