openresty通过resty.redis模块实现nginx层直连redis,构建高性能多级缓存:先查共享字典,未命中则lua查询redis(需设超时、用set_keepalive复用连接、判ngx.null空值),再降级至后端。

OpenResty 通过内置的 resty.redis 模块,让 Lua 脚本能直接、高效地操作 Redis,是构建分布式缓存层的关键一环。它不依赖后端应用(如 Java),在 Nginx 请求入口处完成缓存读写,大幅降低下游压力。
引入模块并建立连接
在 Lua 脚本中加载官方 Redis 客户端模块,设置合理超时,并连接 Redis 实例:
- 使用
require("resty.redis")引入模块 - 调用
redis:new()创建客户端对象 - 用
set_timeouts(1000, 1000, 1000)分别设置连接、发送、读取超时(单位毫秒) - 调用
connect(ip, port)建立 TCP 连接;若 Redis 启用了密码认证,需紧接着调用auth("your_password")
连接复用:必须用 set_keepalive
每次请求都新建连接会触发频繁 TCP 握手,严重拖慢性能。OpenResty 的高性能依赖连接池管理:
- 操作完成后不要调用
close(),而应调用set_keepalive(60000, 100) - 第一个参数是连接空闲最大存活时间(毫秒),第二个是该池最大连接数
- 连接被放回池后,后续请求可直接复用,避免重复建连开销
封装通用缓存查询逻辑
为提升可维护性,建议将 Redis 查询封装成可复用函数,重点处理三种典型情况:
- 连接失败 → 记录错误日志,返回 nil,交由下游处理
- key 不存在 → Redis 返回
ngx.null(不是 Lua 的nil),需显式判断并跳过赋值 - 查询成功 → 将结果返回,并确保调用
set_keepalive归还连接
多级缓存协同工作流程
OpenResty 中的 Redis 操作通常嵌入到完整的多级缓存链路中:
- 先查 Nginx 共享字典(
lua_shared_dict),命中则直接响应 - 未命中则用 Lua 调用 Redis 查询,若命中,把数据写回 Nginx 字典并返回
- Redis 也未命中,再穿透到后端服务(如 MySQL),并将结果回填 Redis 和 Nginx 字典
- 整个过程无阻塞,依托 OpenResty 事件循环,支撑万级并发
不复杂但容易忽略:连接池配置、空值判断、密码认证、超时设置,这四点没处理好,缓存层反而成为故障源。











