订单号规则,不能重复。redis去重 redis集合set应用
redis锁定商品解决并发售卖问题 RedisUtil工具类
https://cloud.tencent.com/developer/article/2455807
需求背景:订单号根据日期反转 加上随机数,订单号是否重复,前提是确保当天的订单号不重复,可以确保全局系统中的订单号不重复。
代码语言:javascript复制//以下是伪代码
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;
}
}