redis腳本使用lua解釋器來執行腳本,redis2.6版本通過內嵌支持lua環境,執行腳本的常用命令為eval
eval命令
語法:eval script numkeys key [key ...] arg [ arg ...]
實例:
script:參數是一段腳本程序,腳本不必(也不應該)定義為一個Lua函數。
numberkeys:用於指定鍵名參數的個數。
key【key...】 :從eval的第三個參數開始算起,表示在腳本中所用的到那些redis鍵(key),這些鍵名參數可以在Lua中通過全局變量keys數組,用1位基址的形式訪問(keys[1],keys[2])
arg [arg ...]: 附加參數,在 Lua 中通過全局變量 ARGV 數組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。
1 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],KEYS[3],ARGV[1],ARGV[2],ARGV[3]}" 3 shi zhang yang 23 21 20 2 1) "shi" 3 2) "zhang" 4 3) "yang" 5 4) "23" 6 5) "21" 7 6) "20"
evalsha命令
evalsha命令根據給定的sha1校驗碼,執行緩存在服務器中的腳本。
將腳本緩存到服務器的操作可以通過SCRIPT LOAD命令進行。
這個命令的其他地方,不如參數的傳入方式,都喝EVAL命令一樣。
evalsha命令基本語法: evalsha sha1 numkeys key [key...] arg[arg ...]
sha1:通過SCRIPT LOAD 生成的sha1校驗碼。
key [key ...]: 從 EVAL 的第三個參數開始算起,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數可以在 Lua 中通過全局變量 KEYS 數組,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。
arg [arg ...]: 附加參數,在 Lua 中通過全局變量 ARGV 數組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。
實例:
1 127.0.0.1:6379> script load "return 'hello moto'" 2 "232fd51614574cf0867b83d384a5e898cfd24e5a" 3 127.0.0.1:6379> evalsha "232fd51614574cf0867b83d384a5e898cfd24e5a" 0 4 "hello moto"
Script Exists 命令
Script Exists命令用於校驗指定的腳本是否已經被保存在緩存當中。
基本語法: evalsha sha1 numkeys key[key...] arg [arg...]
返回值:一個列表,包含0和1,前者表示腳本不存在於緩存,后者表示腳本已經在緩存里面了。
列表中的元素和給定的SHA1校驗和保持對應關系,比如列表的第三個元素的值就表示第三個SHA1校驗和指定腳本在緩存中的狀態。
實例:
1 127.0.0.1:6379> script load "return 'hello moto'" #SHA1校驗碼 2 "232fd51614574cf0867b83d384a5e898cfd24e5a" 3 127.0.0.1:6379> script exists 232fd51614574cf0867b83d384a5e898cfd24e5a #查看校驗碼是否存在 4 1) (integer) 1 #1表示存在 5 127.0.0.1:6379> script flush#清空緩存 6 OK 7 127.0.0.1:6379> script exists 8 232fd51614574cf0867b83d384a5e898cfd24e5a#再次查看緩存,0表示不存在 9 1) (integer) 0
Script Flush 命令
該命令用於清楚所有LUA腳本緩存。
基本語法: Script Flush
返回值:總是返回OK
實例:
1 127.0.0.1:6379> script load "return 'hello moto'" 2 "232fd51614574cf0867b83d384a5e898cfd24e5a" 3 127.0.0.1:6379> script exists 232fd51614574cf0867b83d384a5e898cfd24e5a 4 1) (integer) 1 5 127.0.0.1:6379> script flush###清楚腳本緩存 6 OK 7 127.0.0.1:6379> script exists 232fd51614574cf0867b83d384a5e898cfd24e5a 8 1) (integer) 0
Script kill命令
Script kill命令用於殺死當前正在運行的Lua腳本,當且僅當這個腳本沒有執行過任何操作時,這個命令才生效。
這個命令主要用於終止運行時間過長的腳本,比如一個bug而發生無限循環的腳本。
script kill執行之后,當前正在運行的腳本會被殺死,執行這個腳本的客戶端會從eval命令的阻塞當中退出,並收到一個錯誤作為返回值。
基本命令:script kill
返回值:script kill
實例:
1 redis 127.0.0.1:6379> SCRIPT KILL 2 OK
Script load script命令
該命令用於將腳本script添加到腳本緩存中,但並不執行這個腳本。
eval命令也會將腳本添加到腳本緩存中,但是它會里脊對輸入的腳本進行求值。
如果給定的腳本已經在緩存里面了,那么不執行任何操作。
在腳本被加入到緩存之后,通過evalsha命令,可以使用腳本的sha1校驗和來調用這個腳本。
腳本可以在緩存中保留無限長的時間,知道執行script flush為止。
基本語法:script load script
返回值:給定腳本的SHA1校驗和。
實例:
1 127.0.0.1:6379> script load "return 1" 2 "e0e1f9fabfc9d4800c877a703b823ac0578ff8db"
