Lua 讓Redis 更靈活
Redis的一些命令
EVAL
執行Lua指令碼EVALSHA
執行Lua指令碼的sha1SCRIPT LOAD
載入Lua指令碼到Redis ScriptSCRIPT FLUSH
清空Redis ScriptSCRIPT EXISTS
判斷是否存在Rdis Script中
在 Lua 指令碼中,可以使用兩個不同函式來執行 Redis 命令,它們分別是:
redis.call()//報錯時會 丟擲錯誤,Lua指令碼停止執行
redis.pcall()//不會丟擲錯誤,Lua指令碼繼續執行 下面的語句
redis資料型別 | lua資料型別 |
---|---|
integer | number |
bulk | string |
multi bulk | table |
status | 包含ok域的table |
error | 包含err域的table |
nil bulk | false |
Redis不允許Lua建立全域性變數(變數新增 local 字首)
為了防止資料洩露進lua環境,redis指令碼不循序建立全域性變數.
訪問一個全域性變數(無論是否存在)都會引起指令碼停止
1.Eval
EVAL script numkeys key [key ...] arg [arg ...]
首先大家一定要知道eval的語法格式,其中:
<1> script: 你的lua指令碼
<2> numkeys: key的個數
<3> key: redis中各種資料結構的替代符號
<4> arg: 你的自定義引數
Redis:
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 arvg1 arvg2
2.Evalsha
Redis Evalsha 命令根據給定的 sha1 校驗碼,執行快取在伺服器中的指令碼。
語法
redis Evalsha 命令基本語法如下:
- redis 127.0.0.1:6379> EVALSHA sha1 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] ,諸如此類)。
可用版本
>= 2.6.0
redis:
- 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 Load
Redis Script Load 命令用於將指令碼 script 新增到指令碼快取中,但並不立即執行這個指令碼。
EVAL 命令也會將指令碼新增到指令碼快取中,但是它會立即對輸入的指令碼進行求值。
如果給定的指令碼已經在快取裡面了,那麼不執行任何操作。
在指令碼被加入到快取之後,通過 EVALSHA 命令,可以使用指令碼的 SHA1 校驗和來呼叫這個指令碼。
指令碼可以在快取中保留無限長的時間,直到執行 SCRIPT FLUSH 為止。
關於使用 Redis 對 Lua 指令碼進行求值的更多資訊,請參見 EVAL 命令。
例項
- redis 127.0.0.1:6379> SCRIPT LOAD "return 1"
- "e0e1f9fabfc9d4800c877a703b823ac0578ff8db"
4.Script Flush
Redis Script Flush 命令用於清除所有 Lua 指令碼快取。
語法
redis Script Flush 命令基本語法如下:
- redis 127.0.0.1:6379> SCRIPT FLUSH
總是返回 OK
例項
- redis 127.0.0.1:6379> SCRIPT FLUSH
- OK
5.Script kill
Redis Script kill 命令用於殺死當前正在執行的 Lua 指令碼,當且僅當這個指令碼沒有執行過任何寫操作時,這個命令才生效。
這個命令主要用於終止執行時間過長的指令碼,比如一個因為 BUG 而發生無限迴圈的指令碼。
SCRIPT KILL 執行之後,當前正在執行的指令碼會被殺死,執行這個指令碼的客戶端會從 EVAL 命令的阻塞當中退出,並收到一個錯誤作為返回值。
語法
redis Script kill 命令基本語法如下:
redis 127.0.0.1:6379> SCRIPT KILL
總是返回 OK
例項
redis 127.0.0.1:6379> SCRIPT KILL OK