Tech
[程序员] 记一次网站缓存排查:改完内容清了所有缓存,访客还是看到旧版
先说结论,可能不少人已经知道了:WordPress 挂了对象缓存和 CDN 之后,清缓存的顺序要从最里层往外——先 Redis ,再服务器整页缓存( Nginx FastCGI ),最后 CDN 。顺序反了,清了也白清。
我前阵子反复遇到一个场景:后台改完文章提示成功,前台打开还是旧内容。第一反应清缓存,一层两层三层全清一遍,还是旧的。加个 ?v=123 马上就新了,去掉参数又变回旧的。
折腾了一段时间才把链路想明白。
三层缓存各自的性格:
CDN:缓存整页 HTML ,按 URL 做键,有自己的 TTL
Nginx FastCGI cache:也是整页 HTML ,按 URL 做键,落在磁盘上
Redis 对象缓存:缓存的是数据库查询结果。注意,它默认没有 TTL ,写进去就一直躺着,直到被显式删掉
坑就藏在第 3 条里:
你改了文章,数据库里已经是新内容
Redis 里还是旧数据
这个时候有访客或者爬虫进来
PHP 从 Redis 捞到旧数据,渲染出一份"全新的旧页面",丢给 Nginx 缓存了起来
你事后去清缓存,就算把...
Read the full discussion on V2EX
This article was aggregated from V2EX. Click to join the conversation.
View on V2EX