跳到主要内容

Redis 缓存穿透、雪崩等问题

缓存穿透

缓存穿透,是指查询一个数据库一定不存在的数据。 正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

解决方案
  • 采用缓存空值的方式,如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短。
  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

缓存雪崩

缓存雪崩,是指在某一个时间段,缓存集中过期失效。 产生雪崩的原因之一,比如马上就要到双十一零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。

解决方案
  • 将缓存到期的时间岔开,不要在某个时间段集中到期。
  • 采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。尽可能的分散缓存过期时间。
  • 缓存标记,记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存。

缓存击穿

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案
  • 将爆款缓存设为永不过期。

参考文献