在Redis中執行Lua腳本有兩種方法:eval和evalsha。html
eval 腳本內容 key個數 key列表 參數列表
下面例子使用了key列表和參數列表來爲Lua腳本提供更多的靈活性:java
127.0.0.1:6379> eval 'return "hello " .. KEYS[1] .. ARGV[1]' 1 redis world "hello redisworld"
此時KEYS[1]="redis",ARGV[1]="world",因此最終的返回結果是"hello redisworld"。redis
若是Lua腳本較長,還可使用redis-cli--eval直接執行文件。shell
$ redis-cli --eval hello.lua mykey , myargv
注意,這種方式不須要指定key的數量,用 , 號劃分key和arg,注意逗號左右的空格。api
eval命令和--eval參數本質是同樣的,客戶端若是想執行Lua腳本,首先在客戶端編寫好Lua腳本代碼,而後把腳本做爲字符串發送給服務端,服務端會將執行結果返回給客戶端。函數
除了使用eval,Redis還提供了evalsha命令來執行Lua腳本。lua
首先要將Lua腳本加載到Redis服務端,獲得該腳本的SHA1校驗和,evalsha命令使用SHA1做爲參數能夠直接執行對應Lua腳本,避免每次發送Lua腳本的開銷。這樣客戶端就不須要每次執行腳本內容,而腳本也會常駐在服務端,腳本功能獲得了複用。3d
script load命令能夠將腳本內容加載到Redis內存中,例以下面將lua_get.lua加載到Redis中,獲得SHA1爲:"7413dc2440db1fea7c0a0bde841fa68eefaf149c"調試
$ redis-cli script load "$(cat lua_get.lua)" "7413dc2440db1fea7c0a0bde841fa68eefaf149c"
evalsha的使用方法以下,參數使用SHA1值,執行邏輯和eval一致。日誌
evalsha 腳本SHA1值 key個數 key列表 參數列表
因此只須要執行以下操做,就能夠調用lua_get.lua腳本:
127.0.0.1:6379> evalsha 7413dc2440db1fea7c0a0bde841fa68eefaf149c 1 redis world "hello redisworld"
Lua可使用redis.call函數實現對Redis的訪問,例以下面代碼是Lua使用redis.call調用了Redis的set和get操做:
redis.call("set", "hello", "world") redis.call("get", "hello")
放在Redis的執行效果以下:
127.0.0.1:6379> eval 'return redis.call("get", KEYS[1])' 1 hello "world"
除此以外Lua還可使用redis.pcall函數實現對Redis的調用,redis.call和redis.pcall的不一樣在於,若是redis.call執行失敗,那麼腳本執行結束會直接返回錯誤,而redis.pcall會忽略錯誤繼續執行腳本,因此在實際開發中要根據具體的應用場景進行函數的選擇。
獲取KEY能夠經過 KEYS[1],獲取 Value 能夠經過 ARGV[1] 。
Lua可使用redis.log函數將Lua腳本的日誌輸出到Redis的日誌文件中,可是必定要控制日誌級別。
Redis3.2提供了Lua Script Debugger功能用來調試複雜的Lua腳本,具體能夠參考:http://redis.io/topics/ldb。
redis.log(redis.LOG_DEBUG,key1)
redis.LOG_DEBUG
redis.LOG_VERBOSE
redis.LOG_NOTICE
redis.LOG_WARNING
本文並無詳細講解如何讀取複雜參數以及結合程序開發,詳細能夠參考個人另外一篇文章: