缓存穿透、缓存击穿、缓存雪崩、热点数据失效问题的解决方案
在我们的平常项目中多多少少会用到缓存,因为一些数据没必要每次查询都跑到数据库中查询。
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