OpenResty使用Lua筆記

文章目錄

  • 一、基礎
    • 1、常用
    • 2、使用局部變量
    • 3、模塊化
  • 二、性能提升
    • 1、使用fft調用shell
    • 2、不要在循環中拼接字符串
    • 3、不要頻繁修改table
    • 4、不要在table中用nil
    • 5、做好異常處理
    • 6、ngx.var 的性能提升
  • 三、拓展
    • 1、加載字符串為動態方法

一、基礎

1、常用

OpenResty 中文官網:https://openresty.org/cn/

包管理:https://opm.openresty.org/

(1)Lua 的下標從 1 開始

(2)使用 … 來拼接字符串

2、使用局部變量

在 Lua 中,變量默認是全局的,會被放到名為 _G 的 table 中。不加 local 的變量會在全局表中查找,這是昂貴的操作。如果再加上一些變量名的拼寫錯誤,就會造成難以定位的 bug。

建議總是使用 local 來聲明變量,即使在 require module 的時候也是一樣:

-- Recommended 
local xxx = require('xxx')-- Avoid
require('xxx')local ngx_re = require "ngx.re"
local ngx = require "ngx"
--No
local function foo()local ok, err = ngx.timer.at(delay, handler)
end--Yes
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end
-- 為了風格的統一,require 和 ngx 也需要 local 化:
--No
local core = require("apisix.core")
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end--Yes
local ngx = ngx
local require = require
local core = require("apisix.core")
local timer_at = ngx.timer.atlocal function foo()local ok, err = timer_at(delay, handler)
end

3、模塊化

-- hello.lua定義一個對象,并返回
local _M = {}_M.color = {red = 1,blue = 2,green = 3}return _M
location / {content_by_lua_block {-- 引入hello,并用一個變量接收,這個變量就可以調用對象的方法和變量了local hello = require "hello"ngx.say(hello.color.green)}
}

二、性能提升

1、使用fft調用shell

-- 不要用阻塞的lua語法
os.execute("kill -HUP " .. pid) 
os.execute(" cp test.exe /tmp ")
os.execute(" openssl genrsa -des3 -out private.pem 2048 ")-- 使用lua-resty-signal 這個 OpenResty 自帶的庫
local resty_signal = require "resty.signal"
local pid = 12345
local ok, err = resty_signal.kill(pid, "KILL")-- 使用基于 ngx.pipe 的 lua-resty-shell 庫
$ resty -e 'local shell = require "resty.shell"
local ok, stdout, stderr, reason, status =shell.run([[echo "hello, world"]])ngx.say(stdout) '

2、不要在循環中拼接字符串

-- 不要在循環中拼接字符串
$ resty -e 'local begin = ngx.now()
local s = ""
-- for 循環,使用 .. 進行字符串拼接
for i = 1, 100000 dos = s .. "a"
end
ngx.update_time()
print(ngx.now() - begin)
'-- 用table進行優化
$ resty -e 'local begin = ngx.now()
local t = {}
-- for 循環,使用數組來保存字符串,自己維護數組的長度
for i = 1, 100000 dot[i] = "a"
end
local s =  table.concat(t, "")
ngx.update_time()
print(ngx.now() - begin)
'-- 或者自己定義數組索引
$ resty -e 'local begin = ngx.now()
local t = {}
local index = 1
for i = 1, 100000 dot[index] = "a"index = index + 1
end
local response = table.concat(t, "")
ngx.say(response)
'

3、不要頻繁修改table

-- 預先創建table,然后增刪改,性能是很差的,原因在于每次新增和刪除數組元素的時候,都會涉及到數組的空間分配、resize 和 rehash。
local t = {}
local color = {first = "red", "blue", third = "green", "yellow"}-- 如果涉及對table的頻繁修改,考慮初始化table的容量,這樣就不需要使用table.insert等方法,直接通過下標設置值即可
-- table.new(narray, nhash) 兩個參數分別代表table里是array還是hash的 
-- table.new(10, 0) 或者 table.new(0, 10) 這樣的,后者是 hash 性質的 table
local new_tab = require "table.new"
local t = new_tab(100, 0)
for i = 1, 100 dot[i] = i
end-- 可以考慮對table進行重用
-- 用 table.new(narray, nhash) 生了一個長度為 100 的數組,clear 后,長度還是 100。
-- table.clear方法就是將table所有的內容設為了nil
local ok, clear_tab = pcall(require, "table.clear")if not ok thenclear_tab = function (tab)for k, _ in pairs(tab) dotab[k] = nilendendend

4、不要在table中用nil

-- 一定不要在數組中使用 nil:
--No
local t = {1, 2, nil, 3}-- 如果一定要使用空值,請用 ngx.null 來表示:
--Yes
local t = {1, 2, ngx.null, 3}

5、做好異常處理

對于有錯誤信息返回的函數,我們必須對錯誤信息進行判斷和處理:

