SpringBoot中RedisTemplate的RedisScript解析
阿新 • • 發佈:2019-12-31
著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
在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步:-
execute()
三個引數的方法 -
execute()
五個引數的方法 -
execute()
五個引數的方法體 - 最後
eval()
方法執行redis指令碼命令 接下來進入到eval()
方法的對應實現類DefaultScriptExecute
中: 首先直接傳sha值,如果在Redis中找不到預載入的lua指令碼導致報錯,則catch住該錯誤,把整個指令碼序列化後傳入Redis進行執行:
我們檢視以下指令碼序列化的執行程式碼scriptBytes()
,其對應的執行類為StringRedisSerializer
類
StringRedisSerializer
類,可以看出該序列化操作其實就是字串String序列化操作
至此,關於SpringBoot中RedisTemplate的RedisScript原始碼分析結束~