在使用OpenResty处理请求时,除了读取URL参数和Header,有时还需要从Redis中获取Token、限流计数或路由规则,也可能需要查询MySQL中的配置数据。通过Lua脚本连接Redis和MySQL后,就可以在请求处理阶段完成数据读取和业务判断。
一、连接Redis
首先引入resty.redis模块,创建Redis客户端并设置连接超时时间。
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("failed to connect redis: ", err)
return
end
local res, err = red:get("token:demo")
if not res then
ngx.say("failed to get redis key: ", err)
return
end
ngx.say(res)
上面的代码连接本机6379端口上的Redis,并读取token:demo这个键的值。如果连接失败或读取数据失败,脚本会输出错误信息并结束当前请求。
实际使用时,还可以在读取结果后判断Token是否存在,再根据结果返回不同内容。
二、使用Redis连接池
请求结束后,可以将Redis连接放回连接池,供后续请求继续使用,减少频繁创建连接带来的开销。
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.log(ngx.ERR, "redis keepalive failed: ", err)
end
其中,10000表示连接空闲超时时间,单位为毫秒;100表示连接池允许保存的最大空闲连接数。
在完成Redis读取操作后再执行连接复用。对于访问量较高的接口,连接池可以减少重复建立TCP连接的开销。
三、连接MySQL
连接MySQL时,需要引入resty.mysql模块,并设置数据库连接参数。
local mysql = require "resty.mysql"
local db, err = mysql:new()
if not db then
ngx.say("failed to create mysql client: ", err)
return
end
db:set_timeout(1000)
local ok, err = db:connect {
host = "127.0.0.1",
port = 3306,
database = "test",
user = "root",
password = "password"
}
if not ok then
ngx.say("failed to connect mysql: ", err)
return
end
local res, err = db:query("select now() as now")
if not res then
ngx.say("failed to query mysql: ", err)
return
end
ngx.say(require("cjson").encode(res))
这段代码连接本机MySQL的3306端口,并查询当前数据库时间。查询结果通过cjson编码为JSON格式后返回。
生产环境中不建议直接把数据库账号和密码写在公开脚本中,可以通过受限配置文件或环境变量管理连接信息。同时,SQL语句应尽量使用参数化方式,避免将用户输入直接拼接到查询语句中。
四、生产环境使用建议
Redis和MySQL连接都必须设置超时时间,避免后端服务异常时,请求长时间等待。
对于访问频率较高、变化不频繁的数据,可以优先放入OpenResty的lua_shared_dict缓存中,减少每个请求都访问Redis或MySQL的次数。
数据库账号不要使用root,建议单独创建权限受限的账号。如果脚本只负责读取配置,可以创建只读账号,限制其访问范围。
同时,Redis和MySQL连接完成后,应根据实际场景使用连接池,避免每次请求都重新建立连接。涉及Token校验、限流计数和路由配置时,还需要对连接失败、查询失败和空结果分别处理,不能只判断请求是否进入Lua脚本。
五、总结
OpenResty可以通过lua-resty-redis读取Redis中的Token、限流数据和路由规则,也可以通过lua-resty-mysql查询MySQL配置。
实际部署时,建议同时做好以下工作:
- 设置Redis和MySQL连接超时时间。
- 对连接失败和查询失败进行判断。
- 使用连接池减少重复连接。
- 高频数据优先使用
lua_shared_dict缓存。 - 避免使用MySQL
root账号。 - 不要在公开代码中直接暴露数据库密码。
相关阅读:
《OpenResty Lua 脚本入门:读取参数、请求头与返回响应》
《Linux安装OpenResty教程:替代Nginx并支持Lua脚本》
-
广告合作
-
QQ群号:4114653



