订单号规则,不能重复。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; } }