赞
踩
缓存雪崩可以看成是一个原有缓存失效,新建缓存没有跟上,导致大量数据请求绕过缓存直接请求数据库
造成原因:首先设置了一个相同的过期时间,然后过一段时间出现大面积缓存失效。所有原本向缓存的数据请求都直接面向数据库,导致CPU和内存负载过大,从而造成数据库宕机。从而产生一系列连锁反应,导致系统崩溃。
解决方式:
通过设置锁或者队列,避免大量请求直接向数据库一次性读写。从而避免失效时大量的并发请求落到底层存储系统上。
错开缓存的失效时间
缓存穿透简单说就是发送一个无用的请求,在缓存里查不到数据,同时数据库里也不存在,从而返回一个空值。这样做就造成了两次无用查询。也相当于请求绕开了缓存直接访问数据库。
解决方式:
设置步隆过滤器,就是将所有无用的数据请求,都hash到一个bitmap中,存在一个无用数据请求就被bitmap拦截,从而避免了请求访问压力
如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库
步隆过滤器:是一个很长的二进制向量和一系列随机映射函数。用来检测某一值是否存在集合中。
其优点:
空间效率和查询时间都远远超过一般的算法
缺点:
有一定的误识别率和删除困难
其算法为Bloom-Filter,核心为利用不同Hash函数来解决冲突。Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减少冲突我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定
不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这便是Bloom-Filter的基本思想。
缓存击穿与缓存穿透不同的是,缓存不存在数据,但是数据库却存在数据(发生的情况一般都是热点数据缓存时间过期)。这就会导致大量请求在缓存里面找不到数据从而直接请求数据库。造成数据库压力过大
解决方式:
将热点数据缓存时间设置永不过期。
设置互斥锁,当一个请求拿到锁时,其他请求被阻塞,等待该请求完成再继续。
接口限流与熔断,降级。常用接口做好限流策略,防止用户恶意刷接口。同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制
缓存预热指将相关缓存数据直接加载到缓存系统。这样就可以让效率更快,不需要从数据库取到数据后,再到缓存中缓存该数据。
缓存更新:删错内存策略。当 缓存中请求量增多后,容易造成缓存里面数据量大。避免可用内存减少,于是就有了缓存更新这一个策略。但是在Redis中默认有6个删除策略。
缓存降级:当访问量增大后,系统出现了问题。就需要将一些不重要的服务进行降级操作。从而不影响到主服务的性能,且也不需要删除这些无用服务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。