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"