全栈开发
redis
【Q385】什么是缓存穿透,如何解决

什么是缓存穿透,如何解决

Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 390 (opens in a new tab)

Author 回答者: shfshanyue (opens in a new tab)

当访问数据库中不存在的数据时,此时由于不恰当的缓存策略,每次查询都会穿透缓存打在数据库上,这样在高并发下可能造成缓存穿透,此时的解决方案:

  1. 当应用访问缓存不存在时,应用继续去访问数据库,即便数据库中不存在数据,此时应用再在缓存中把该值设为空,过期时间以短时间为主
  2. 使用过滤器做进一步的过滤,如redis 中的 bitmap 或 set,当不存在该值时,直接返回

Author 回答者: manondidi (opens in a new tab)

缓存穿透是指 在 redis缓存中 不存在, 同时数据库也不存在的情况, 一旦被黑客利用了, 通过频繁请求 击垮数据库 做法是加 redis和mysql之间加过滤器 在应用启动的时候 用布隆过滤器 将数据库中的值(如id)加载起来放在布隆过滤器中 布隆过滤器 有一定的误差 能判断出这个数据 一定在数据库中, 不能 判断这个数据一定不在数据库中, 他比set好处是 节约更多内存 以为他不是将数据完整的存下, 而是通过多次hash 标志某个位为1,有更高的效率

Author 回答者: wizardforcel (opens in a new tab)

要查询的数据在数据库不存在,并且 redis 中未设置特殊标志。导致每次都会查询数据库,造成大量开销。