缓存穿透

缓存穿透是什么

  • 一般情况下,先查询缓存redis是否有该条数据,缓存中没有时,再查询数据库。
  • 当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。
  • 缓存穿透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。

可以使用布隆过滤器解决缓存穿透的问题

  • 把已存在数据的key存在布隆过滤器,相当于redis前面挡着一个布隆过滤器。
  • 当有新的请求时,先到布隆过滤器中查询是否存在:
    (1)如果布隆过滤器中不存在该条数据则直接返回;
    (2)如果布隆过滤器中已存在,才去查询缓存redis,如果redis里没查询到则再查询MySQL数据库。

解决方案

方案1:空对象缓存或者缺省值

可能遇到的问题:黑客或者恶意攻击

黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。
(1) key相同打你系统
第一次打到MySQL,空对象缓存后第二次就返回defaultNull缺省值,避免mysql被攻击,不用再到数据库中去走一圈了。
(2) key不同打你系统
由于存在空对象缓存和缓存回写(看自己业务不限死),redis中的无关紧要的key也会越写越多(记得设置redis过期时间)

方案2:Google布隆过滤器Guava解决缓存穿透

(1)让布隆过滤器作白名单使用:
白名单里面有的才让通过,没有直接返回。但是存在误判,由于误判率很小,1%的打到MySQL,可以接受。
使用注意:
所有key都需要往redis和bloomfilter里面放入。
img
(2)让布隆过滤器作黑名单使用
例如:抖音防止推荐重复视频;饿了么防止推荐重复优惠券;推荐过的尽量别再重复推荐。
推荐时先去布隆过滤器判断:若是存在,说明早黑名单里面,已经推荐过不再重复推荐;若是不存在,就是新视频,推荐给用户并更新布隆过滤器,防止下次重复推荐。
img

posted @ 2025-05-28 16:52  小肚腩吖  阅读(11)  评论(0)    收藏  举报