缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题的解决方案

database

在我们的平常项目中多多少少会用到缓存,因为一些数据没必要每次查询都跑到数据库中查询。

1、缓存穿透 

       请求去查询一条不存在的数据,也就是缓存和数据库都查询不到这条数据,但每次请求都会打到数据库上去。

        这种查询不存在数据的现象我们称为: 缓存穿透

缓存穿透带来的问题

       试想 黑客对你的系统进行攻击,每次都拿不存在的 ID 去查询数据,会产生大量的请求,会导致数据库由于压力过大而宕机。

缓存穿透解决方案

       1)缓存空值:把空数据的key对应的值设置为 null 丢到 缓存中去,这样再查询可以返回 null 值。

       2) BloomFilter :类似于 hbase set 来判断某个元素(key)是否存在于某个集合中。 这种方案可以加在第一种方案中,在缓存之前在加一层 BloomFilter              在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。

2、缓存击穿

        在高并发的系统中,大量的请求同时查询一个 key 时,而这个 key 刚好 失效了,就会导致大量的请求打到 数据库中, 导致数据库压力倍增。

 缓存击穿带来的问题

         会造成某一时刻数据库请求量过大,压力剧增。

 缓存击穿如何解决

          上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。

3、缓存雪崩

         缓存雪崩的情况是说,当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面。结果就是DB 撑不            住,挂掉了。

   解决办法  

          事前 ​​​​​​​:

               使用集群缓存,保证缓存服务的高可用 ​​​​​​​

          事中:

                ehcache本地缓存 + Hystrix限流&降级,避免MySQL被打死

          事后:

                开启Redis持久化机制,尽快恢复缓存集群

4、解决热点数据集中失效

        我们在设置缓存的时候,一般会给缓存设置一个失效时间,过了这个时间,缓存就失效了。对于一些热点的数据来说,当缓存失效以后会存在大量的请            求过来,然后打到数据库去,从而可能导致数据库崩溃的情况。

   解决方案:

        1)、设置不同的失效时间

       2)、   互斥锁

以上是 缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题的解决方案 的全部内容, 来源链接: utcz.com/z/535128.html

回到顶部