记录一下那天晚上的排查过程。站点用 Redis 做整页缓存,键里带了 UA 分组。蜘蛛那一组因为访问稀疏,缓存一直不失效,日志显示它拿到的是 8 天前的首页,新发的文章在列表里根本没有。
刚开始盯着「首页列表缓存没有带版本号,内容更新后旧副本仍被命中」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。缓存键按 UA 分组,蜘蛛组的 TTL 被单独设成了七天。另一种情况是发布文章时只清了访客组的键,没有清蜘蛛组的键。
还有一种情况,发布钩子只清了列表页 详情页的缓存键没有动。
动手时先看蜘蛛组的缓存命中情况
redis-cli --scan --pattern 'page:bot:*' | head
发布时同时清理两组键
redis-cli del page:bot:home page:web:home
给缓存键加上内容版本号
key = 'page:' + group + ':home:v' + site_version
末了对比源站与缓存的内容差异
curl -s -A 'Baiduspider' https://www.example.com/ | grep -c '新文章标题'
改完先别撤,确认这几项。改成按版本号生成键后,蜘蛛拿到的首页当天就带上了新文,缓存命中率只下降了 3%,新文收录恢复到两小时内。
这里还有个坑。按 UA 分组的缓存最容易在蜘蛛这一组留下陈旧副本,键里带上版本号比事后手动清理可靠得多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
