溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis如何執行Lua腳本

發布時間:2021-11-17 10:55:02 來源:億速云 閱讀:643 作者:柒染 欄目:大數據

Redis如何執行Lua腳本,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

     

Redis提供了豐富的指令集,但是仍然不能滿足所有場景,在一些特定場景下,需要自定義一些指定來完成某些功能。因此,Redis提供了Lua腳本支持,用戶可以自己編寫腳本來實現想要的功能。

 
什么是Lua?

Lua是一種功能強大的,高效,輕量級,可嵌入的腳本語言。它是動態類型語言,通過使用基于寄存器的虛擬機解釋字節碼運行,并具有增量垃圾收集的自動內存管理,是配置,腳本和快速原型設計的最佳選擇。

 
Redis怎么執行Lua腳本
 
EVAL命令

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又提供了一種方法。

 
redis-cli --eval

我們可以先寫一個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。

 
EVALSHA

你以為到這就結束了嗎?那就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秒,一般情況下腳本的執行時間都是毫秒級的,如果執行超時,腳本也不會停止,而是記錄錯誤日志。

終止腳本執行的方法有兩種

  1. 使用KILL SCRIPT命令

  2. 使用SHUTDOWN NOSAVE命令關閉服務器

不過不建議手動終止腳本

關于Redis如何執行Lua腳本問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女