Redis中快取Lua 指令碼

2021-10-24 22:03:09 字數 1637 閱讀 8033

為什麼要快取

在指令碼比較長的情況下,如果每次呼叫指令碼都需要把整個指令碼傳給redis 服務端,會產生比較大的網路開銷。為了解決這個問題,redis 提供了evalsha 命令,允許開發者通過指令碼內容的sha1 摘要來執行指令碼。

如何快取

redis 在執行script load 命令時會計算指令碼的sha1 摘要並記錄在指令碼快取中,執行evalsha 命令時redis 會根據提供的摘要從指令碼快取中查詢對應的指令碼內容,如果找到了則執行指令碼,否則會返回錯誤:"noscript no matching script. please use eval."

127.0.0.1:6379> script load "return 'hello world'"

"470877a599ac74fbfda41caa908de682c5fc7d4b"

127.0.0.1:6379> evalsha "470877a599ac74fbfda41caa908de682c5fc7d4b" 0

"hello world"

自乘案例

redis 有incrby 這樣的自增命令,但是沒有自乘,比如乘以3,乘以5。

我們可以寫乙個自乘的運算,讓它乘以後面的引數:

local curval = redis.call("get", keys[1])

if curval == false then

curval = 0

else

curval = tonumber(curval)

endcurval = curval * tonumber(ar**[1])

redis.call("set", keys[1], curval)

return curval

把這個指令碼變成單行,語句之間使用分號隔開

local curval = redis.call("get", keys[1]); if curval == false then curval = 0 else curval = tonumber(curval) end; curval

= curval * tonumber(ar**[1]); redis.call("set", keys[1], curval); return curval

script load '命令'

127.0.0.1:6379> script load 'local curval = redis.call("get", keys[1]); if curval == false then curval = 0 else curval =

tonumber(curval) end; curval = curval * tonumber(ar**[1]); redis.call("set", keys[1], curval); return curval'

"be4f93d8a5379e5e5b768a74e77c8a4eb0434441"

呼叫:127.0.0.1:6379> set num 2

ok127.0.0.1:6379> evalsha be4f93d8a5379e5e5b768a74e77c8a4eb0434441 1 num 6

(integer) 12

redis呼叫lua指令碼

在redis中很多基本操作都是原子操作 但是缺少事務的概念,所幸的是redis支援lua指令碼,可以利用lua指令碼實現事務特性 執行比 較對應key值大小,更新較大值 的lua指令碼 param key param time return public object updatehigherint...

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指令碼

redis 提供了非常豐富的指令集,但是使用者依然不滿足,希望可以自定義擴充若干指令來完成一些特定領域的問題。redis 為這樣的使用者場景提供了 lua 指令碼支援,使用者可以向伺服器傳送 lua 指令碼來執行自定義動作,獲取指令碼的響應資料。redis 伺服器會單執行緒原子性執行 lua 指令碼...