利用redis实现分布式锁解决幂等性判断

431 阅读1分钟

redisTemplate.opsForValue().setIfAbsent,即如果key不存在,才会设置它的值,返回true,如果key已经存在,则不添加,返回false。


@Transactional
@Service
@Slf4j
public class OrderService extends ServiceImpl<OrderMapper, Order> implements IOrderService {
//添加订单减少库存的幂等性判断
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public Long saveOrder(RequestParams params) {
        //减库存做幂等性判断
        String key = UserHolder.getUser() + params.getItemId() + "";

        Boolean flag = redisTemplate.opsForValue().setIfAbsent
                (key, params.getNum(), 100, TimeUnit.SECONDS);

        if (!flag) {
            log.error("重复提交了!!!!!!!!!!");
            return -1L;
        }
        //先获取订单数据.新增订单
        try {
       //业务实现
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放锁
            redisTemplate.delete(key);
        }
        log.info("成功执行完毕!!!!!!!!!!!!!!!!");
        return order.getId();
    }
}