lua脚本示例
private static final String SECOND_KILL_LUA = "local key = KEYS[1]; " +
"local amount = tonumber(ARGV[1]); " +
"local stock = tonumber(redis.call('get',key)); " +
"if(stock >= amount) then " +
"redis.call('decrby', key, amount); " +
"return redis.call('get', KEYS[1]); " +
"else " +
"return nil; " +
"end; ";
java代码执行
public void mockSecondKill(Integer amount) {
List<String> keys = Collections.singletonList("iphone");
Object execute = redisTemplate.execute(RedisScript.of(SECOND_KILL_LUA, Integer.class), keys, amount);
LOGGER.info("秒杀结果:{}", execute);
}
RedisScript.of(SECOND_KILL_LUA, Integer.class)如果不设置返回类型则接收不到返回值
源码分析
此时会默认赋值一个resultType 为status类型,默认接收为byte[]
继续观察script对象并没有对resultType进行默认赋值,接着往下观察
圈红处scriptResultType为空导致直接返回null,同时也不会执行反序列化操作。记录一下