在Redis的學習中,對於腳本剛開始還是有很多的不理解,命令的參數含義也有很多不明白。於是找了很對博文記錄下來,方便以後複習和理解。
由於我對於腳本的理解僅僅停留在基本的階段,所以就先不探究腳本的應用和優點,直接進入對命令執行的分析和學習。
1、執行lua腳本
EVAL script numkeys key [key ...] arg [arg ...]
參數說明:
- script: 參數是一段 Lua 5.1 腳本程序。腳本不必(也不應該)定義爲一個 Lua 函數。
- numkeys: 用於指定鍵名參數的個數。
- key [key ...]: 從 EVAL 的第三個參數開始算起,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數可以在 Lua 中通過全局變量 KEYS 數組,用 1 爲基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。
- arg [arg ...]: 附加參數,在 Lua 中通過全局變量 ARGV 數組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。
KEYS[]和ARGV[]對應,例子中這個時候numkeys爲1,我的理解爲對應一組,這個理解肯定不對。然後後面就是按順序賦值爲KEY1 FIRST並返回。
注意的一點是參考博文中說“KEYS[]和ARGV[]中間 ‘ , ’ 兩邊的空格不能省略”,我省略了的情況下仍然可以執行這個腳本。但是如果遇到什麼問題的話,確實可以從這個爲入手點找錯誤。
2、將腳本 script 添加到腳本緩存中,但並不立即執行這個腳本,EVAL 命令也會將腳本添加到腳本緩存中,但是它會立即對輸入的腳本進行求值。如果給定的腳本已經在緩存裏面了,那麼不執行任何操作。在腳本被加入到緩存之後,通過 EVALSHA 命令,可以使用腳本的 SHA1 校驗和來調用這個腳本。腳本可以在緩存中保留無限長的時間,直到執行 SCRIPT FLUSH 爲止。
script load script
127.0.0.1:6379> script load "return aaa"
"b182a8952ea1c5fddd2f819d8915dc80b3586c6f"
這邊筆者試過,腳本必須是return語句且包含雙引號。
然而這個是錯誤的,筆者在這樣把腳本 script 添加到腳本緩存中後調用evalsha之後出現錯誤,錯誤信息是:(error) ERR Error running script (call to f_b182a8952ea1c5fddd2f819d8915dc80b3586c6f): @enable_strict_lua:15: user_script:1: Script attempted to access unexisting global variable 'aaa'
而這個錯誤的解決辦法就是在添加腳本到腳本緩存的時候,要注意"return '***'",單引號不能 漏掉
3、根據給定的 sha1 校驗碼,執行緩存在服務器中的腳本。
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
127.0.0.1:6379> evalsha "e20bf1be2a7b6dc909965de4a871a2b34a6d900d" 0
"aaa"
4、校驗指定的腳本是否已經被保存在緩存當中。返回值:一個列表,包含 0 和 1 ,前者表示腳本不存在於緩存,後者表示腳本已經在緩存裏面了。
script exists sha1
5、清除所有 Lua 腳本緩存。
script flush
6、殺死當前正在運行的 Lua 腳本
script kill
當且僅當這個腳本沒有執行過任何寫操作時,這個命令才生效。這個命令主要用於終止運行時間過長的腳本,比如一個因爲 BUG 而發生無限循環的腳本。
SCRIPT KILL 執行之後,當前正在運行的腳本會被殺死,執行這個腳本的客戶端會從 EVAL 命令的阻塞當中退出,並收到一個錯誤作爲返回值。
參考鏈接:http://blog.csdn.net/wzzfeitian/article/details/42081837