redisson扣减库存或者积分 (lua脚本实现)

下面代码兼容了(key 不存在,key不是int类型,num为null)情况,均以扣减失败返回。

函数返回值说明:-1 表示扣减失败,大于等于0 表示扣减成功后剩余的数量。

    public long decrBy(String key, Integer num) {
        if(num == null) {
            return -1;
        }
        String script = "if(redis.call('object', 'encoding', KEYS[1]) == 'int') then " +
                "local now = redis.call('get', KEYS[1]) - ARGV[1]; " +
                "if (now >= 0) then " +
                "redis.call('set', KEYS[1], now); " +
                "return now; " +
                "end; " +
                "end; " +
                "return -1;";
        RScript rscript = redissonClient.getScript();
        return rscript.eval(RScript.Mode.READ_WRITE, script, RScript.ReturnType.INTEGER, Arrays.asList(key), num);
    }

 

posted @ 2022-02-11 18:07  数学与IT  阅读(592)  评论(0编辑  收藏  举报