Redis腳本

在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] ,諸如此類)。
比如 EVAL "return {KEYS[1] , ARGV[1]}" 1 KEY1 FIRST

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章