--No
local sock = ngx.socket.tcp()
local ok = sock:connect("www.baidu.com", 80)
ngx.say("successfully connected to baidu!")--Yes
local sock = ngx.socket.tcp()
localok, err = sock:connect("www.google.com", 80)
if not ok thenngx.say("failed to connect to google: ", err)return
end
ngx.say("successfully connected to google!")

而如果是自己編寫的函數,錯誤信息要作為第二個參數,用字符串的格式返回:

--No
local function foo()local ok, err = func()if not ok thenreturn falseendreturn true
end--No
local function foo()local ok, err = func()if not ok thenreturn false, {msg = err}endreturn true
end--Yes
local function foo()local ok, err = func()if not ok thenreturn false, "failed to call func(): " .. errendreturn true
end

6、ngx.var 的性能提升

ngx.var 是一個性能損耗比較大的操作,在實際使用時,我們需要用 ngx.ctx 來做一層緩存

-- lua-var-nginx-module模塊,性能比起ngx.var 提升了 5 倍。它采用的是 FFI 的方式,所以,你需要在編譯 OpenResty 的時候,先加上編譯選項
./configure --prefix=/opt/openresty \--add-module=/path/to/lua-var-nginx-module-- 然后,使用 luarocks 的方式來安裝 lua 庫:
luarocks install lua-resty-ngxvar-- 這里調用的方法也很簡單,只需要一行 fetch 函數的調用就可以了。它的效果完全等價于原有的 ngx.var.remote_addr,來獲取到終端的 IP 地址:
content_by_lua_block {local var = require("resty.ngxvar")ngx.say(var.fetch("remote_addr"))
}

三、拓展

1、加載字符串為動態方法

可以把 s 這個包含函數的字符串,改成可以由用戶指定的形式,并加上執行它的條件,這樣其實就是 FaaS 的原型了。

resty -e 'local s = [[return function()ngx.say("hello world")
end
]]
local  func1 = loadstring(s)
local ret, func = pcall(func1)
func()'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45965.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Open3D 最小二乘法擬合點云平面

目錄 一、概述 1.1最小二乘法原理 1.2實現步驟 1.3應用場景 二、代碼實現 2.1關鍵函數 2.2完整代碼 三、實現效果 3.1原始點云 3.2matplotlib可視化 3.3平面擬合方程 前期試讀,后續會將博客加入該專欄,歡迎訂閱 Open3D點云算法與點云深度學習…

【學術會議征稿】第四屆人工智能、虛擬現實與可視化國際學術會議(AIVRV 2024)

第四屆人工智能、虛擬現實與可視化國際學術會議(AIVRV 2024) 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 第四屆人工智能、虛擬現實與可視化國際學術會議(AIVRV 2024)將…

用python寫一個爬蟲,爬取google中關于蛇的照片

為了爬取Google中關于蛇的照片,我們可以利用Python中的第三方庫進行網頁解析和HTTP請求。請注意,這種爬取行為可能違反Google的使用條款,因此建議在合法和允許的情況下使用。以下是一個基本的Python爬蟲示例,使用Requests庫發送HT…

git 指令速查

1. 創建命令 Create Git 指令命令說明git clone 克隆遠程倉庫git init初始化本地 git 倉庫(即創建新的本地倉庫)2. 本地更改 Local Changes Git 指令命令說明git status查看當前分支狀態git diff查看已跟蹤文件的變更git add 將指定的文件添加到暫存區git add .將所有有變更的…

簡約唯美的404HTML源碼

源碼介紹 簡約唯美的404HTML源碼,很適合做網站錯誤頁,將下面的源碼放到一個空白的html里面,然后上傳到服務器里面即可使用 效果預覽 完整源碼 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…

第二證券:市場估值依然處于較低區域 適合中長期布局

A股中報成績預告顯示相比2024Q1&#xff0c;2024Q2企業產品銷量或訂單已有回暖&#xff0c;但價格反轉暫未大面積到來&#xff0c;“量增價平、部分板塊以價換量”是2024H1 A股成績預告較顯著的量價特征&#xff0c;這與微觀庫存周期有待回暖相匹配。此外中游部分環節出現不同程…

Vue 3中使用 Lottie 動畫

一、Lottie動畫簡介 Lottie是由Airbnb開源的面向Android、iOS、Web和Windows的動畫庫,開發者可以使用它在Web、iOS、Android等平臺上實現高性能的體驗豐富的矢量動畫。 在早期的前端開發中,Flash是網頁動畫之王,不過它的規范約束隨意,造成很多時設計出來的產品都無法符合…

新版網頁無插件H.265播放器EasyPlayer.js如何測試demo視頻?

H5無插件流媒體播放器EasyPlayer屬于一款高效、精煉、穩定且免費的流媒體播放器&#xff0c;可支持多種流媒體協議播放&#xff0c;支持H.264與H.265編碼格式&#xff0c;性能穩定、播放流暢&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

