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;

0

版权声明 ▶ 本网站名称:我的学习笔记
▶ 本文链接:https://ooolo.net/article/550.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!!

none
最后修改于:2024年09月12日 16:38

添加新评论

icon_mrgreen.pngicon_neutral.pngicon_twisted.pngicon_arrow.pngicon_eek.pngicon_smile.pngicon_confused.pngicon_cool.pngicon_evil.pngicon_biggrin.pngicon_idea.pngicon_redface.pngicon_razz.pngicon_rolleyes.pngicon_wink.pngicon_cry.pngicon_surprised.pngicon_lol.pngicon_mad.pngicon_sad.pngicon_exclaim.pngicon_question.png