redis与数据库数据一致性问题

该博客介绍了在并发环境下如何使用分布式锁确保订单状态更新的一致性。首先通过Zookeeper获取分布式锁,然后更新数据库中的订单状态,接着删除对应的缓存。如果缓存删除失败,则将订单号放入延时队列,以备后续补偿删除。整个过程保证了业务的正确性,并避免了数据不一致的问题。
摘要由CSDN通过智能技术生成

采用先更新数据库,再删除缓存方式(推荐) | 如果是热点key比较多情况下,用先更新数据库,再更新缓存方式

  1. 分布式锁对当前更新数据加锁,保证并发数据一致性
  2. 修改订单状态
  3. 此订单加入延时队列中,补偿删除对应缓存中数据
  4. 删除缓存
@Transactional(rollbackFor = Exception.class)
    public B2cOrderDto updateOrderStatusByCode(String orderCode, OrderStatusEnum orderStatusEnum) {
        Assert.notNull(orderCode, "订单编号为空");
        log.info("修改订单 订单编号:{}", orderCode);

        B2cOrderEntity save = null;
        InterProcessMutex lock = null;
        try {
            lock = zookeeperLock.tryLock("updateOrderStatus" + orderCode, 3000, 3000);
            if (lock == null) {
                throw new BusinessException("当前订单正在修改中,请稍后操作!");
            }

            //修改订单状态
            B2cOrderEntity orderEntity = orderRepository.findByOrderCode(orderCode);
            orderEntity.setOrderStatus(orderStatusEnum.getCode());
            orderEntity.setModifyTime(new Date());
            save = orderRepository.save(orderEntity);

            //删除缓存
            Boolean delete = redisTemplate.delete("order:" + orderCode);
            //如果删除缓存失败,加入延时队列,利用重试机制进行补偿删除
            if (!delete) {
                amqpTemplate.convertAndSend(RabbitContents.DELETE_ORDERCACHE_EXCHANGE, "", orderCode);
                log.info("exchange is {}, data is {}", RabbitContents.DELETE_ORDERCACHE_EXCHANGE, orderCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (lock != null) {
                try {
                    zookeeperLock.unlock(lock);
                } catch (Exception e) {
                    log.error("解锁失败", e);
                }
            }
        }
        return entityToDto(save);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值