local key=KEYS[1]; ---key
local subNum = tonumber(ARGV[1]) ; ---value
local surplusStock = tonumber(redis.call('get',key)); ---使用get命令获取key的value值 剩余库存
if (surplusStock<=0) then return 0 --- 剩余库存<=0 return 0
elseif (subNum > surplusStock) then return 1 ---秒杀数量>剩余库存返回1
else
redis.call('incrby', KEYS[1], -subNum)
return 2 --- 扣减成功返回 2
end
private String subStock="local key=KEYS[1];\n" +
"local subNum = tonumber(ARGV[1]) ;\n" +
"local surplusStock = tonumber(redis.call('get',key));\n" +
"if (surplusStock<=0) then return 0\n" +
"elseif (subNum > surplusStock) then return 1\n" +
"else\n" +
" redis.call('incrby', KEYS[1], -subNum)\n" +
" return 2 \n" +
"end";
@Test
public void test11(){
//构建redisScript对象,构造方法参数1 执行的lua脚本 参数2 结果返回类型
DefaultRedisScript<Long> defaultRedisScript = new DefaultRedisScript<>(subStock,Long.class);
//参数1 redisScript对象 参数2 keys,可以是多个,取决于你lua里的业务, 参数3 args 需要给lua传入的参数 也是多个
Long result = (Long) stringRedisTemplate.execute(defaultRedisScript, Arrays.asList("seckillStock:1594778100813"), "10");
System.out.println(result);
}
网友评论