溫馨提示×

溫馨提示×

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

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

Redis如何執(zhí)行Lua腳本

發(fā)布時間:2021-11-17 10:55:02 來源:億速云 閱讀:591 作者:柒染 欄目:大數(shù)據(jù)

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

     

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

 
什么是Lua?

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

 
Redis怎么執(zhí)行Lua腳本
 
EVAL命令

Redis中可以使用EVAL命令執(zhí)行相應(yīng)的Lua腳本

1> EVAL 'local val="Hello Jackey" return val' 0
2"Hello Jackey"
 

你可以像這樣在交互模式下執(zhí)行Lua腳本,這樣更方便處理錯誤。只是這樣還不夠,有時候,我們需要給Lua腳本傳入一些參數(shù)。細心的同學(xué)一定注意到了,腳本的后面還有一個數(shù)字0,它的意思的不傳入?yún)?shù)。

那怎么傳參數(shù)呢?

1> EVAL 'local val=KEYS[1] return val.." "..ARGV[1]' 1 Hello Redis
2"Hello Redis"
 

其實也很簡單,傳入的參數(shù)都是kv形式的,這個數(shù)字代表傳入?yún)?shù)的key的數(shù)量,再后面就是n個key和n個value。在腳本中,可以理解為從KEYS數(shù)組和ARGV數(shù)組中獲取對應(yīng)的值,下標是從1開始的。

上面例子中的兩個點是Lua腳本中字符串連接的操作符

現(xiàn)在我們已經(jīng)知道怎么在Redis中執(zhí)行Lua腳本了,可是這樣的腳本和Redis沒有關(guān)系啊,怎么才能操作Redis中的數(shù)據(jù)呢?請繼續(xù)看我表演

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
 

我們可以使用上面這種方法執(zhí)行一些簡單的Lua腳本,如果要執(zhí)行更加復(fù)雜的Lua腳本,用EVAL命令就會顯得臃腫且凌亂。所以Redis又提供了一種方法。

 
redis-cli --eval

我們可以先寫一個Lua文件,然后使用redis-cli命令來執(zhí)行。

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命令來執(zhí)行了,看起來也不會很凌亂,使用這種方式傳入?yún)?shù)時,不需要指定key的數(shù)量,而是用逗號分隔key和argv。

 
EVALSHA

你以為到這就結(jié)束了嗎?那就too naive了。如果我們在Redis交互模式中,想要執(zhí)行腳本文件怎么辦?每次都退出來,執(zhí)行完再連接一次?這未免太麻煩了。Redis提供了EVALSHA命令,使我們可以在交互模式執(zhí)行腳本文件。

首先,需要上傳腳本文件

1$ redis-cli SCRIPT LOAD "$(cat hello.lua)"
2"463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46"
 

會得到一串十六進制的數(shù)字,這是這個腳本的唯一標識。拿到這個數(shù)字后,表示我們已經(jīng)將腳本上傳到服務(wù)器了,接下來就可以使用這個標識來執(zhí)行腳本了。

1> EVALSHA 463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46 1 my_name Hello
2"Hello Jackeyzhe"
   
終止腳本

Redis中Lua腳本到默認執(zhí)行時長是5秒,一般情況下腳本的執(zhí)行時間都是毫秒級的,如果執(zhí)行超時,腳本也不會停止,而是記錄錯誤日志。

終止腳本執(zhí)行的方法有兩種

  1. 使用KILL SCRIPT命令

  2. 使用SHUTDOWN NOSAVE命令關(guān)閉服務(wù)器

不過不建議手動終止腳本

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI