业内人士都听说过缓存击穿与缓存雪崩。缓存击穿它是指某一key经常被用户特别关注经常被查询,而恰好此时间节点对Key有大量的并发请求过来,庞大数量的请求打到db,这些请求有坑你会直接击穿高速缓存,数据库的访问压力也会瞬间被击穿。缓存雪崩它是指缓存中的大量数据到了过期时间,这种巨大的数据导致了数据库压力过大,甚至down机。下面我们就来详细介绍一下缓存击穿和缓存雪崩。
一般来说,缓存穿透的场景发生在故意攻击的场景下;比如说,本来查询意见商品的序号是正数,但是请求方总是请求大量的负数过来,导致缓存无效,全部流量都打在了数据库中,如果某一时刻流量过大,则会导致数据库崩溃;缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。
一、缓存击穿:如果数据库中有缓存,CPU中有缓存,那么模拟真实数据的原因就更多了。我们应该避免在不需要缓存的情况下缓存和合理的模拟。在项目的实际开发和部署过程中,为了减轻db的压力,必须使用Nosql作为中间介质,以减少数据库的I/O操作,从而提高系统访问效率。作为最常用的缓存处理工具,Redis在使用过程中必须对缓存穿透、缓存击穿和缓存雪崩有详细的了解。高速缓存破坏是指key经常被查询,用户经常关注。正如熟客或key经常不访问一样,用户非常喜欢它。但是在这个时候,如果key在高速缓存到期时失效或者是冷门key,那么在这个时候突然出现了大量的访问请求,这就会导致大并发请求直接穿透高速缓存,请求数据库,瞬间增加访问数据库的压力。
归纳起来:缓存破坏有两个原因。
1、一个冷门key突然被大量用户要求访问。
2、一款热门key,缓存时间正好过期,此时有大量的用户访问。
我们的业务通常会经常访问几个数据,比如秒杀活动,这些频繁访问的数据被称为热点数据。如果缓存中的热点数据过期,此时需要大量访问热点数据,则无法从缓存中读取。如果直接访问数据库,数据库很容易被高并发性要求冲走,这就是缓存损坏的问题。有关缓存击穿的问题:我们常用的解决办法是加锁。在key过期时,在key想要查询数据库时添加一把锁,此时只能让第一个请求查询数据库,然后将从数据库中查询到的值存储在其他相同的key中,这样就可以直接从缓存中获得。
二、缓存雪崩:缓存雪崩是指当数据缓存到期时,大量的查询数据会导致数据库压力过大,甚至down机。不像缓存击穿,缓存击穿是指同一数据的并发查询,缓存雪崩是不同数据的过期时间,很多数据无法查询,从而查询数据库。
理由:
Redis突然停止了。
大部分数据无效。
举例来说,我们基本上都经历过购物狂欢,假办了23:00-24:00的商品骨折促销活动。程序小哥哥在23:00将商家骨折的商品放入缓存中,并通过redis的expire设置了一个小时的过期时间。在此期间,许多用户会访问这些商品信息、购买等。但正好在24:00时,碰巧有许多用户正在访问这些商品,此时访问这些商品就会落到数据库上,造成数据库承受着巨大的压力,稍有不慎就会直接导致数据库。
缓存雪崩有以下解决方案:
1、redis高度可用。
redis有可能挂掉,增加一些redis实例(一主多从或多主多从),这样一个挂掉之后其他的就可以继续工作了,实际上就是建立了一个集群。
2、限制流量降级。
缓存失效后,通过锁定或队列控制读取数据库中缓存的线程。在某些密钥中,只有一个线程可以查询数据和写入缓存,其他线程可以等待。
3、数据预热。
资料加热是指在正式部署之前,我会提前访问可能的数据,这样可能会将大量访问的数据加载到缓存中。在进行大并发访问之前,手动触发加载缓存。
4、不同的过期时间。
设定不同的过期时间,使缓存故障时间尽可能均匀。
以上我们分享了缓存击穿和缓存雪崩的详细介绍了。一般来讲我们设计一个缓存系统,必须考虑的问题就是缓存穿透,缓存击穿以及失效时的雪崩效应,如果您对相关知识感兴趣,可以继续关注中培教育。