1. 程式人生 > 程式設計 >SpringBoot中RedisTemplate的RedisScript解析

SpringBoot中RedisTemplate的RedisScript解析

著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

在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',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原始碼分析結束~