我前阵子帮一个朋友调服务器性能,他说加了缓存之后网站速度没提多少,还花了不少钱买额外资源,觉得缓存就是智商税。我一查才发现,网站缓存也讲命中率,不懂这个白做优化,他的缓存命中率才不到20%,等于缓存白加了,大部分请求还是直接回源,速度当然上不去。这不是个例,我见过好多做优化的朋友,上来就说我加了缓存啊怎么速度还是不行,十有八九都是命中率没过关,白忙活一场。

网站缓存也讲命中率的核心意义
说白了,缓存命中率就是「成功从缓存拿到资源的请求数」占「总请求数」的比例。比如100个用户请求里,有80个直接从缓存拿到了资源,那命中率就是80%。剩下20个得去源站拿,就是不命中,也叫回源。
很多人觉得只要加了缓存就完事了,根本不看命中率。其实缓存的作用全靠命中率撑着,命中率越低,缓存带来的收益就越小,甚至还会起反作用——你花了资源存缓存,结果大部分请求还是得回源,还要多走一层缓存处理的流程,反而更慢。我之前碰过一个做电商的朋友,为了冲活动加了三层缓存,结果活动一打开还是卡,后来一看命中率才15%,等于缓存根本没起作用,白堆了三层架构,还把服务器资源给占了不少。
影响缓存命中率的几个常见因素
第一个,缓存空间大小不够。我那个朋友就是,博客放了一千多张图片,缓存空间只开了100M,热门的几十张图片根本放不下,刚存进去就被冷门内容挤出去了,用户一打开还是得回源拿,命中率自然上不去。后来把缓存开到500M,热门图片都留住了,命中率一下就上去了。
第二个,缓存规则设置错了。该缓存的没缓存,不该缓存的乱缓存。比如很多人把css、js、图片这些静态资源没设置长期缓存,每次打开页面都重新请求,或者把带用户参数的动态页面瞎缓存,结果反而出问题,命中率还上不去。我之前见过有人把全站所有页面都设成1分钟过期,那天天访问的首页,一分钟就失效了,每次都得回源,这命中率能高吗?
第三个,缓存过期时间设置不合理。太短的话缓存频繁失效,不停回源,太长的话内容更新了用户看不到新内容,这个度得把握好。静态资源一般可以设长一点,比如几个月甚至一年,要是有更新改个文件名就行,不影响用户看新内容。动态内容就看更新频率,比如一小时或者一天,根据自己站点情况来。
怎么查看当前站点的缓存命中率
不同的缓存工具,查看方式不一样。比如用Nginx做反向代理缓存,可以开个status模块,就能看到实时的命中率数据了。用Redis做应用缓存的话,执行个info命令就能看到命中率统计。要是用CDN缓存,一般服务商后台都会有专门的统计面板,给你看缓存命中率和回源比例这些数据。具体怎么看还是以服务商或官方页面说明为准,反正不管用什么缓存,都能找到查看命中率的方法,别嫌麻烦,看一眼比你瞎调半天有用多了。
我一般调缓存优化,第一件事就是先看当前命中率是多少,有个 baseline 再调,不然调完了你都不知道有没有效果,纯粹靠感觉瞎蒙,这效率太低了。
提升缓存命中率的几个实用技巧
第一个,把热点内容留住,别让冷门内容占缓存空间。很多人不管三七二十一什么都往缓存里塞,结果缓存空间就那么大,冷门内容把地方占了,热门内容反而存不下,都被挤出去了,命中率自然低。你得想想你的站点哪些是用户经常访问的,哪些是很少有人看的,把经常访问的留住,少访问的别占地方,这样命中率一下就能上去。
第二个,分层设置缓存,别把所有内容都堆在一层。比如静态资源放CDN缓存,动态内容放服务器本地缓存,应用层还有一层缓存,分层处理之后,每层的命中率都会更高,回源压力也小,整体速度也就上去了。别想着一层缓存搞定所有,那太难了,分层之后各干各的,效率更高。
第三个,别乱缓存没用的内容。比如404页面、错误页面这些,根本没必要缓存,占地方不说,还拉低整体命中率。还有一些带用户身份信息的页面,也别乱全缓存,不然用户会看到别人的信息,出问题不说,命中率也虚高,没用。
我之前踩过一个坑,为了冲命中率,把所有页面都缓存了,结果命中率倒是冲到了90%多,但是用户每次打开都看到旧内容,更新了也看不到,反而被用户投诉,所以命中率不是越高就一定越好,得在正确的地方提命中率,不能为了数据瞎来。
其实缓存优化说难也不难,核心就是别忽略命中率这个东西。很多人做优化,上来就加缓存加架构,花了好多钱,结果速度没提多少,问题就出在命中率没跟上。花十分钟看看命中率,调两下缓存规则和空间大小,效果往往立竿见影。别不信,你下次优化完缓存可以去看看命中率,要是低于50%,那肯定还有优化空间,调完你就能看到网站速度实实在在提上来了,这比瞎忙活半天有用多了。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!