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();
}
}