redis 扣减库存
- 1.如果 stock - num <= 0,说明库存不足,返回 -1
- *2.*扣除失败,返回 -2
- *3.扣除成功,返回剩余库存
- **4.*如果该商品库存不存在,返回 -3
使用 redisTemplate 操作
/**
* 扣减库存
* 先拿到商品库存的值:stock
* 再拿到商品需要扣除或返还的库存数量:num
* 1.如果 stock - num <= 0,说明库存不足,返回 -1
* 2.扣除失败,返回 -2
* 3.扣除成功,返回剩余库存
* 4.如果该商品库存不存在,返回 -3
*/
public static final String SCRIPT =
"if (redis.call('exists', KEYS[1]) == 1) then"
+ " local stock = tonumber(redis.call('get', KEYS[1]));"
+ " local num = tonumber(ARGV[1]);"
+ " local results_num = stock - num"
+ " if (results_num <= 0) then"
+ " return -1;"
+ " end;"
+ " if (stock >= num) then"
+ " return redis.call('incrBy', KEYS[1], 0 - num);"
+ " end;"
+ " return -2;"
+ "end;"
+ "return -3;";
@GetMapping("/reduce/stock")
public String reduceStock(){
RedisScript<Long> redisScript = new DefaultRedisScript<>(SCRIPT, Long.class);
Long apple = redisTemplate.execute(redisScript, Arrays.asList("apple"),"2");
System.out.println("result: "+ apple);
return "success";
}
结果:
result: 1
result: -1