SpringBoot中RedisTemplate的RedisScript解析

  • 2019 年 10 月 8 日
  • 筆記

在RedisTemplate執行lua腳本如果做呢? 查看下面方法程式碼,這是引入lua內容腳本到RedisScript的子類DefaultRedisScript類中,這是redis提供支援的腳本支援類,更多內容可參考=>redis腳本參考

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方法查看執行的源碼流程:

首先進入到RedisTemplate.java中的execute()方法中

通過方法重載,找到具體的執行類方法,主要有以下4步:

  1. execute()三個參數的方法
  2. execute()五個參數的方法
  3. execute()五個參數的方法體
  4. 最後eval()方法執行redis腳本命令

接下來進入到eval()方法的對應實現類DefaultScriptExecute中: 首先直接傳sha值,如果在Redis中找不到預載入的lua腳本導致報錯,則catch住該錯誤,把整個腳本序列化後傳入Redis進行執行:

我們查看以下腳本序列化的執行程式碼scriptBytes(),其對應的執行類為StringRedisSerializer類

進入到StringRedisSerializer類,可以看出該序列化操作其實就是字元串String序列化操作

至此,關於SpringBoot中RedisTemplate的RedisScript源碼分析結束~

Tags: