Lua指令碼實現Redis組合操作的原子性

2021-10-09 13:17:29 字數 1182 閱讀 8492

我們一定會在專案中遇到過這種場景:一段**中,redis進行多次取值存值,雖然單個redis操作具有原子性,但是redis組合操作就不能保證整體的原子性了,這時候我們可以通過lua指令碼來實現redis組合操作的原子性。

lua指令碼能夠保證redis所有操作的原子性,但是需要注意,lua指令碼中的命令如果有失敗的命令,lua指令碼不會回滾,例如有3條插入語句,第一條執行沒報錯,第二條執行報錯了,那麼第一條語句就會插入到redis中。

下面以springboot中使用lua指令碼為例,可以參考下面的使用方法

引入依賴

org.springframework.boot<

/groupid>

spring-boot-starter-data-redis<

/artifactid>

<

/dependency>

編寫配置類

其中」demo.lua」是指令碼所在的位置,參考第3步中的位置。

defaultredisscript.setresulttype根據返回值型別的結果自定義,比如可以是string.class。

編寫lua指令碼,下面是乙個簡單的lua指令碼檔案demo.lua。將新建的lua指令碼放到resources目錄下即可

**中使用

直接在controller中使用即可。

redistemplate.execute方法的第三個引數,如果傳字串,lua指令碼的local expire收到的結果是「100」,注意是帶著引號的,所以在tonumber(expire)結果是nil,轉化失敗,所以,需要在**裡傳參的時候,傳成數字格式的100,失效時間單位是秒。下圖是錯誤示範,**中需要將args的100由string型別替換成integer型別。

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