RedisTemplate执行lua脚本实现库存扣减

好多人可能不知道如何使用redisTemplate执行lua脚本,最近在做秒杀的时候,用到了redis分布式锁,使用lua实现,包括库存扣减

lua脚本代码:
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

JAVA代码:

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

可以关注下博主的公众号,实时推送解决方案!
公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值