redisTemplate 执行lua脚本获取结果探析

406 阅读1分钟

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)如果不设置返回类型则接收不到返回值

源码分析

image.png 此时会默认赋值一个resultType 为status类型,默认接收为byte[]

image.png 继续观察script对象并没有对resultType进行默认赋值,接着往下观察

image.png

圈红处scriptResultType为空导致直接返回null,同时也不会执行反序列化操作。记录一下