lua是什么
Lua 是一個小巧的腳本語言。它是巴西里約熱內盧天主教大學( Pontifical CatholicUniversity of Rio de Janeiro)里的一個由Roberto Ierusalimschy、Waldemar Celes 和Luiz Henrique de Figueiredo三人所組成的研究小組於1993年開發的。 其設計目的是為了通過靈活嵌入應用程序中從而為應用程序提供靈活的擴展和定制功能。Lua由標准C編寫而成,幾乎在所有操作系統和平台上都可以編譯,運行。Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能。
簡單來說:
Lua 是一種輕量小巧的腳本語言,用標准C語言編寫並以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
lua 語言具有以下特性
-
支持面向過程 (procedure-oriented)編程和函數式編程(functional programming);
-
自動內存管理;只提供了一種通用類型的表( table),用它可以實現數組,哈希表,集合,對象;
-
語言內置模式匹配;閉包 (closure);函數也可以看做一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持;
-
通過閉包和 table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等。
應用場景
游戲開發
獨立應用腳本
Web 應用腳本
擴展和數據庫插件如: MySQL Proxy 和 MySQL WorkBench
安全系統,如入侵檢測系統
redis 中嵌套調用實現類似事務的功能
web 容器中應用處理一些過濾 緩存等等的邏輯,例如nginx。
lua的安裝
有linux版本的安裝也有mac版本的安裝。。我們采用linux版本的安裝,首先我們准備一個linux虛擬機。
安裝步驟,在linux系統中執行下面的命令。
yum install ‐y gcc
yum install libtermcap‐devel ncurses‐devel libevent‐devel readline‐devel
curl ‐R ‐O http://www.lua.org/ftp/lua‐5.3.5.tar.gz
tar ‐zxf lua‐5.3.5.tar.gz
cd lua‐5.3.5
make linux test
make install
我之前也簡單的寫過lua的博客,常用的語法,有興趣的可以看看。
OpenResty介紹
OpenResty(又稱:ngx_openresty) 是一個基於 NGINX 的可伸縮的 Web 平台,由中國人章亦春發起,提供了很多高質量的第三方模塊。
OpenResty 是一個強大的 Web 應用服務器,Web 開發人員可以使用 Lua 腳本語言調動Nginx 支持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以 快速構造出足以勝任 10K 乃至1000K以上並發連接響應的超高性能 Web 應用系統。360,UPYUN,阿里雲,新浪,騰訊網,去哪兒網,酷狗音樂等都是 OpenResty 的深度用戶。
OpenResty 簡單理解,就相當於封裝了nginx,並且集成了LUA腳本,開發人員只需要簡單的其提供了模塊就可以實現相關的邏輯,而不再像之前,還需要在nginx中自己編寫lua的腳本,再進行調用了。
OpenResty安裝
linux安裝openresty:
安裝nginx
默認已經安裝好了nginx,在目錄:/usr/local/openresty/nginx 下。
修改/usr/local/openresty/nginx/conf/nginx.conf ,將配置文件使用的根設置為root,目的就是將來要使用lua腳本的時候 ,直接可以加載在root下的lua腳本。
實現思路:
定義請求:用於查詢數據庫中的數據更新到redis中。
(1)連接mysql ,按照廣告分類ID讀取廣告列表,轉換為json字符串。
(2)連接redis,將廣告列表json字符串存入redis 。
在/root/lua目錄下創建ad_load.lua ,實現連接mysql 查詢數據 並存儲到redis中
[root@localhost ~]# cat /root/lua/ad_load.lua
ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson")
local mysql = require("resty.mysql")
local uri_args = ngx.req.get_uri_args()
local user_id = uri_args["user_id"]
local db = mysql:new()
db:set_timeout(1000)
local props = {
host = "192.168.1.104",
port = 3306,
database = "user_db",
user = "root",
password = "root"
}
local res = db:connect(props)
local select_sql = "select * from t_user where user_id="..user_id
res = db:query(select_sql)
db:close()
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="192.168.1.104"
local port = 6379
red:connect(ip,port)
red:set("id_"..user_id,cjson.encode(res))
red:close()
ngx.say("{\"flag\":true,\"user_id\":\""..user_id.."\"}")
[root@localhost ~]#
修改/usr/local/openresty/nginx/conf/nginx.conf文件:
代碼如下:
測試,發送請求: