當前位置:首頁 » 編程軟體 » redis的lua腳本

redis的lua腳本

發布時間: 2023-04-07 15:18:10

1. redis lua腳本有什麼用

主要用途是: (1)描述界面:WOW和劍網三的界面都是用LUA寫的; (2)溝通引擎:游戲圖形引擎提供了一些介面庫,可以在LUA中調用; (3)伺服器端:有些游戲,例如劍網三,在伺服器端也會大量使用LUA。

2. redis 執行 xxx.luaxxx.lua 腳本如何傳參數。格式是什麼

在Redis中執行Lua腳本有兩種方法:eval和evalsha
1.eval
eval 腳本內容 key個數 key列表 參數列表
如果Lua腳本較長,還可以使用redis-cli-eval直接執行文件。
客戶端如果想執行Lua腳本,首先在客戶端編寫好Lua腳本代碼,然後把腳本作為字元串發送給服務端,服務端會將執行結果返回給客戶端。
2.evalsha
將Lua腳本載入到Redis服務端,得到該腳本的sha1校驗和,evalsha命令使用sha1作為參數可以直接執行對應的Lua腳本,避免每次發送Lua腳本的開銷。這樣客戶端就不需要每次執行腳本內容,而腳本也會常駐在服務端,腳本內容得到了復用。
載入腳本: script load命令可以將腳本內容載入到Redis內存中。
lua的Redis API
lua可以使用redis.call函數實現對Redis的訪問
redis.call(「set」,」hello」,」world」)
redis.call(「get」,」hello」)
除此之外Lua還可以使用redis.pcall函數實現對Redis的調用,redis.call和redis.pcall的不同在於,如果redis.call執行失敗,那麼腳本執行結束會直接返回錯誤,而redis.pcall會忽略錯誤繼續執行腳本。
Lua腳本功能為Redis開發和運維人員帶來的如下三個好處:
1.Lua腳本在Redis中是原子執行的,執行過程中間不會插入其他命令。
2.Lua腳本可以幫助開發和運維人員創造出自己定製的命令,並可以將這些命令常駐在Redis內存中,實現復用的效果。
3.Lua腳本可以將多條命令一次性打包,有效地減少網路開銷。
Redis如何管理Lua腳本
1.script load
此命令用於將Lua腳本載入到Redis內存中
2.script exists
scripts exists sha1 [sha1 …]
此命令用於判斷sha1是否已經載入到Redis內存中
3.script flush
此命令用於清除Redis內存已經載入的所有Lua腳本,在執行script flush後,sha1不復存在。
4.script kill

3. Redis中使用Lua

在一些互聯網項目中,難免會設計到一些原子性操作,例如實時交易量的累加,分布式鎖的實現,那麼採用lua腳本可以幫助我們完成一個原子性的操作

Redis會使用相同的 Lua 解釋器來運行所有命令。Redis 還保證以原子方式執行腳本:在執行腳本時不會執行其他腳本或 Redis 命令。

使用Lua腳本的好處有

基本用法

例如

返回結果

使用Lua實現分布式鎖
加鎖

解鎖

4. Redis 中使用 Lua 腳本

Redis 本身已經提供了豐富的命令,但是直接用來處理一些復雜業務時可能還不夠方便,會有一定的局限性。因此,在 Redis2.6 版本開始提供了對 Lua 腳本的支持,Lua 腳本的使用還是比較廣泛的,比如商品秒殺、分布式鎖等,使用 Lua 腳本可以帶來以下的好處:

為了讓例子更加的貼近實際應用,這里實現一個簡單版的分布式鎖。這里先用 Jedis 操作。

上邊詳細的介紹了分布式鎖的實現過程,以及可能出現的問題,最終,我們決定刪除鎖的操作使用 Lua 腳本實現,對應的腳本如下:

Lua 腳本中執行具體的 Redis 命令,需要使用 redis.call() 方法, KEYS 表示客戶端發起腳本執行命令時攜帶的 Redis key 的一個集合, ARGV 則是其它參數的一個集合,主意下標從1開始。結合我們的業務,這里的 KEYS[1] 則表示 lock , ARGV[1] 則是一個隨機字元串。整個腳本的含義就是,如果客戶端傳遞的 lock 的 value 和 Redis 中存儲的一致,就刪除 lock 。

