首页开发教程OpenResty连接Redis和MySQL教程:读取缓存与查询数据库

OpenResty连接Redis和MySQL教程:读取缓存与查询数据库

2026-09-28 313

在使用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缓存。
  • 避免使用MySQLroot账号。
  • 不要在公开代码中直接暴露数据库密码。

相关阅读:

《OpenResty Lua 脚本入门:读取参数、请求头与返回响应》

《Linux安装OpenResty教程:替代Nginx并支持Lua脚本》

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

相关文章