redis+mysql生成商品的唯一货号 带自动递增 Published on Sep 12, 2024 in Java随笔 with 0 comment 如果redis数据被丢失,则从数据库查询出最大数值保存到redis在自增 ```java // 生成递增的货号逻辑 public String generateProductCode() { lock.lock(); // 加锁,确保多线程安全 try { // 从 Redis 获取当前货号,如果 Redis 中不存在,初始化货号 String currentCodeStr = redisTemplate.opsForValue().get(PRODUCT_CODE_KEY); if (currentCodeStr == null) { // 从数据库中获取当前最大的货号 Integer maxCode = productMapper.findMaxProductCode(); if (maxCode == null) { maxCode = 0; // 如果数据库中没有数据,从 0 开始 } // 初始化 Redis 中的货号为数据库中的最大值 redisTemplate.opsForValue().set(PRODUCT_CODE_KEY, maxCode.toString()); } // 使用 Redis 的 INCR 命令自增货号 Long newCode = redisTemplate.opsForValue().increment(PRODUCT_CODE_KEY); return String.format("%08d", newCode); // 格式化为 8 位数字 } finally { lock.unlock(); // 解锁 } } ``` ```java // 生成递增的货号 String productCode = generateProductCode(); product.setItemNumberPrefix("ZML"); product.setItemNumber(productCode); ``` ```java private static final String PRODUCT_CODE_KEY = "product:code"; // Redis 中货号的 key private final Lock lock = new ReentrantLock(); // 创建一个 ReentrantLock 锁 @Autowired private StringRedisTemplate redisTemplate; // 查询当前数据库中最大的货号 @Select("SELECT MAX(p.item_number) FROM Product p") Integer findMaxProductCode(); ``` 为了方便查询我是把编号和编号前缀分成了两个字段保存 private String itemNumberPrefix; @ApiModelProperty(value = "商品货号") private String itemNumber; 本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。