Redis擴充套件功能之Lua指令碼

2022-09-23 21:51:14 字數 2294 閱讀 2692

指令碼對於unix/linux系統的使用者是再熟悉不過了。lua也是一種輕量小巧的指令碼語言,用標準c語言編寫並以源**形式開放, 其設計目的是為了嵌入應用

程式中,從而為應用程式提供靈活的擴充套件和定製功能。

lua應用場景:遊戲開發、獨立應用指令碼、web應用指令碼、擴充套件和資料庫外掛程式;

nginx上使用lua 實現高併發。

lua乙個應用實現——openrestry:乙個可伸縮的基於nginx的web平台,是在nginx之上整合了lua模組的第三方伺服器。

openrestry是乙個通過lua擴充套件nginx實現的可伸縮的web平台,內部整合了大量精良的lua庫、第三

方模組以及大多數的依賴項。

用於方便地搭建能夠處理超高併發(日活千萬級別)、擴充套件性極高的動態web應用、web服務和動態網

關。功能和nginx類似,就是由於支援lua動態指令碼,所以更加靈活。

openrestry通過lua指令碼擴充套件nginx功能,可提供負載均衡、請求路由、安全認證、服務鑑權、流量控

制與日誌監控等服務。

類似的還有kong(api gateway)、tengine

(阿里)。

下面進入lua指令碼的實戰:

1、建立lua環境

curl -r -o

解壓後執行make && make install。

成功後可以直接通過lua命令進入lua的控制台:    

2、redis對lua的支援

redis通過內建的lua編譯/直譯器,可以使用eval命令對lua指令碼進行求值。

指令碼的命令是原子的,redisserver在執行指令碼命令中,不允許插入新的命令;同時

指令碼的命令可以複製,redisserver在獲得指令碼後不執行,生成標識返回,client根據標識就可以隨時執

行。1)eval命令

通過執行rediseval命令,可以執行一段lua指令碼。

命令說明:

script引數:是一段lua指令碼程式,它會被執行在redis伺服器上下文中,這段指令碼不必(也不應該)

定義為乙個lua函式。

numkeys引數:用於指定鍵名引數的個數。

key [key ...]引數: 從eval的第三個引數開始算起,使用了numkeys個鍵(key),表示在指令碼中

所用到的那些redis鍵(key),這些鍵名引數可以在lua中通過全域性變數keys陣列,用1為基址的形

式訪問( keys[1] , keys[2] ,以此類推)。

arg [arg ...]引數:可以在lua中通過全域性變數ar**陣列訪問,訪問的形式和keys變數類似(

ar**[1] 、 ar**[2] ,諸如此類)。

eval "return " 2 key1 key2 first second

lua指令碼中呼叫redis

命令redis.call():

返回值就是redis命令執行的返回值;

如果出錯,則返回錯誤資訊,不繼續執行。

redis.pcall():

返回值就是redis命令執行的返回值;

如果出錯,則記錄錯誤資訊,繼續執行。

注意事項:

在指令碼中,使用return語句將返回值返回給客戶端,如果沒有return,則返回nil。

2)evalsha

eval 命令要求你在每次執行指令碼的時候都傳送一次指令碼主體(script body)。

redis 有乙個內部的快取機制,因此它不會每次都重新編譯指令碼,不過在很多場合,付出無謂的頻寬來

傳送指令碼主體並不是最佳選擇。

為了減少頻寬的消耗, redis 實現了 evalsha 命令,它的作用和 eval 一樣,都用於對指令碼求值,但

它接受的第乙個引數不是指令碼,而是指令碼的 sha1 校驗和(sum)。

3)script命令

script flush :清除所有指令碼快取。

script exists :根據給定的指令碼校驗和,檢查指定的指令碼是否存在於指令碼快取。

script load :將乙個指令碼裝入指令碼快取,返回sha1摘要,但並不立即執行它。

script kill :殺死當前正在執行的指令碼。

redis整合lua主要是為了效能以及事務的原子性,因為redis

提供的事務功能太差(為提供其自身效能甚至都不提供回滾)。

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

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

Redis指令碼外掛程式之 執行Lua指令碼示例

redis在2.6推出了指令碼功能,允許開發者使用lua語言編寫指令碼傳到redis中執行。使用指令碼的好處如下 在redis客戶端機器上,新建乙個檔案ratelimiting.lua,內容如下 local times redis.call incr keys 1 if times 1 then r...

redis呼叫lua指令碼

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