SpringBoot中RedisTemplate的RedisScript解析

著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

在RedisTemplate执行lua脚本若是作呢? 查看下面方法代码,这是引入lua内容脚本到RedisScript的子类DefaultRedisScript类中,这是redis提供支持的脚本支持类,更多内容可参考=>redis脚本参考java

protected RedisScript<Long> getRedisLockScript() {
        String script = "local key = ARGV[1];local expiration = ARGV[2];local value = 1;";
        script += "if redis.call('EXISTS', key) == 1 then return -1 else redis.call('SET', key, value);redis.call('EXPIRE', key, expiration);return 1;end";
        return new DefaultRedisScript<>(script, Long.class);
    }
复制代码

这里能够经过查看execute方法查看执行的源码流程: redis

首先进入到 RedisTemplate.java中的 execute()方法中
经过方法重载,找到具体的执行类方法,主要有如下4步:

  1. execute()三个参数的方法
  2. execute()五个参数的方法
  3. execute()五个参数的方法体
  4. 最后eval()方法执行redis脚本命令
    接下来进入到eval()方法的对应实现类DefaultScriptExecute中: 首先直接传sha值,若是在Redis中找不到预加载的lua脚本致使报错,则catch住该错误,把整个脚本序列化后传入Redis进行执行:

咱们查看如下脚本序列化的执行代码scriptBytes(),其对应的执行类为StringRedisSerializerbash

进入到 StringRedisSerializer类,能够看出该序列化操做其实就是字符串String序列化操做

至此,关于SpringBoot中RedisTemplate的RedisScript源码分析结束~源码分析

相关文章
相关标签/搜索