缓存穿透问题的解决思路

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。这种情况下,我们可以采取两种常见的解决方案:

缓存空对象

当客户端访问不存在的数据时,我们的请求首先会到达Redis,但此时Redis中没有数据,因此会访问数据库。然而,数据库中也没有数据,这就导致了数据穿透缓存,直接打击到了数据库。我们知道,数据库能够承载的并发量不如Redis高,如果有大量的请求同时访问这种不存在的数据,这些请求就都会访问到数据库。为了解决这个问题,我们可以将这个不存在的数据存入到Redis中,即使这个数据在数据库中也不存在。这样,下次用户再访问这个不存在的数据时,就能在Redis中找到这个数据,避免了访问数据库。
优点:实现简单,维护方便
缺点:额外的内存消耗,可能造成短期的不一致

布隆过滤

布隆过滤器采用哈希思想来解决这个问题。它通过一个庞大的二进制数组,使用哈希思想判断当前要查询的数据是否存在。如果布隆过滤器判断数据存在,则放行,请求会去访问Redis。即使此时Redis中的数据过期了,但数据库中一定存在这个数据。在数据库中查询出这个数据后,再将其放入到Redis中。如果布隆过滤器判断这个数据不存在,则直接返回。
优点:内存占用较少,没有多余的key
缺点:实现复杂,存在误判可能。误判的原因在于,布隆过滤器使用的是哈希思想,只要使用哈希思想,就可能存在哈希冲突。
缓存穿透问题的解决思路_第1张图片

编码解决商品查询的缓存穿透问题:

在原来的逻辑中,如果发现数据在MySQL中不存在,我们直接返回404。这样会存在缓存穿透问题。现在的逻辑中,如果数据不存在,我们不会返回404,而是将这个数据写入到Redis中,并将value设置为空。当再次发起查询时,如果发现命中之后,我们判断这个value是否是null。如果是null,那么证明这是之前写入的数据,是缓存穿透数据。如果不是null,则直接返回数据。
缓存穿透问题的解决思路_第2张图片

小总结:

缓存穿透产生的原因是什么?

  • 用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力
    缓存穿透的解决方案有哪些?
  • 缓存null值
  • 布隆过滤
  • 增强id的复杂度,避免被猜测id规律
  • 做好数据的基础格式校验
  • 加强用户权限校验
  • 做好热点参数的限流

你可能感兴趣的:(redis,缓存)