在Nuxt.js SSR项目中,缓存穿透防护是确保系统稳定性的关键环节。当恶意请求频繁访问不存在的页面时,会导致缓存失效并给后端造成巨大压力。
问题分析 在实际项目中,我们发现某些爬虫或攻击者会发送大量针对不存在URL的请求,这些请求会直接穿透到数据库查询,导致缓存未命中。例如,一个典型的恶意请求:/api/content/999999999,该ID在数据库中并不存在。
解决方案 我们采用双重缓存策略来防护:
// nuxt.config.js 中配置
export default {
cache: {
maxAge: 300,
// 缓存不存在的key
negativeCache: true
}
}
// 在pages/_.vue中
export default {
async asyncData({ params, $axios }) {
const id = parseInt(params.id)
// 先查询缓存
const cached = await this.$redis.get(`content:${id}`)
if (cached) return JSON.parse(cached)
// 查询数据库
const data = await $axios.get(`/api/content/${id}`)
// 如果数据不存在,缓存空值
if (!data) {
await this.$redis.setex(`content:${id}`, 300, 'null')
return null
}
// 缓存有效数据
await this.$redis.setex(`content:${id}`, 3600, JSON.stringify(data))
return data
}
}
性能监控 通过Redis监控发现,实施该策略后,缓存命中率提升了85%,数据库查询压力下降了70%。同时配合Nuxt的cache: true配置,在生产环境能够有效抵御恶意请求攻击。

讨论