Redis高階之使用Lua指令碼開發

2021-09-25 09:02:13 字數 1978 閱讀 5122

在redis中執行lua指令碼有兩種方法:eval和evalsha。

eval 指令碼內容 key個數 key列表 引數列表
127.0.0.1:6379> eval 'return "hello " .. keys[1] .. ar**[1]' 1 redis world

"hello redisworld"

此時keys[1]="redis",ar**[1]="world",所以最終的返回結果是"hello redisworld"。

如果lua指令碼較長,還可以使用redis-cli--eval直接執行檔案。

$ redis-cli --eval hello.lua mykey , myar**
注意,這種方式不需要指定key的數量,用 , 號劃分key和arg,注意逗號左右的空格。

eval命令和--eval引數本質是一樣的,客戶端如果想執行lua指令碼,首先在客戶端編寫好lua指令碼**,然後把指令碼作為字串傳送給服務端,服務端會將執行結果返回給客戶端。

除了使用eval,redis還提供了evalsha命令來執行lua指令碼。

首先要將lua指令碼載入到redis服務端,得到該指令碼的sha1校驗和,evalsha命令使用sha1作為引數可以直接執行對應lua指令碼,避免每次傳送lua指令碼的開銷。這樣客戶端就不需要每次執行指令碼內容,而指令碼也會常駐在服務端,指令碼功能得到了復用。

載入指令碼

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會忽略錯誤繼續執行指令碼,所以在實際開發中要根據具體的應用場景進行函式的選擇。

開發提示

lua可以使用redis.log函式將lua指令碼的日誌輸出到redis的日誌檔案中,但是一定要控制日誌級別。 redis3.2提供了lua script debugger功能用來除錯複雜的lua指令碼,具體可以參考:

redis.log(redis.log_debug,key1)
redis.log_debug

redis.log_verbose

redis.log_notice

redis.log_warning

四 redis的高階功能之Lua指令碼

lua是一種輕量級指令碼語言,它是用c語言編寫的,跟資料的儲存過程有點類似。我們使用lua指令碼來執行redis命令的好處 上一章我介紹了redis的事務,其中如果在exec之前出現執行命令錯誤,例如語法錯誤,這個時候整個佇列都不會執行 如果在exec之後出現執行命令錯誤,例如hash語法操作str...

Redis使用lua指令碼

版本 自2.6.0起可用。時間複雜度 取決於執行的指令碼。使用lua指令碼的好處 命令格式 eval script numkeys key key arg arg 說明 簡單例項 127.0.0.1 6379 eval return ar 1 0 100 100 127.0.0.1 6379 eva...

Redis使用lua指令碼

版本 自2.6.0起可用。時間複雜度 取決於執行的指令碼。使用lua指令碼的好處 命令格式 copy eval script numkeys key key arg arg 說明 簡單例項 copy 127.0.0.1 6379 eval return ar 1 0 100 100 127.0.0....