持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
OpenResty的简单使用
简介
通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台, 中文网站
快速开始
下载 下载地址 具体步骤参考官方文档, 这里我们为了方便直接下载Windows版本的zip包 解压后目录如下, 因为是基于nginx的扩展, 可以看到关于nginx的相关文件
我们将官网上的例子复制到conf文件里的nginx.conf中, 然后双击nginx.exe启动nginx,
然后浏览器访问, 可以看到一个hello world就完成了
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello, world</p>")
}
}
操作redis
下面我们参考lua-resty-redis实现nginx-lua操作redis的简单功能
添加key并设置过期时间 我们改造下参考文档上的demo, 通过http post的方式向redis中添加一些信息
location /testLuaRedisPost {
# json格式数据
default_type application/json;
content_by_lua_block {
local redis = require "resty.redis"
-- 创建redis实例
local red = redis:new()
-- 设置超时时间, 1s
red:set_timeouts(1000, 1000, 1000)
-- 创建连接
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
-- 密码登录
local res, err = red:auth("123456")
if not res then
ngx.say("failed to authenticate: ", err)
return
end
-- 开启body获取功能
ngx.req.read_body()
-- 获取body参数, 返回body字符串
local body_string = ngx.req.get_body_data()
-- 转json
-- local cjson = require("cjson");
-- local jsonStr = cjson.decode(body_string);
-- 向redis添加key
local ok, err = red:set("key", body_string)
if not ok then
ngx.say("failed to set", err)
return
end
-- 设置过期时间
local ok, err = red:expire("key", 30000)
if not ok then
ngx.say("failed to set expire", err)
return
end
-- 添加入连接池, 连接池大小100, 最大空闲时间为10s
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
-- 响应结果
ngx.say("success")
}
}
获取redis key
location /testLuaRedisGet {
default_type application/json;
content_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
red:set_timeouts(1000, 1000, 1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local res, err = red:auth("123456")
if not res then
ngx.say("failed to authenticate: ", err)
return
end
-- 获取url携带参数
args = ngx.req.get_uri_args()
local res, err = red:get(args["key"])
if not res then
ngx.say("failed to get.", err)
return
end
if res == ngx.null then
ngx.say("get key is null.", err)
return
end
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
ngx.say(res)
}
}
其实我们可以看到上面操作redis的步骤其实是一套模板代码, 也就是这一块代码
我们可以参考OpenResty最佳实践的redis二次封装简化使用