redis+mysql生成商品的唯一货号 带自动递增
如果redis数据被丢失,则从数据库查询出最大数值保存到redis在自增
// 生成递增的货号逻辑
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(); // 解锁
}
}
// 生成递增的货号
String productCode = generateProductCode();
product.setItemNumberPrefix("ZML");
product.setItemNumber(productCode);
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;