在日常使用电脑或搭建服务时,很多人会遇到响应慢的问题。比如你开了个网站,本地测试飞快,但别人访问却卡顿。这时候,缓存系统是否高效就成了关键。而衡量缓存效率的一个核心指标就是缓存命中率。
什么是缓存命中率
简单来说,缓存命中率是指请求的数据中有多少是从缓存中直接读取的,而不是去后端(比如数据库或源服务器)重新拉取。命中率越高,说明缓存越有效,服务器压力也越小。比如10次请求里有8次用了缓存,命中率就是80%。
Nginx 中查看缓存命中率
如果你用 Nginx 做反向代理或静态资源服务,可以通过配置日志来判断每次请求是否命中缓存。先确保你的 Nginx 配置了缓存和日志变量:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
}
重启 Nginx 后,每次请求的响应头里就会带上 X-Cache-Status 字段。值可能是:
HIT:命中缓存MISS:未命中,数据从后端获取EXPIRED:缓存过期,需要回源刷新BYPASS:绕过缓存,直接请求源站
通过浏览器开发者工具或命令行 curl 查看响应头,就能知道当前请求有没有走缓存。
用日志统计整体命中率
想看一段时间内的整体命中情况,可以分析 Nginx 的访问日志。假设你在 log_format 中加入了 $upstream_cache_status:
log_format cache '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $upstream_cache_status';
保存日志后,用 shell 命令快速统计:
awk '{print $NF}' access.log | sort | uniq -c
输出类似:
1200 HIT
300 MISS
50 EXPIRED
算一下就知道命中率大约是 1200 / (1200+300+50) ≈ 77.4%。
CDN 或浏览器缓存也能看
如果你用了 CDN 服务,像 Cloudflare、阿里云 CDN,后台一般都有命中率监控面板。直接登录就能看到图形化数据。浏览器这边,F12 打开 Network 标签,看资源请求的 Size 一栏:如果显示 memory cache 或 disk cache,说明没发网络请求,属于命中。
缓存命中率不是一成不变的,内容更新频率、缓存策略设置、用户访问模式都会影响它。定期检查这个指标,能帮你及时发现性能瓶颈,比如突然大量 MISS 可能是缓存被清空或者 key 设置不合理。