元数据全部存于共享内存区keys_zone中,仅存储缓存键、状态码、访问与过期时间等轻量信息,不存响应体;每万key约占1–1.5mb,10mb可支撑约8万条记录。

Nginx 缓存层中,元数据不存响应体,只管“谁、何时、是否有效”——它被严格隔离在内存中,由 keys_zone 独立管理,和磁盘上存储的响应内容完全解耦。
元数据存在哪儿?怎么占内存?
- 全部存于共享内存区(
keys_zone=name:size),比如keys_zone=prod:50m表示分配 50MB 内存专用于元数据; - 这块内存不存 HTML、图片或 JSON 响应体,只存:缓存键(key)、HTTP 状态码、最后访问时间、过期时间、命中次数、锁状态等轻量信息;
- 容量估算有经验参考:每万 key 占用约 1–1.5MB,10MB 可支撑约 8 万条缓存记录。
元数据如何影响缓存行为?
- 命中判断靠它:Nginx 每次收到请求,先对
proxy_cache_key计算哈希,在 keys_zone 中快速比对是否存在对应元数据; - 过期控制靠它:
proxy_cache_valid 200 10m的生效依赖元数据中记录的生成时间与当前时间差; - 清理逻辑靠它:
inactive=4h是指该 key 对应的元数据若 4 小时内无访问,整个缓存条目(含磁盘文件)会被标记为可淘汰; - LRU 淘汰靠它:
max_size触发清理时,Nginx 查看元数据中的最后访问时间,优先删最久未用的条目。
常见配置误区提醒
- keys_zone 太小 → 元数据装不下,新缓存不断挤掉旧 key,命中率骤降;
- 忘设
proxy_cache_valid→ 即使响应进了磁盘,元数据里没有效期,Nginx 默认不缓存(尤其对 200 响应); -
use_temp_path=on(默认)→ 缓存文件先写临时路径再 mv,可能跨文件系统引发拷贝延迟,且元数据与文件状态短暂不一致;建议显式设为off。
本质上,元数据是缓存系统的“大脑”,磁盘只是“仓库”。脑子不清醒,仓库再大也白搭。











