指令碼對於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命令
通過執行redis的eval命令,可以執行一段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...