富格林:直面暗箱減少出金虧損

富格林悉知&#xff0c;在交易的過程中&#xff0c;投資者就算做好了十足的把握&#xff0c;也難免會出現出金虧損的情況。在這里建議新手投資者&#xff0c;在準備投資交易的時候&#xff0c;一定要做好充分的準備工作&#xff0c;了解黃金投資哪些暗箱陷阱&#xff0c;同時學…

【Linux】進程信號 --- 信號產生

&#x1f466;個人主頁&#xff1a;Weraphael ?&#x1f3fb;作者簡介&#xff1a;目前正在學習c和算法 ??專欄&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起進步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指點一二 如果文章對…

【轉型Web3開發第二課】Dapp開發入門基礎 | 02 | MetaMask配置網絡

本文首發于公眾號&#xff1a;Keegan小鋼 前言 完成了《轉型 Web3 開發第一課》之后&#xff0c;得到了不少讀者的認可&#xff0c;很多都在問什么時候開始下一課&#xff0c;近期終于抽出了時間開始搞起這第二課。 這第二課的主題為「Dapp開發入門基礎」&#xff0c;即想要轉…

淺談Visual Studio 2022

Visual Studio 2022&#xff08;VS2022&#xff09;提供了眾多強大的功能和改進&#xff0c;旨在提高開發者的效率和體驗。以下是一些關鍵功能的概述&#xff1a;12 64位支持&#xff1a;VS2022的64位版本不再受內存限制困擾&#xff0c;主devenv.exe進程不再局限于4GB&#xf…

【ffmpeg命令入門】重新編碼媒體流、設置碼率、設置幀速率

文章目錄 前言ffmpeg的描述重新編碼媒體流重新編碼媒體流的命令ffmpeg支持的媒體流 設置視頻碼率視頻碼率是什么設置視頻的碼率 設置文件幀數率幀數率是什么ffmpeg設置幀數率 總結 前言 在數字媒體處理領域&#xff0c;ffmpeg是一款非常強大的工具&#xff0c;它可以用來進行媒…

在線生成privacy-policy和 service-agreement

生成ppsa 網站 下面兩個是要收費的 局部功能可用 #1 Privacy Policy Generator - Privacy Policieshttps://termify.io/ 下面這個網站 創建一個是免費的 如果想要privacy-policy和 service-agreement 需要創建兩個賬戶 Termly

Java學習|JSON 處理庫:Gson、FastJson、Jackson的比較與使用指南

文章目錄 一、Gson簡介與使用注意事項1.1 簡介1.2 使用注意事項1.3 代碼示例序列化反序列化 二、FastJson簡介與使用注意事項2.1 簡介2.2 使用注意事項2.3 代碼示例序列化反序列化 三、Jackson簡介與使用注意事項3.1 簡介3.2 使用注意事項3.3 代碼示例序列化反序列化 四、關聯和…

svn不能記住密碼,反復彈出GNOME,自動重置svn.simple文件

1. 修改文件 打開 ~/.subversion/auth/svn.simple/xxx 更新前 K 15 svn:realmstring V 32 xxxxx //svn 地址&#xff0c;庫的地址 K 8 username V 4 xxx //用戶名 END在頂部插入下面內容&#xff0c; 注意&#xff0c;如果密碼不對&#xff0c;則文件文法正常生效 更新后…

37、PHP 實現一個鏈表中包含環,請找出該鏈表的環的入口結點

題目&#xff1a; 題目描述 PHP 實現一個鏈表中包含環&#xff0c;請找出該鏈表的環的入口結點。 描述&#xff1a; 一個鏈表中包含環&#xff0c;請找出該鏈表的環的入口結點。 <?php /*class ListNode{var $val;var $next NULL;function __construct($x){$this->v…

自動駕駛車道線檢測系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目錄 1. 摘要概述2. 背景介紹3. 方法3.1 俯視圖投影3.2 網絡結構3.2.1 投影變換層3.2.2 投影變換層3.2.3 道路投影預測分支 3.3 車道預測頭3.4 訓練和真實值關聯 4. 實驗4.1 合成 3D 車道數據集4.2 真實世界 3D 車道數據集4.3 評估結果4.4 評估圖像僅車道檢測 5. 總結和討論…

windows下gcc編譯C、C++程序 MinGW編譯器

文章目錄 1、概要2、MinGW安裝2.1 編譯器下載2.2 編譯器安裝2.3 設置環境變量2.4 查看gcc版本信息 3、編譯C、C程序3.1 編寫Hello World.c3.2 編譯C程序3.3 運行程序3.4 編譯C程序 1、概要 GCC原名為GNU C語言編譯器&#xff08;GNU C Compiler&#xff09;&#xff0c;只能處…

SpringBoot 實現整合kafka的簡單使用

1、引入kafka的依賴 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId></dependency>2、配置kafka spring:kafka:bootstrap-servers: 156.65.20.76:9092,156.65.20.…