Nginx不直接将Redis作为proxy_cache后端,而是通过智能路由协同Redis构建分布式缓存:Nginx负责请求解析、本地轻量缓存及转发,Redis承担共享数据存储;推荐架构为Nginx→应用层→Redis,进阶方案可用OpenResty+Lua直连Redis。

Nginx 本身不直接把 Redis 当作它的 proxy_cache 后端,它原生的 proxy_cache 是基于本地磁盘的。但“用 Redis 配合 Nginx 实现分布式缓存架构”这个目标,核心不是让 Nginx 存储缓存到 Redis,而是让 Nginx 智能路由 + 协同访问 Redis,从而构建高命中、可伸缩、故障隔离的缓存层。关键在于角色分工:Nginx 做请求分发与轻量缓存,Redis 做统一数据存储与共享缓存。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
下面从三个实用角度讲清楚怎么做:
明确分工:Nginx 和 Redis 各自该干什么
– Nginx 负责:
• 接收请求、解析 URI/参数/Headers
• 做最外层的轻量缓存(如热点 HTML、静态资源),用 proxy_cache 存本地磁盘,响应极快但容量有限
• 对未命中的请求,按规则(比如一致性哈希)转发到后端服务集群(如 PHP/Node 应用),而不是直接连 Redis
• 可选:通过 OpenResty + Lua 模块(lua-resty-redis)绕过应用层,直连 Redis 读写 —— 这适合简单键值场景(如页面级缓存)
– Redis 负责:
• 作为全量、共享、内存级缓存中心,存放业务数据(商品详情、用户信息、API 响应等)
• 支持复杂数据结构(Hash/List)、过期策略、持久化和集群扩展
• 不由 Nginx 直接填充,而是由后端应用在回源时写入,或由定时任务预热
推荐架构:Nginx → 应用层 → Redis(标准可靠路径)
这是生产环境最常用、最易维护的方式:
1. 用户请求到达 Nginx
2. Nginx 先查本地 proxy_cache(例如对 /product/123 缓存 30 秒)→ 命中则直接返回
3. 未命中,则转发给 upstream(如 PHP-FPM 或 Java 应用)
4. 应用收到请求后:
• 先查本机连接的 Redis(可用连接池)
• 若 Redis 有数据,组装响应并返回给 Nginx
• 若无,则查 MySQL,写入 Redis(带合理 TTL),再返回
5. 整个链路清晰,缓存逻辑在应用层可控,Redis 故障时应用可降级回源
进阶方案:Nginx 直连 Redis(OpenResty + Lua)
适合对延迟极度敏感、逻辑简单的缓存场景(如首页 HTML、配置项):
• 安装 OpenResty(含 Lua 环境和 lua-resty-redis)
• 在 location 中用 Lua 脚本:
– 构造 cache key(如 ngx.md5(ngx.var.uri .. ngx.var.args))
– 调用 redis:get(key) 尝试获取
– 命中则 ngx.header.content_type = "text/html" 并输出
– 未命中则 proxy_pass 到后端,并在后端返回后由 Lua 写入 Redis(需注意并发写)
• 注意:
– 需实现 Redis 连接池(避免每次新建连接)
– 大响应体建议压缩后再存 Redis(用 lua-zlib)
– 不适合复杂业务逻辑(如权限校验、多 key 聚合),仍应交给应用层

















