17 Redis腳本

Redis 腳本使用 Lua 解釋器來執(zhí)行腳本。 Reids 2.6 版本通過內(nèi)嵌支持 Lua 環(huán)境。執(zhí)行腳本的常用命令為 EVAL。

語法

Eval 命令的基本語法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
實(shí)例

以下實(shí)例演示了 redis 腳本工作過程:

127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

Redis 腳本命令

下表列出了 redis 腳本常用命令:

1 Eval

Redis Eval 命令使用 Lua 解釋器執(zhí)行腳本。

# 語法
redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...] 

# 參數(shù)說明:
script: 參數(shù)是一段 Lua 5.1 腳本程序。腳本不必(也不應(yīng)該)定義為一個(gè) Lua 函數(shù)。
numkeys: 用于指定鍵名參數(shù)的個(gè)數(shù)。

key [key ...]: 從 EVAL 的第三個(gè)參數(shù)開始算起,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數(shù)可以在 Lua 中通過全局變量 KEYS 數(shù)組,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。

arg [arg ...]: 附加參數(shù),在 Lua 中通過全局變量 ARGV 數(shù)組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。


# 實(shí)例
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"

2 Evalsha

Redis Evalsha 命令根據(jù)給定的 sha1 校驗(yàn)碼,執(zhí)行緩存在服務(wù)器中的腳本。

# 語法
redis 127.0.0.1:6379> EVALSHA sha1 numkeys key [key ...] arg [arg ...] 

# 參數(shù)說明:
script: 參數(shù)是一段 Lua 5.1 腳本程序。腳本不必(也不應(yīng)該)定義為一個(gè) Lua 函數(shù)。

numkeys: 用于指定鍵名參數(shù)的個(gè)數(shù)。

key [key ...]: 從 EVAL 的第三個(gè)參數(shù)開始算起,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數(shù)可以在 Lua 中通過全局變量 KEYS 數(shù)組,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。

arg [arg ...]: 附加參數(shù),在 Lua 中通過全局變量 ARGV 數(shù)組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。


# 實(shí)例
redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
"232fd51614574cf0867b83d384a5e898cfd24e5a"

redis 127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a" 0
"hello moto"

3 Script Exists

Redis Script Exists 命令用于校驗(yàn)指定的腳本是否已經(jīng)被保存在緩存當(dāng)中。

# 語法
redis Script Exists 命令基本語法如下:
redis 127.0.0.1:6379> EVALSHA sha1 numkeys key [key ...] arg [arg ...] 


# 返回值
一個(gè)列表,包含 0 和 1 ,前者表示腳本不存在于緩存,后者表示腳本已經(jīng)在緩存里面了。
列表中的元素和給定的 SHA1 校驗(yàn)和保持對(duì)應(yīng)關(guān)系,比如列表的第三個(gè)元素的值就表示第三個(gè) SHA1 校驗(yàn)和所指定的腳本在緩存中的狀態(tài)。

# 實(shí)例

127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"            # 載入一個(gè)腳本
"232fd51614574cf0867b83d384a5e898cfd24e5a"
127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1
127.0.0.1:6379> SCRIPT FLUSH                                 # 清空緩存
OK
127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 0

4 Script Flush

Redis Script Flush 命令用于清除所有 Lua 腳本緩存。

# 語法
redis 127.0.0.1:6379> SCRIPT FLUSH

# 返回值
總是返回 OK

# 實(shí)例
redis 127.0.0.1:6379> SCRIPT FLUSH
OK

5 Script kill

Redis Script kill 命令用于殺死當(dāng)前正在運(yùn)行的 Lua 腳本,當(dāng)且僅當(dāng)這個(gè)腳本沒有執(zhí)行過任何寫操作時(shí),這個(gè)命令才生效。
這個(gè)命令主要用于終止運(yùn)行時(shí)間過長的腳本,比如一個(gè)因?yàn)?BUG 而發(fā)生無限循環(huán)的腳本。
SCRIPT KILL 執(zhí)行之后,當(dāng)前正在運(yùn)行的腳本會(huì)被殺死,執(zhí)行這個(gè)腳本的客戶端會(huì)從 EVAL 命令的阻塞當(dāng)中退出,并收到一個(gè)錯(cuò)誤作為返回值。

# 語法
redis 127.0.0.1:6379> SCRIPT KILL


# 返回值
總是返回 OK

# 實(shí)例
redis 127.0.0.1:6379> SCRIPT KILL
OK

6 Script Load

Redis Script Load 命令用于將腳本 script 添加到腳本緩存中,但并不立即執(zhí)行這個(gè)腳本。

EVAL 命令也會(huì)將腳本添加到腳本緩存中,但是它會(huì)立即對(duì)輸入的腳本進(jìn)行求值。
如果給定的腳本已經(jīng)在緩存里面了,那么不執(zhí)行任何操作。
在腳本被加入到緩存之后,通過 EVALSHA命令,可以使用腳本的 SHA1 校驗(yàn)和來調(diào)用這個(gè)腳本。
腳本可以在緩存中保留無限長的時(shí)間,直到執(zhí)行 SCRIPT FLUSH 為止。
關(guān)于使用 Redis 對(duì) Lua 腳本進(jìn)行求值的更多信息,請(qǐng)參見 EVAL 命令。

# 語法
redis 127.0.0.1:6379> SCRIPT LOAD script


# 返回值
給定腳本的 SHA1 校驗(yàn)和

# 實(shí)例
127.0.0.1:6379> SCRIPT LOAD "return 1"
"e0e1f9fabfc9d4800c877a703b823ac0578ff8db"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容