Lua 腳本的語法還是比較簡單的,具體內容可以自行學習。

前邊的准備工作基本結束了,文章開始說過執行腳本有兩種途徑,下邊我們具體來看:

這里使用 jedis.eval() 發送腳本到 Redis 伺服器執行,後兩個參數分別是 key 的集合,以及 value 參數的集合。

先將腳本以文件形式放到 Redis 里,例如這樣:

然後通過如下命令讓 Redis 伺服器緩存腳本:

script load 命令會在 Redis 伺服器緩存 Lua 腳本,並且腳本內容經過 SHA-1 簽名演算法處理後,會返回腳本內容的 SHA1 校驗和的編碼,然後在端調用時,傳入編碼字元串作為參數,這樣 Redis 伺服器就會執行對應緩存的腳本了,就不用了每次發送具體的腳本內容了。

還有兩個比較有用的命令:

除了使用上邊的命令緩存腳本、生成腳本的 SHA1 校驗和的編碼,還可以使用 Jedis 實現,但最終的 SHA1 編碼內容是不同的:

實際的項目中,可能更多的會在 SpringBoot 項目中整合 Redis,此時執行 Lua 腳本的基本流程如下:

核心的類就是 DefaultRedisScript ,它實現了 RedisScript 介面。 execute() 方法最後一個參數是可變類型的,用來傳遞多個 value 參數。初次執行 execute() 方法時,其內部會自動緩存 Lua 腳本到 Redis 伺服器;同時每次執行腳本時會根據腳本內容自動計算出對應的 SHA1 校驗和的編碼,去匹配、執行緩存的腳本。

具體的 SHA1 校驗和的編碼,可以在 execute() 方法執行後,使用 redisScript.getSha1() 查看。使用 SpringBoot 方式 執行 Lua 腳本生成的 SHA1 校驗和的編碼和前邊直接使用 Jedis 生成的一致。

無論用那種方式在 Redis 中使用 Lua 腳本,其中的原理都是類似的。

5. lua腳本~ Redis調用

參考資料:

redis常見命令

官方調用lua文檔

redis菜鳥教程

lua菜鳥教程

其他:

https://www.cnblogs.com/kaituorensheng/p/11098194.html

https://blog.csdn.net/z69183787/article/details/80266417

一句話,因為要用所以學習簡單粗暴

本次僅學習如何使用redis調用lua腳本(含springboot調用方式),lua腳本如何寫以後有時間在玩。

寫redis鎖時經常使用的一個腳本:

我這里的客戶端用的 windows 的,將准備好的 lua 腳本放在自己指定的文件夾

報錯了!!! why ??? 這個符合eval語法吖?

其實,這裡面有一個問題就是如果想要直接執行文件,就不需要進入 redis-client

當然如果想要在 reids-client 內執行怎麼辦呢?

這里展示部分代碼

將腳本放在 resouces 文件下 lua/unlock.lua

測試代碼:

測試控制台結果。當然也需要在redis-client中檢查下是否是正確的結果

熱點內容
安裝flexlinux 發布:2025-07-15 16:35:47 瀏覽:372
網站模板php 發布:2025-07-15 16:22:47 瀏覽:248
編譯簡譜 發布:2025-07-15 16:16:37 瀏覽:813
編程口是什麼 發布:2025-07-15 16:11:28 瀏覽:497
微博如何從賬號和密碼登錄 發布:2025-07-15 15:59:02 瀏覽:123
解說電影需要哪些硬體配置 發布:2025-07-15 15:56:59 瀏覽:380
ftp快捷鍵搜索文件 發布:2025-07-15 15:51:44 瀏覽:459
蘋果賬號密碼忘了怎麼注銷 發布:2025-07-15 15:30:50 瀏覽:200
自動閱讀掛機腳本 發布:2025-07-15 15:20:18 瀏覽:848
開票人的許可權配置如何選擇 發布:2025-07-15 14:51:22 瀏覽:131