极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。

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

Issue

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

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

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

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

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

Last Updated: 6/26/2022, 10:48:10 AM