缓存穿透导致接口被恶意刷爆,该怎么防?
最近上线了一个商品详情页,发现有些不存在的商品 ID 被频繁请求,直接打穿缓存压垮了数据库。我试过在 Vue 里加了个 loading 防重,但根本没用,因为人家是直接调接口的。
现在每次遇到无效 ID,后端还是会去查数据库然后返回空,感觉这就是典型的缓存穿透。有没有前端能配合做的防护?比如对无效 ID 也缓存一段时间?
<template>
<div v-if="product">{{ product.name }}</div>
<div v-else>加载中...</div>
</template>
<script>
export default {
async mounted() {
this.product = await fetch(/api/product/${this.$route.params.id}).then(r => r.json());
}
}
</script>
首先在后端加上布隆过滤器,对请求的商品ID先做个快速校验:
然后在后端接口里这样处理:
前端这边还是老老实实调用接口吧,别自己搞太复杂了。这个方案虽然不能完全避免恶意请求,但至少能保护数据库。唉,又要加班优化了...