標籤:
Redis 2.6.0 內建的Lua Script支援,可以在Redis的Server端一次運行大量邏輯。
- 整個Script預設是在一個事務裡的。
- Script裡涉及的所有Key盡量用變數,從外面傳入,使Redis一開始就知道你要改變哪些key。
- EVAL每次傳輸一整段Script比較費頻寬,可以先用SCRIPT LOAD載入script,返回雜湊值。然後用EVALHASH執行。
- 內建的LUA庫裡還很貼心的帶了CJSON,可以處理JSON字串。
參考:http://www.searchdatabase.com.cn/showcontent_70423.htm
redis中執行lua的命令用eval、evalsha、 script load
http://redis.readthedocs.org/en/latest/script/index.html
Redis 的 EVAL 命令 參數說明如下:
EVAL script numkeys key [key ...] arg [arg ...]
script 參數是一段 Lua 5.1 指令碼程式,它會被運行在 Redis 伺服器上下文中,這段指令碼不必(也不應該)定義為一個 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],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
其中 "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 是被求值的 Lua 指令碼,數字 2 指定了鍵名參數的數量, key1 和 key2 是鍵名參數,分別使用 KEYS[1] 和 KEYS[2] 訪問,而最後的 first 和 second 則是附加參數,可以通過 ARGV[1] 和 ARGV[2] 訪問它們。
參考:http://redis.readthedocs.org/en/latest/script/eval.html
SCRIPT LOAD script
將指令碼 script 添加到指令碼緩衝中,但並不立即執行這個指令碼。
EVAL 命令也會將指令碼添加到指令碼緩衝中,但是它會立即對輸入的指令碼進行求值。
如果給定的指令碼已經在緩衝裡面了,那麼不做動作。
在指令碼被加入到緩衝之後,通過 EVALSHA 命令,可以使用指令碼的 SHA1 校正和來調用這個指令碼。
指令碼可以在緩衝中保留無限長的時間,直到執行 SCRIPT FLUSH 為止。
redis> SCRIPT LOAD "return ‘hello moto‘""232fd51614574cf0867b83d384a5e898cfd24e5a"redis> EVALSHA 232fd51614574cf0867b83d384a5e898cfd24e5a 0"hello moto"
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
根據給定的 sha1 校正碼,對緩衝在伺服器中的指令碼進行求值。
將指令碼緩衝到伺服器的操作可以通過 SCRIPT LOAD 命令進行。
這個命令的其他地方,比如參數的傳入方式,都和 EVAL 命令一樣。
Redis 的 Lua 指令碼支援