1. 程式人生 > >Lua 讓Redis 更靈活

Lua 讓Redis 更靈活

Redis的一些命令

  1. EVAL 執行Lua指令碼
  2. EVALSHA 執行Lua指令碼的sha1
  3. SCRIPT LOAD 載入Lua指令碼到Redis Script
  4. SCRIPT FLUSH 清空Redis Script
  5. SCRIPT EXISTS 判斷是否存在Rdis Script中

在 Lua 指令碼中,可以使用兩個不同函式來執行 Redis 命令,它們分別是:

  • redis.call()//報錯時會 丟擲錯誤,Lua指令碼停止執行
  • redis.pcall()//不會丟擲錯誤,Lua指令碼繼續執行 下面的語句
redis資料型別lua資料型別
integernumber
bulkstring
multi bulktable
status包含ok域的table
error包含err域的table
nil bulkfalse
注意:

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 命令基本語法如下:

  1. 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:

  1. redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"
  2. "232fd51614574cf0867b83d384a5e898cfd24e5a"
  3. redis 127.0.0.1:6379> EVALSHA "232fd51614574cf0867b83d384a5e898cfd24e5a"0
  4. "hello moto"

3.Script Load 

Redis Script Load 命令用於將指令碼 script 新增到指令碼快取中,但並不立即執行這個指令碼。

EVAL 命令也會將指令碼新增到指令碼快取中,但是它會立即對輸入的指令碼進行求值。

如果給定的指令碼已經在快取裡面了,那麼不執行任何操作。

在指令碼被加入到快取之後,通過 EVALSHA 命令,可以使用指令碼的 SHA1 校驗和來呼叫這個指令碼。

指令碼可以在快取中保留無限長的時間,直到執行 SCRIPT FLUSH 為止。

關於使用 Redis 對 Lua 指令碼進行求值的更多資訊,請參見 EVAL 命令。

例項

  1. redis 127.0.0.1:6379> SCRIPT LOAD "return 1"
  2. "e0e1f9fabfc9d4800c877a703b823ac0578ff8db"

4.Script Flush 

Redis Script Flush 命令用於清除所有 Lua 指令碼快取。

語法

redis Script Flush 命令基本語法如下:

  1. redis 127.0.0.1:6379> SCRIPT FLUSH

總是返回 OK

例項

  1. redis 127.0.0.1:6379> SCRIPT FLUSH
  2. 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