10、lua相关知识
10.1 lua和idea的整合
1、 创建idea工程
2、下载emmylua插件
3、创建lua包并创建lua file
运行过程中可能出现的错误,没有配置lua.exe解析器
配置方式:
run —>Edit configgurations
10.2 lua数据类型与变量
Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。
nil : 表示一个无效值,有点类似java的null
boolean: false和true
number: 双精度类型的实浮点数
string: 字符串,双引号和单引号都可表示
function: 函数
userdata: 任意存储在变量中的C数据结构
thread: 执行的独立路线,用于执行协同程序
table: 其实是一个关联数组,数组的索引可以是数字或者是字符串。
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束。
变量的默认值均为 nil。
10.3 lua 运算符
– 赋值运算符
– 算数运算符
– 关系运算符
– 逻辑运算符
– 其他运算符
参考lua菜鸟编程:https://www.runoob.com/lua/lua-tutorial.html
11 OpenResty入门案例
这里使用的openresty版本是1.13,content_by_lua 改成
了 content_by_lua_block;openresty 1.9.3.1 及以下版本,请使用 content_by_lua 命令
第一个案例:
1、在Nginx的配置文件nginx.cof中添加一下信息,然后重新执行nginx -s reload
location / {
#root html;
#index index.html index.htm;
default_type text/html;
content_by_lua_block {
ngx.say("hello world")
}
这里的location只能写一个,不然会报错,就直接用自带的location就行,把下面加进去即可
2、 我们也可以使用content_by_lua_file 来引入一个lua文件
location / {
#root html;
#index index.html index.htm;
default_type text/html;
content_by_lua_file /opt/apps/openresty/nginx/conf/my.lua;
}
创建my.lua文件并输入如下代码:ngx.say(“hello nginx, hello lua”)
11.2获取http请求信息
获取uri参数
获取uri有两个方法:ngx.req.get_uri_args、ngx_req.get_post_args
举例:
– 获取get请求参数
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say("[GET ] key:", k, " v:", v);
end
– 获取post请求时 请求参数
ngx.req.read_body() -- 解析post参数之前一定要先读取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
ngx.say("[POST] key:", k, " v:", v)
end
获取post请求是可以在线模拟
获取header
– 获取header
local headers = ngx.req.get_headers()
for k,v in pairs(headers) do
ngx.say("[header] name:", k, " v:", v)
ngx.say("<br />")
end
获取body
– 获取body信息
local data = ngx.req.get_body_data()
ngx.say(data)
11.3 操作Redis
[hadoop@slave1 openresty]$ cd lualib/
[hadoop@slave1 lualib]$ mkdir luatest
[hadoop@slave1 luatest]$ vi DemoRedistest.lua
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 sec
local ok, err = red:connect("192.168.140.151", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
-- 请注意这里 auth 的调用过程,如果Redis设置密码,才需要写这些代码
local count
count, err = red:get_reused_times()
if 0 == count then
ok, err = red:auth("admin")
if not ok then
ngx.say("failed to auth: ", err)
return
end
elseif err then
ngx.say("failed to get reused times: ", err)
return
end
ok, err = red:set("qf", "good school")
if not ok then
ngx.say("failed to set qf: ", err)
return
end
ngx.say("set result: ", ok)
-- 连接池大小是100个,并且设置最大的空闲时间是 10 秒
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
然后修改nginx下面的nginx.conf文件
重新加载 sbin/nginx -s reload 刷新slave1:80网页
结果如下: