@Test //模拟下单扣库存,扣可售量, 冻结可售量
void test2() {
String key = "product.108";
StringBuilder sb = new StringBuilder();
// 1. 我要知道需求量是多少 ,还要知道是哪个key
sb.append(" local key = KEYS[1] ");
sb.append(" local needQty = ARGV[1] ");
// 2. 我要判断目前的库存量是否满足需求量
sb.append(" local redisQty = redis.call('get',key) ");
// 3. 如果不满足 直接返回剩余的量 , 0 ,1 ,2 ....
sb.append(" if tonumber(needQty) > tonumber(redisQty) then ");
sb.append(" return tonumber(redisQty) ");
sb.append(" else ");
// 4. 如果满足, decrby(需求量), -1
sb.append(" redis.call('decrby',key,needQty) ");
sb.append(" return -1 ");
sb.append(" end ");
RedisScript<Long> script = RedisScript.of(sb.toString(),Long.class);
String needQty = RandomUtil.randomInt(1, 5)+"";
Long ret = stringRedisTemplate.execute(script, CollUtil.newArrayList(key),needQty);
if(ret.intValue() == -1){
System.out.println(StrUtil.format("下单成功,需求量是:{}",needQty));
} else {
System.out.println(StrUtil.format("下单失败,需求量是:{},库存量是:{}",needQty,ret));
}
}
10-16
818
12-18
1524
08-09
378
09-24