Redis進階之使用Lua腳本自定義Redis命令

1.在Redis中使用Lua

在Redis中執行Lua腳本有兩種方法:eval和evalsha。html

1.1 eval

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腳本代碼,而後把腳本做爲字符串發送給服務端,服務端會將執行結果返回給客戶端。函數

1.2 evalsha

除了使用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"

2.Lua的RedisAPI

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] 。

3.開發提示

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

本文並無詳細講解如何讀取複雜參數以及結合程序開發,詳細能夠參考個人另外一篇文章:

SpringBoot經過RedisTemplate執行Lua腳本

相關文章
相關標籤/搜索