Try Everything Different In My Life.

「🔨实践」缓存穿透(Redis)解决方案

2019.04.02

在使用缓存的过程中,遇到恶意访问不存在的数据,导致缓存失效,所有请求都落在数据库层,这在生产环境是不允许的

现象

比如我们在数据库中,没有id为1000的信息,但是一直伪造查询id为1000的数据信息,无论在缓存中还是数据库中都没有,那么每一次查询的时候都会把请求落在数据库层,如果有大量的这样的恶意请求,那么数据库负载将会很大,缓存完全失去保护数据库的效果,这种就叫做缓存穿透

解决方案

在面对缓存穿透的问题上一般有两种解决方案,分别是

  • 缓存空对象
  • 布隆过滤器

空对象

当第一次访问不存在的数据的时候,我们将这个查询缓存起来,最终指向一个空对象,下次再按照相同条件查询的时候,那么直接返回空对象。

但是在使用这种方式的时候,遇到大量的恶意访问的时候会产生大量的无效缓存。

布隆过滤器(推荐)

代码实现

空对象

布隆过滤器

Google Guava

总结

参考