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源碼分析結束~源碼分析

相關文章
相關標籤/搜索