数据库:缓存穿透、缓存击穿、缓存雪崩

1. 缓存穿透

1.1 描述

请求一个不存在于缓存中的数据,由于该数据在后端数据库中也不存在,会导致请求不断地穿透缓存,并造成频繁地请求数据库。造成缓存穿透的主要原因是黑客攻击恶意请求
注意和缓存击穿的区别:缓存穿透是指查询一个数据库一定不存在的数据

1.2 解决方案

  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,查询不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询压力。布隆过滤器的原理: 当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。查询时,将元素通过散列函数映射之后会得到k个点,如果这些点有任何一个0,则被检元素一定不在,直接返回;如果都是1,则查询元素很可能存在,就会去查询Redis和数据库。
  • 当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源。

2. 缓存击穿

2.1 描述

一个存在于缓存中的数据,在失效后,又恰好被大量请求访问,导致瞬间缓存失效,并导致请求全部落到后端数据库,就像在一个屏障上凿开了一个洞。造成缓存击穿的主要原因是缓存键过期时间设置不当或者缓存服务器故障。
注意和缓存穿透的区别:缓存击穿是指缓存中没有但数据库中有的数据。

2.2 解决方案

  • 设置热点数据永远不过期。
  • 加分布式锁,第一个请求的线程可以拿到锁,拿到锁的线程查询到了数据之后设置缓存,其他的线程获取锁失败会等待50ms然后重新到缓存取数据,这样便可以避免大量的请求落到数据库。

3. 缓存雪崩

3.1 描述

指在某个时间点,缓存中的大部分数据同时失效,导致大量请求涌入后端数据库,使数据库瞬间压力过大而崩溃。造成缓存雪崩的主要原因包括缓存服务器宕机、缓存键过期时间设置相同、缓存服务器故障等。

3.2 解决方案

拿电商项目来举例

  • 采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
  • 设置热点数据永远不过期。
  • 使用加锁限流的方式
  • 多级缓存
  • 缓存预热

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