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