Redis如何執行Lua腳本,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Redis提供了豐富的指令集,但是仍然不能滿足所有場景,在一些特定場景下,需要自定義一些指定來完成某些功能。因此,Redis提供了Lua腳本支持,用戶可以自己編寫腳本來實現想要的功能。
Lua是一種功能強大的,高效,輕量級,可嵌入的腳本語言。它是動態類型語言,通過使用基于寄存器的虛擬機解釋字節碼運行,并具有增量垃圾收集的自動內存管理,是配置,腳本和快速原型設計的最佳選擇。
Redis中可以使用EVAL命令執行相應的Lua腳本
1> EVAL 'local val="Hello Jackey" return val' 0
2"Hello Jackey"
你可以像這樣在交互模式下執行Lua腳本,這樣更方便處理錯誤。只是這樣還不夠,有時候,我們需要給Lua腳本傳入一些參數。細心的同學一定注意到了,腳本的后面還有一個數字0,它的意思的不傳入參數。
那怎么傳參數呢?
1> EVAL 'local val=KEYS[1] return val.." "..ARGV[1]' 1 Hello Redis
2"Hello Redis"
其實也很簡單,傳入的參數都是kv形式的,這個數字代表傳入參數的key的數量,再后面就是n個key和n個value。在腳本中,可以理解為從KEYS數組和ARGV數組中獲取對應的值,下標是從1開始的。
上面例子中的兩個點是Lua腳本中字符串連接的操作符
現在我們已經知道怎么在Redis中執行Lua腳本了,可是這樣的腳本和Redis沒有關系啊,怎么才能操作Redis中的數據呢?請繼續看我表演
1> get my_name
2"Jackeyzhe"
3> EVAL 'local val=ARGV[1].." "..redis.call("get",KEYS[1]) return val' 1 my_name Hello
4"Hello Jackeyzhe"
使用redis.call或redis.pcall(以后會提到)就可以操作redis了。
需要注意的是,如果返回下面的錯誤,說明要獲取的key不存在
1> EVAL 'local val=ARGV[1].." "..redis.call("get",KEYS[1]) return val' 1 me Hello
2(error) ERR Error running script (call to f_eb11f8ddeeee07cc88d1f3bd103069284b83c5d8): @user_script:1: user_script:1: attempt to concatenate a boolean value
我們可以使用上面這種方法執行一些簡單的Lua腳本,如果要執行更加復雜的Lua腳本,用EVAL命令就會顯得臃腫且凌亂。所以Redis又提供了一種方法。
我們可以先寫一個Lua文件,然后使用redis-cli命令來執行。
1local name=redis.call("get", KEYS[1])
2local greet=ARGV[1]
3local result=greet.." "..name
4return result
1> redis-cli --eval hello.lua my_name , Hello
2"Hello Jackey"
這樣,我們就可以先寫一個.lua文件,然后再使用redis-cli命令來執行了,看起來也不會很凌亂,使用這種方式傳入參數時,不需要指定key的數量,而是用逗號分隔key和argv。
你以為到這就結束了嗎?那就too naive了。如果我們在Redis交互模式中,想要執行腳本文件怎么辦?每次都退出來,執行完再連接一次?這未免太麻煩了。Redis提供了EVALSHA命令,使我們可以在交互模式執行腳本文件。
首先,需要上傳腳本文件
1$ redis-cli SCRIPT LOAD "$(cat hello.lua)"
2"463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46"
會得到一串十六進制的數字,這是這個腳本的唯一標識。拿到這個數字后,表示我們已經將腳本上傳到服務器了,接下來就可以使用這個標識來執行腳本了。
1> EVALSHA 463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46 1 my_name Hello
2"Hello Jackeyzhe"
Redis中Lua腳本到默認執行時長是5秒,一般情況下腳本的執行時間都是毫秒級的,如果執行超時,腳本也不會停止,而是記錄錯誤日志。
終止腳本執行的方法有兩種
使用KILL SCRIPT命令
使用SHUTDOWN NOSAVE命令關閉服務器
不過不建議手動終止腳本
關于Redis如何執行Lua腳本問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。